快速搭建专属域名邮箱服务,简单整合邮箱消息推送功能至 Spring Boot 应用程序

grtsinry43
1/2/2025(更新于 1/28/2025
70 views
预计阅读时长 15 分钟

作为即时通信的重要方式,邮件在互联网互动中起到举足轻重的作用,而搭建邮件推送服务不仅可以做到实时的消息交流,更能拉近网站与用户的距离,增加用户粘性,本文将介绍获取域名邮箱,启用 smtp,集成后端,实现推送的全过程,带你让网站“活起来”。

搭建域名邮箱服务

感谢 @miaoer

@Innei
静かな森 - 致虚极,守静笃。
静かな森
大佬提供的快捷解决方案,节省折腾 Postfix 和 Dovecot 的精力,不过后续也会更新服务器手动搭建邮件首发服务的详细步骤(等期末之后有精力写详细文档,步骤还是挺复杂的)

这里我们选择 Lark(飞书国际版,国内版的操作类似,只是多了实名步骤)提供的邮箱服务

获取邮箱

我们可以使用邮箱或者 Google 帐号注册并创建企业(个人就是 1-50 人企业选项),注册完成后,我们需要为当前登录帐号分配邮箱:

进入 企业管理页面

,点击上方产品设置,找到邮箱,在域名管理中即可为自己的邮箱指定域。

邮箱管理

添加自定义地址

按照要求填写并前往对应的 DNS 提供商管理面板添加解析记录,我们便成功获取到了域名邮箱。

设置DNS记录

随后我们返回企业管理——组织架构——成员与部门,为自己的登录账户添加企业邮箱,由此便可以通过网页直接收发邮件

设置 smtp

依然是管理面板——产品设置——邮箱,这次我们找到左面的地址管理——公共邮箱,我们便可以创建支持 smtp 的公共推送地址

获取SMTP

整合至后端程序

条件具备,回到主线。

整合依赖

我们这里使用的是 Spring 提供的 spring-boot-starter-mail

,在 pom.xml 中添加以下依赖:

XML
1<!--邮箱服务-->
2        <dependency>
3            <groupId>org.springframework.boot</groupId>
4            <artifactId>spring-boot-starter-mail</artifactId>
5            <version>3.4.1</version>
6        </dependency>

随后在 application.xml 中添加好对应的配置:

XML
1spring:
2  mail:
3    host: smtp.larksuite.com
4    port: 587
5    username: name@domain.com
6    password: your_password
7    properties:
8      mail.smtp.auth: true
9      mail.smtp.starttls.enable: true
10      mail.smtp.starttls.required: true
11    default-encoding: UTF-8

创建服务

我们先以最小可行性思想来完成这个实验,先创建基础的 EmailService.java

JAVA
1package com.grtsinry43.grtblog.service;
2
3import org.springframework.mail.SimpleMailMessage;
4import org.springframework.mail.javamail.JavaMailSender;
5import org.springframework.stereotype.Service;
6
7/**
8 * @author grtsinry43
9 * @date 2025/1/1 23:04
10 * @description 热爱可抵岁月漫长
11 */
12@Service
13public class EmailService {
14    private final JavaMailSender mailSender;
15
16    public EmailService(JavaMailSender mailSender) {
17        this.mailSender = mailSender;
18    }
19
20    public void sendEmail(String to, String subject, String content) {
21        SimpleMailMessage message = new SimpleMailMessage();
22        message.setFrom("name@domain.com");
23        message.setTo(to);
24        message.setSubject(subject);
25        message.setText(content);
26        mailSender.send(message);
27    }
28}

额,就这么简单,是不是很 ruozhi

邮件模板

当然,我们给用户展示的不可能是简单的一点点文字而已吧,所以我们需要自定义邮件的样式,由于其支持使用 html,那我们便可以利用模板引擎 thymeleaf 来快速创建模板,添加如下依赖:

XML
1<!--模板支持-->
2        <dependency>
3            <groupId>org.springframework.boot</groupId>
4            <artifactId>spring-boot-starter-thymeleaf</artifactId>
5        </dependency>

我们在 src/main/resources/templates 中新建 emailTemplate.html,这样我们便可以使用模板语法将内容填充进我们的邮件啦,利用 org.thymeleaf.context.Context;,也就是创建上下文,由模板引擎提供,在 html 生成时消费,语法大概是 th:text="${type} 这种,你也可以参考下我的:

HTML
1<!DOCTYPE html>
2<html lang="en">
3    <head>
4        <meta charset="UTF-8">
5        <meta name="viewport" content="width=device-width, initial-scale=1.0">
6        <title>Comment Reply Notification</title>
7        <style>
8            /*太多了,这里省略了*/
9        </style>
10    </head>
11    <body>
12        <div class="bg-container">
13            <div class="main-container">
14                <div class="header">
15                    <img src="https://dogeoss.grtsinry43.com/img/author.jpeg" alt="Logo">
16                    <h1>Grtsinry43's Blog | 邮件通知 </h1>
17                </div>
18                <div class="content">
19                    <h2 style="font-size: medium"> 亲爱的朋友 <span th:text="${name}"></span>, 您在
20                        <span th:text="${type}"></span>21                        <span th:text="${title}"></span>」的评论收到了新的回复哇 </h2>
22                    <div class="user-info">
23                        <img class="user-avatar" th:src="${avatarUrl}" alt="Logo">
24                        <div style="margin-left: 10px"><span th:text="${replyName}"></span><span
25                                th:text="${replyTime}"></span> 回复了您的评论
26                        </div>
27                    </div>
28                    <div style="margin-top: 10px">
29                        <span th:utext="${replyContent}"></span>
30                    </div>
31                    <div>
32                        <span> 您的原评论内容:</span>
33                        <div style="margin-top: 10px">
34                            <span th:utext="${commentContent}"></span>
35                        </div>
36                    </div>
37                    <div class="action-container">
38                        <a class="more-button" th:href="${url}">
39                            点击查看详情
40                        </a>
41                    </div>
42                </div>
43                <div class="footer">
44                    <p>Powered by Grtblog. 此邮件由系统自动发出,请勿回复。</p>
45                    <p>Copyright &copy; 2022-2025 Grtsinry43's Blog. All rights reserved.</p>
46                    <p><a href="https://blog.grtsinry43.com"> 前往主站 </a></p>
47                </div>
48            </div>
49        </div>
50    </body>
51</html>

这里我选择在发送邮件的方法中添加一个HashMap作为参数,传递所需的上下文,也就是这样:

JAVA
1package com.grtsinry43.grtblog.service;
2
3import jakarta.mail.MessagingException;
4import jakarta.mail.internet.MimeMessage;
5import org.springframework.mail.SimpleMailMessage;
6import org.springframework.mail.javamail.JavaMailSender;
7import org.springframework.mail.javamail.MimeMessageHelper;
8import org.springframework.scheduling.annotation.Async;
9import org.springframework.stereotype.Service;
10import org.thymeleaf.TemplateEngine;
11import org.thymeleaf.context.Context;
12
13import java.util.HashMap;
14
15/**
16 * @author grtsinry43
17 * @date 2025/1/1 23:04
18 * @description 热爱可抵岁月漫长
19 */
20@Service
21public class EmailService {
22    private final JavaMailSender mailSender;
23    private final TemplateEngine templateEngine;
24
25    public EmailService(JavaMailSender mailSender, TemplateEngine templateEngine) {
26        this.mailSender = mailSender;
27        this.templateEngine = templateEngine;
28    }
29
30    @Async
31    public void sendEmail(String to, String subject, HashMap<String,String> info) throws MessagingException {
32        MimeMessage message = mailSender.createMimeMessage();
33        MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
34
35        Context context = new Context();
36        context.setVariable("name", info.getOrDefault("name", " "));
37        context.setVariable("type", info.getOrDefault("type", " "));
38        // ... 这里都是设置上下文咯
39        String html = templateEngine.process("emailTemplate", context);
40
41        helper.setFrom("notification@grtsinry43.com");
42        helper.setTo(to);
43        helper.setSubject(subject);
44        helper.setText(html, true);
45
46        mailSender.send(message);
47
48        System.out.println("邮件发送成功" + to);
49    }
50}
51

Tip!这里还有一个小问题,邮件发送是花费时间很长的时间,如果同步进行会严重阻塞业务,这里采用异步模式,你也可以配合日志记录来追溯所有的邮件发送记录

结果

最后的效果大约是这样的,你可以在任意需要的场景触发,或是自定义邮件的内容,任你喜欢!

最后效果

相关推荐

学习分享|跨域解决、安卓开发探索、油猴脚本探索

最近学习的一些内容,包括跨域问题及其解决方案,安卓开发的简单探索,OpenAI的api做了个小插...

grtsinry43
6/10/2024
35
0
0

使用 BeautifulSoup 配合请求库实现简单的爬虫程序

事情起源于课内的课程实验作业...因为要求要用爬虫,~~不必说课内讲的一言难尽,更不必说就算讲了我也...

grtsinry43
1/7/2025
67
0
0

使用 pf4j-spring 实现插件注入和 api 接口动态注册 | 插件系统构建(上)

哪个男孩不想拥有一个自己的插件系统?(x)话说回来,这个我已经计划好久了,不过一直在学其他的东西,刚...

grtsinry43
1/26/2025
40
0
0

用一个月的时间写一个自己的博客系统——Grtblog的技术介绍

终于,历时一个多月的开发 ~~bug~~ 和测试,这个目前问题很多很不成熟很难用的系统终于上线了.....

grtsinry43
12/14/2024
117
4
0

折腾记录|使用 Nuxt.js 重写个人主页,使用 SSR 优化 SEO ,实现一些期待已久的效果

在 22 年刚创建个人主页的时候,由于我的技术水平不够,只能用一些 wordpress type...

grtsinry43
9/19/2024
24
0
0
COMMENT 7280575485325742080

发表评论

登录之后评论体验更好哦 ~
支持 Markdown 语法 0 / 3000

在风雨飘摇之中

本站已运行了

一路走来,感谢陪伴与支持

愿我们不负热爱,继续前行

全站通知
更新通知