转载

SpringBoot之整合邮件发送功能

我们在开发中通常会使用邮件方式进行告警,传统的邮件发送整合起来较为繁琐,因此Spring Boot提供了一套更为简洁易用的整合方案,对Java Mail进行了封装,能够让业务更快的具备邮件发送能力。

本文主要讲解如何为Spring Boot应用添加邮件发送能力。

依赖引入

首先还是要有一个Spring Boot应用,这个就不再赘述了。在maven中央仓库搜索Spring Boot邮件发送模块,将坐标添加到项目的pom下。(这里以2.2.1RELEASE举例)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

进行配置

Spring Boot强调约定优于配置,因此我们需要进行必要的配置。在application.properties中添加以下配置:(这里以qq邮箱举例)

########################################################################
#
#     邮件配置
#
#########################################################################
# 邮件发送smtp服务域名
spring.mail.host=smtp.qq.com
# 发送账号
spring.mail.username=你的qq邮箱
# 发送授权码
spring.mail.password=发送授权码
# 邮件编码格式
spring.mail.default-encoding=UTF-8
# 是否进行认证
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# smtp服务端口
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.port = 465
spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
spring.mail.properties.mail.smtp.socketFactory.fallback = false

smtp服务域名在linux下可能会有无法解析的问题,只需要将域名更换为ip地址即可。具体的做法是在命令行中通过ping命令来获取并替换即可。

使用这个配置前需要在自己的qq邮箱中开通smtp服务,具体的步骤如下:

  1. 首先登陆qq邮箱,点击顶部的导航栏的 “设置” 按钮
  2. 进入设置选项页面,在账户选项卡下方找到 POP3/SMTP 服务,单机后方的“开启”按钮,将功能开放。

在开启 POP3/SMTP 服务的过程中,需要根据引导发送短信,当操作完成之后,我们会获取到一个发送邮件授权码,这个授权码需要保存下来,以便在应用中进行配置(配置项为 spring.mail.password

  1. 当获取到授权码之后,发送前的准备工作就基本完成。

编写代码

基础配置完成,我们就可以编写代码进行邮件发送的测试。

在项目中编写一个邮件发送类,并标记为一个Spring的Bean。

@Component
public class MailSenderClient {

    private static final Logger LOGGER = LoggerFactory.getLogger(MailSender.class);

    @Autowired
    JavaMailSender javaMailSender;

    public void sendSimpleMail(MailEntity mailEntity) {
        // 组装邮件发送实体
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(mailEntity.getFrom());
        simpleMailMessage.setTo(mailEntity.getTo());
        simpleMailMessage.setCc(mailEntity.getCc());
        simpleMailMessage.setSubject(mailEntity.getSubject());
        simpleMailMessage.setText(mailEntity.getContent());
        javaMailSender.send(simpleMailMessage);
        LOGGER.info("邮件发送完成: mailEntity={}", JSON.toJSONString(mailEntity));
    }

    /**
     * 邮件发送实体
     */
    public static class MailEntity {
        // 发件人
        private String from;
        // 收件人
        private String to;
        // 抄送
        private String cc;
        // 邮件主题(标题)
        private String subject;
        // 邮件正文,如果正文是HTML则需要手动拼接
        private String content;

        ...省略getter setter...
    }
}

核心逻辑很简单,我们要做的就是将JavaMailSender注入到发送邮件的bean中,构造一个SimpleMailMessage,设置发件人、收件人、抄送者(为空表示不抄送)、邮件主题、邮件正文,通过 javaMailSender.send(simpleMailMessage); 方法将邮件发送出去即可。

具体的调用方式如下,我们只需要通过这种方式,在需要进行邮件发送的地方如此调用即可。

@Test
public void testSendMail() {
    MailSenderClient.MailEntity mailEntity = new MailSenderClient.MailEntity();
    mailEntity.setFrom("121xxxx591@qq.com")
            .setTo("xxxx@xxxx.com")
            .setCc("122xxxx121@xxxxxx.com")
            .setSubject("文件内容为空,请关注!")
            .setContent("截止到当前时间,分析结果文本中内容为空,请关注!");
    mailSender.sendSimpleMail(mailEntity);
}

运行该测试用例,查看控制台日志(由于在配置中设置了开启debug,因此能够看到详细的握手报文)。

......
DEBUG SMTP: connected to host "smtp.qq.com", port: 465
EHLO 10.3.4.197
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
......
DEBUG SMTP: STARTTLS requested but already using SSL
DEBUG SMTP: protocolConnect login, host=smtp.qq.com, user=xxxxx@qq.com, password=<non-null>
......
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<xxxxx@qq.com>
250 Ok
RCPT TO:<xxxxx@xxxx.com>
250 Ok
RCPT TO:<xxxxxxxx@xxxxxx.com>
250 Ok
DEBUG SMTP: Verified Addresses
......
DATA
354 End data with <CR><LF>.<CR><LF>
Date: Wed, 11 Dec 2019 11:11:08 +0800 (CST)
From: xxxxxx@qq.com
To: xxxxxxx@xxxx.com
Cc: xxxxxx@xxxxx.com
Message-ID: <1117448897.0.1576033868771@[10.3.4.197]>
Subject: =?UTF-8?B?5o6o6I2Q5rGg5paH5Lu25YaF5a655Li656m677yM6K+35YWz5rOoIQ==?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
......
.
250 Ok: queued as 
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 Bye
......

这就表明邮件发送成功,我们要做的就是打开邮箱进行查看即可。

补充

到此我们就完成了Spring Boot对邮件发送功能的整合。需要补充的是,很多情况下,我们发送的邮件正文是具备一定格式的,

本文讲解的案例则是简单的文本格式邮件正文,实际上,文章中讲解的方式也是能够支持HTML内容发送的,我们要做的就是在

邮件发送的正文中,手动的拼接html文档,只要能够保证html文档拼接的正确性,邮件发送成功后,在邮箱客户端我们就能看到

渲染后的样式。虽然有一定的工作量,不过能够解决问题就是我们的直接目的。

版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

原文  http://wuwenliang.net/2019/12/11/SpringBoot之整合邮件发送功能/
正文到此结束
Loading...