SpringBoot整合JavaMail,配置JavaMailSender,邮件发送(模板,附件,HTML邮件发送)

为了不错过你们给我的留言,上线了邮箱系统,用到了JavaMailSenderImpl和JavaMailSender,本文讲解SpringBoot如何群发和单发邮件或者附件,模板,HTml,自动配置或者从数据库获取自己配置。

pom文件引用jar包
不管是JavaMailSenderImpl还是JavaMailSender,其实JavaMailSenderImpl继承了JavaMailSender,用来自己配置的

  1. org.springframework.boot
  2. spring-boot-starter-mail

如其他自动化配置模块一样,在完成了依赖引入之后,只需要在 application.properties 中配置相应的属性内容。

  1. application.properties
  2. spring.mail.host=smtp.qq.com
  3. spring.mail.username=13XXXX657@qq.com //发送方的邮箱
  4. spring.mail.password=密码 //对于qq邮箱而言 密码指的就是发送方的授权码
  5. spring.mail.properties.mail.smtp.auth=true
  6. spring.mail.properties.mail.smtp.starttls.enable=true
  7. spring.mail.properties.mail.smtp.starttls.required=true

注意:在spring.mail.password处的值是需要在邮箱设置里面生成的授权码,这个不是真实的密码。

  1. application.yml
  2. mail:
  3. host: smtp.qq.com
  4. username: 13XXXX657@qq.com #发送方的邮箱
  5. password: upzoczdyxbgdfhhd #对于qq邮箱而言 密码指的就是发送方的授权码
  6. properties:
  7. mail:
  8. smtp:
  9. auth: true
  10. starttls:
  11. enable: true
  12. required: true

JavaMailSender
这个我们只要在application.properties配置文件或者application.yml配置文件中配置以下信息,springboot会自动读取,会根据配置文件中的内容去创建 JavaMailSender 实例

  1. @RestController
  2. @RequestMapping("mail")
  3. public class Controller {
  4. //由于Spring Boot的starter模块提供了自动化配置,所以在引入了 spring-boot-starter-mail 依赖之后,会根据配置文件中的内容去创建 JavaMailSender 实例,因此我们可以直接在需要使用的地方直接 @Autowired 来引入邮件发送对象。
  5. @Autowired
  6. JavaMailSender jms;
  7. @GetMapping("/send")
  8. public void send(){
  9. //建立邮件消息
  10. SimpleMailMessage mainMessage = new SimpleMailMessage();
  11. //发送者
  12. mainMessage.setFrom("13XXXX657@qq.com"); //要和配置中发送用户一样,或者会报错
  13. //接收者
  14. mainMessage.setTo("xxxxxx");
  15. //发送的标题
  16. mainMessage.setSubject("嗨喽");
  17. //发送的内容
  18. mainMessage.setText("hello world");
  19. jms.send(mainMessage);
  20. }
  21. }

JavaMailSenderImpl和群发
这个可以自己设置,从数据库中获取各项数据创建,不用在配置文件中配置

  1. @GetMapping("/mail")
  2. public void sendSimpleMail() throws Exception {
  3. JavaMailSenderImpl mailSender = new JavaMailSenderImpl();//直接生产一个实例
  4. String users[] = {"xxxxx@qq.com","xxxxx@126.com"}; //群发创建用户
  5. mailSender.setHost("smtp.126.com");
  6. mailSender.setPassword("xxxxx");
  7. mailSender.setPort(25);
  8. mailSender.setProtocol("smtp");
  9. mailSender.setUsername("13XXXX657");//这里是13XXXX657@qq.com的前置,不是整个邮箱地址
  10. SimpleMailMessage message = new SimpleMailMessage();
  11. message.setFrom("13XXXX657@qq.com");
  12. message.setTo(users); // 群发
  13. message.setSubject("羽毛球比赛");
  14. message.setText("报名参加羽毛球赛");
  15. mailSender.send(message);
  16. }

其中我们可以设置群发message.setTo(users); 它可以是个数组

发送复杂邮件
上面的例子用到是SimpleMailMessage,看名字就知道很简单的邮件了,我们要发复杂邮件就要用到MimeMessage 。

发送附件:

  1. public void mimeEmail() throws MessagingException {
  2. // MimeMessage 本身的 API 有些笨重,我们可以使用 MimeMessageHelper
  3. MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  4. // 第二个参数是 true ,表明这个消息是 multipart类型的/
  5. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
  6. mimeMessageHelper.setFrom("13XXXX657@qq.com");
  7. mimeMessageHelper.setTo("****@qianxx.com");
  8. mimeMessageHelper.setSubject("附件邮件主题");
  9. mimeMessageHelper.setText("附件邮件内容");
  10. //添加附件,第一个参数表示添加到 Email 中附件的名称,第二个参数是图片资源
  11. mimeMessageHelper.addAttachment("boot.png", new ClassPathResource("public/images/boot.png"));
  12. javaMailSender.send(mimeMessage);
  13. }

富文本(HTML)邮件发送
Spring 的 Email 功能除了可以添加附件外,甚至可以使用 HTML 来美化消息体的内容。发送富文本的 Email 与发送简单文本的 Email 并没有太大区别,关键是将setText() 方法的消息文本设置为 HTML,并将第二个参数设置为 true,表示这是 HTML 的富文本。

  1. public void htmlEmail() throws MessagingException {
  2. MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  3. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
  4. mimeMessageHelper.setFrom("13XXXX657@qq.com");
  5. mimeMessageHelper.setTo("****@qianxx.com");
  6. mimeMessageHelper.setSubject("富文本邮件主题");
  7. String html = "Hello,SpringBoot";
  8. mimeMessageHelper.setText(html, true);
  9. // 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
  10. mimeMessageHelper.addInline("boot", new ClassPathResource("public/images/boot.png"));
  11. //添加附件,第一个参数表示添加到 Email 中附件的名称,第二个参数是图片资源
  12. javaMailSender.send(mimeMessage);
  13. }

使用 Thymeleaf 模板
Thymeleaf 模板 — email.html

  1. lang="en" xmlns:th="http://www.thymeleaf.org">
  2. charset="UTF-8">
  3. Email
  4. src='cid:boot'>
  5. th:text="${title}">Craig Walls says...
  6. th:text="${content}">Hello Boot!

发送模板邮件

  1. public void thymeleafEmail() throws MessagingException {
  2. MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  3. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
  4. mimeMessageHelper.setFrom("159****2662@163.com");
  5. mimeMessageHelper.setTo("****@qianxx.com");
  6. mimeMessageHelper.setSubject("ThymeLeaf 模板邮件");
  7. // 利用 Thymeleaf 模板构建 html 文本
  8. Context ctx = new Context();
  9. //给模板的参数的上下文
  10. ctx.setVariable("title", "Craig Walls");
  11. ctx.setVariable("content", "Hello Boot!");
  12. //执行模板引擎,执行模板引擎需要传入模板名、上下文对象
  13. String emailText = templateEngine.process("email/email", ctx);
  14. mimeMessageHelper.setText(emailText, true);
  15. mimeMessageHelper.addInline("boot", new ClassPathResource("/static/img/boot.png"));
  16. javaMailSender.send(mimeMessage);
  17. }