我们在开发中通常会使用邮件方式进行告警,传统的邮件发送整合起来较为繁琐,因此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服务,具体的步骤如下:
在开启 POP3/SMTP 服务的过程中,需要根据引导发送短信,当操作完成之后,我们会获取到一个发送邮件授权码,这个授权码需要保存下来,以便在应用中进行配置(配置项为 spring.mail.password )
基础配置完成,我们就可以编写代码进行邮件发送的测试。
在项目中编写一个邮件发送类,并标记为一个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文档拼接的正确性,邮件发送成功后,在邮箱客户端我们就能看到
渲染后的样式。虽然有一定的工作量,不过能够解决问题就是我们的直接目的。
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。