最早我们发邮件的时候是使用 JavaMail 来发送邮件,而在 Spring Boot 中, Spring Boot 帮我们将 JavaMail 封装好了,是可以直接拿来使用的。 1. 依赖文件 pom.xml 代码清单:spring-boot-mail/pom.xml *** org.springframework.boot spring-boot-starter-mail org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-test test spring-boot-starter-thymeleaf 引入这个模版引擎是因为我们在发送邮件的时候,各种格式使用 HTML 的方式更容易实现,同样我们也可以使用 freeMark , Spring Boot 同样为我们提供了依赖包。 2. 配置文件 application.yml 代码清单: *** server: port: 8080 spring: application: name: spring-boot-mail mail: host: smtp.qq.com username: 136736247 password: xxxxxx default-encoding: UTF-8 fromAddr: 136736247@qq.com nickName: inwsy 这里我使用 QQ 邮箱作为邮件的发送方,其中的 password 并不是我们的 QQ 密码,这个密码需要我们在 QQ 邮箱的设置里面自己申请的。如下图: 其中的 spring.mail.fromAddr 和 spring.mail.nickName 这两个配置是我自己配置的,并不是官方的配置,后续我会在代码中读这两个配置项。 3. 简易邮件发送 3.1 实现类 代码清单:spring-boot-mail/src/main/java/com/springboot/springbootmail/service/impl/MailServiceImpl.java *** @Service public class MailServiceImpl implements MailService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private JavaMailSender javaMailSender; @Value("${spring.mail.fromAddr}") private String from; @Value("${spring.mail.nickName}") private String nickName; @Override public void sendSimpleEmail(String to, String subject, String content) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setFrom(nickName + "<" + from + ">"); simpleMailMessage.setTo(to); simpleMailMessage.setSubject(subject); simpleMailMessage.setText(content); try{ javaMailSender.send(simpleMailMessage); logger.info("简易邮件发送成功"); } catch(Exception e) { logger.error("简易邮件发送异常", e); } } } 3.2 测试类 代码清单:spring-boot-mail/src/test/java/com/springboot/springbootmail/SpringBootMailApplicationTests.java *** @Autowired MailService mailService; @Test public void sendSimpleEmail() { mailService.sendSimpleEmail("inwsy@hotmail.com", "测试邮件题目", "测试邮件内容"); } 这里邮件发送至本人的 Hotmail 邮箱。 4. 发送 HTML 格式的邮件 4.1 实现类 代码清单:spring-boot-mail/src/main/java/com/springboot/springbootmail/service/impl/MailServiceImpl.java *** @Override public void sendHTMLEmail(String to, String subject, String content) { MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true); messageHelper.setFrom(new InternetAddress(from, nickName, "UTF-8")); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(content, true); javaMailSender.send(message); logger.info("HTML 模版邮件发送成功"); } catch (MessagingException e) { logger.error("HTML 模版邮件发送失败", e); } catch (UnsupportedEncodingException e) { logger.error("收件地址编码异常", e); } } 4.2 页面模版 代码清单:spring-boot-mail/src/main/resources/templates/email.html *** 邮件模版 这是邮件模版生成的邮件,可以点击链接查看详情。 查看详情。 当前的Code为: 这里添加了动态内容 code ,在日常的开发中,我们使用发送验证码,动态生成内容是很有必要的。 4.3 测试类 代码清单:spring-boot-mail/src/test/java/com/springboot/springbootmail/SpringBootMailApplicationTests.java *** @Test public void sendHTMLTemplateMail() { Context context = new Context(); context.setVariable("code", "123456"); String emailHTMLContent = templateEngine.process("email", context); mailService.sendHTMLEmail("inwsy@hotmail.com", "测试 HTML 模版邮件", emailHTMLContent); } 5. 发送带附件的邮件 5.1 实现类 代码清单:spring-boot-mail/src/main/java/com/springboot/springbootmail/service/impl/MailServiceImpl.java *** @Override public void sendAttachmentsMail(String to, String subject, String content, String fileName, String filePath) { MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true); messageHelper.setFrom(new InternetAddress(from, nickName, "UTF-8")); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(content, true); FileSystemResource file = new FileSystemResource(new File(filePath)); messageHelper.addAttachment(fileName, file); javaMailSender.send(message); logger.info("带附件邮件发送成功"); } catch (MessagingException e) { logger.error("带附件邮件发送失败", e); } catch (UnsupportedEncodingException e) { logger.error("收件地址编码异常", e); } } 注意: 如果需要发送多个附件,写多个 messageHelper.addAttachment(fileName, file); 即可。 5.2 测试类 代码清单:spring-boot-mail/src/test/java/com/springboot/springbootmail/SpringBootMailApplicationTests.java *** @Test public void sendAttachmentsMail() { String fileName = "图片.jpg"; String filePath = "C:\\Users\\inwsy\\Downloads\\0370279582fe3e2a8012060c896a5dd.jpg"; mailService.sendAttachmentsMail("inwsy@hotmail.com", "测试带附件的邮件", "详细请查阅附件", fileName, filePath); } 6. 小结 在实际的开发过程中,邮件发送失败是一件比较经常出现的事情,比如:网络堵塞、对方拒收等情况,一般在邮件系统的设计中,可以先将要发送的数据写入数据中,等发送完成后再修改标记位,再增加一个保障机制,例如增加一个定时任务,将一段时间内,发送失败并重试次数小于一定阀值的内容再次进行发送,如果邮件系统的压力过大,可以选择使用异步的方式来进行发送,比如使用消息队列进行承压。 7. 示例代码 示例代码-Github 示例代码-Gitee 7. 参考 http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html 扫描二维码关注「极客挖掘机」公众号! 作者:极客挖掘机 定期发表作者的思考:技术、产品、运营、自我提升等。 本文版权归作者极客挖掘机和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果您觉得作者的文章对您有帮助,就来作者个人小站逛逛吧:极客挖掘机 分类: java, springboot 好文要顶 关注我 收藏该文 极客挖掘机 关注 - 2 粉丝 - 201 +加关注 1 0 « 上一篇: Spring Boot (十一): Spring Boot 定时任务 » 下一篇: Spring Boot (十三): Spring Boot 整合 RabbitMQ posted @ 2019-10-14 08:43 极客挖掘机 阅读(263) 评论(0) 编辑 收藏 https://www.cnblogs.com/babycomeon/p/11669486.html