邮件发送业务,是很多公司都有的,本博客介绍一下基于SpringBoot的邮件发送功能,邮箱服务基于腾讯QQ邮箱
SpringBoot的肯定有很多场景启动器starter,SpringBoot官方提供了spring-boot-starter-mail作为邮件服务的场景启动器
创建一个SpringBoot Initialize项目,详情可以参考我之前博客: SpringBoot系列之快速创建项目教程
配置spring-boot-starter-mail:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 复制代码
配置Thymeleaf模板引擎
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 复制代码
lombok,非必须,只是不想写bean类的set,get
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> 复制代码
新建application.yml,注意password在QQ邮箱里不是邮箱密码,需要去申请SMTP服务给的secret
spring: mail: host: smtp.qq.com username: your_emial@qq.com password: cmlebzqdtvejdibe default-encoding: utf-8 复制代码
向腾讯申请secret:
网易163邮箱的配置:
spring: mail: host: smtp.163.com username: your163account@163.com password: your163password default-encoding: utf-8 复制代码
Email DTO类:
package com.example.springboot.email.bean; import lombok.Data; /** * <pre> * EmailDto * </pre> * * <pre> * @author mazq * 修改记录 * 修改后版本: 修改人: 修改日期: 2020/07/22 16:26 修改内容: * </pre> */ @Data public class EmailDto { /** * 发送对象 */ private String sendTo; /** * 发送主题 */ private String subject; /** * 邮件内容 */ private String content; /** * 发起对象 */ private String sendFrom; /** * 附件路径数组 */ private String[] filePaths; /** * 内嵌图片ID */ private String inlineImgId; /** * 内嵌图片路径 */ private String inlineImgPath; } 复制代码
新建EmailService类:
@Autowired MailProperties mailProperties; @Autowired JavaMailSender javaMailSender; /** * 发送文本邮件 * @Author mazq * @Date 2020/07/22 16:31 * @Param [email] * @return */ public void sendTextMail(EmailDto email) { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(email.getSendTo()); mailMessage.setSubject(email.getSubject()); mailMessage.setText(email.getContent()); mailMessage.setFrom(mailProperties.getUsername()); javaMailSender.send(mailMessage); } 复制代码
junit测试:
@Test void testSendTextMail(){ EmailDto emailDto = new EmailDto(); emailDto.setSendTo("your_email@qq.com"); emailDto.setSubject("发送文本邮件"); emailDto.setContent("测试发送文本邮件!"); emailService.sendTextMail(emailDto); } 复制代码
/** * 发送Html邮件 * @Author mazq * @Date 2020/07/22 16:31 * @Param [email] * @return */ public void sendHtmlMail(EmailDto email) throws MessagingException { MimeMessage mailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true); messageHelper.setTo(email.getSendTo()); messageHelper.setSubject(email.getSubject()); messageHelper.setText(email.getContent(),true); messageHelper.setFrom(mailProperties.getUsername()); javaMailSender.send(mailMessage); } 复制代码
Junit测试:
@Test void testSendHtmlMail() throws MessagingException { EmailDto emailDto = new EmailDto(); emailDto.setSendTo("your_email@qq.com"); emailDto.setSubject("发送html邮件"); String html = "<html><head><title>email</title></head><body><h1>测试发送html邮件</h1></body></html>"; emailDto.setContent(html); emailService.sendHtmlMail(emailDto); } 复制代码
2.5介绍了发送html格式的邮件,如果html里要加上图片?具体实现请看下文:
/** * 发送html内嵌图片邮件 * @Author mazq * @Date 2020/07/22 16:31 * @Param [email] * @return */ public void sendInLineImgMail(EmailDto email) throws MessagingException { MimeMessage mailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true); messageHelper.setTo(email.getSendTo()); messageHelper.setSubject(email.getSubject()); messageHelper.setText(email.getContent(),true); messageHelper.setFrom(mailProperties.getUsername()); FileSystemResource fileSystemResource = new FileSystemResource(new File(email.getInlineImgPath())); messageHelper.addInline(email.getInlineImgId(), fileSystemResource); javaMailSender.send(mailMessage); } 复制代码
这边加上图片路径:
@Test void testSendInLineImgMail() throws MessagingException { String inlineImgPath = "C://Users//Administrator//Desktop//007Tv3Vmly1ggxvrzrytij31hc0u047h.jpg"; String srcId = "img01"; EmailDto emailDto = new EmailDto(); emailDto.setSendTo("your_email@qq.com"); emailDto.setSubject("发送html内嵌图片邮件"); emailDto.setInlineImgId(srcId); emailDto.setInlineImgPath(inlineImgPath); String html = "<html><head><title>email</title></head><body><h1>发送html内嵌图片邮件</h1>"+ "<img src=/'cid:"+ srcId +"/'></img>" + "</body></html>"; emailDto.setContent(html); emailService.sendInLineImgMail(emailDto); } 复制代码
测试发送成功:
如果发送html邮件,邮件里的内容要动态的,这种可以怎么实现?写html的字符串,然后去发送也是可以,不过如果用模板引擎就可以简洁点,请看代码:
先写个html,引入Thymeleaf模板引擎
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>模板邮件</title> </head> <body> 您好,<span th:text="${username}"></span>,欢迎访问我的CSDN博客: <a href="https://smilenicky.blog.csdn.net/">CSDN链接</a> </body> </html> 复制代码
Junit测试:
@Test void testSendTemplateEmail() throws MessagingException { Context context = new Context(); context.setVariable("username", "admin"); context.setVariable("id", "123456789"); EmailDto emailDto = new EmailDto(); emailDto.setSendTo("your_emial@qq.com"); emailDto.setSubject("发送模板html邮件"); emailDto.setContent(templateEngine.process("test",context)); emailService.sendHtmlMail(emailDto); } 复制代码
测试成功,数据是动态的
如果要发送带附件的邮件,怎么实现?请看代码:
/** * 发送附件邮件 * @Author mazq * @Date 2020/07/22 16:31 * @Param [email] * @return */ public void sendAttachmentMail(EmailDto email) throws MessagingException { MimeMessage mailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true); messageHelper.setTo(email.getSendTo()); messageHelper.setSubject(email.getSubject()); messageHelper.setText(email.getContent(),true); messageHelper.setFrom(mailProperties.getUsername()); for (String filePath : email.getFilePaths()) { FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath)); messageHelper.addAttachment(fileSystemResource.getFilename() , fileSystemResource); } javaMailSender.send(mailMessage); } 复制代码
@Test void testSendAttachmentMail() throws MessagingException { String[] filePaths = new String[]{"C://Users//Administrator//Desktop//awrrpt_2_22022_22023.html","C://Users//Administrator//Desktop//awr.html"}; EmailDto emailDto = new EmailDto(); emailDto.setSendTo("your_email@qq.com"); emailDto.setSubject("发送附件邮件"); emailDto.setFilePaths(filePaths); String html = "<html><head><title>email</title></head><body><h1>测试发送附件邮件</h1></body></html>"; emailDto.setContent(html); emailService.sendAttachmentMail(emailDto); } 复制代码
代码例子下载: code download
很遗憾的说,推酷将在这个月底关闭。人生海海,几度秋凉,感谢那些有你的时光。
原文 https://juejin.im/post/5f183791f265da22f034b231