Spring Boot实战系列-----------邮件发送

快速导航

添加maven依赖

Spring Boot项目的pom.xml文件中引入spring-boot-starter-email依赖html

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-email</artifactId> <scope>email</scope> </dependency> 复制代码

模版邮件须要引入 spring-boot-starter-thymeleaf 插件java

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 复制代码

配置文件增长邮箱相关配置

163邮箱配置,注意要替换本身的帐户信息,password为受权码。git

application.ymlgithub

spring:  mail:  host: smtp.163.com  username: your163account@163.com  password: your163password  default-encoding: utf-8 复制代码

QQ邮箱发送邮件配置,如下password为受权码web

spring:  mail:  host: smtp.qq.com  username: yourqqaccount@qq.com  password: yourQQpassword 复制代码

项目构建

基于上节单元测试chapter5-1代码示例基础之上编写spring

业务层代码

service目录下建立MailService.java文件,负责业务层邮件发送功能编写数组

让咱们利用Spring提供的JavaMailSender接口实现邮件发送,在项目中使用到地方用@Autowired注入邮件发送对象bash

MailService.javaapp

package com.angelo.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; @Service public class MailService { @Value("${spring.mail.username}") private String from; @Autowired // 项目启动时将mailSender注入 private JavaMailSender javaMailSender; // ... 下面会一一介绍 ... } 复制代码

单元测试层代码

test测试目录下建立MailServiceTest.java测试类,对业务层代码进行单元测试maven

MailServiceTest.java

package com.angelo.service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.annotation.Resource; import javax.mail.MessagingException; import java.lang.reflect.Array; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest public class MailServiceTest { @Autowired private MailService mailService; @Resource TemplateEngine templateEngine; String to = "your163password@163.com"; // ... 下面为一一介绍 ... } 复制代码

五种邮件发送类型讲解

文本邮件

SimpleMailMessage封装了简单邮件的发送、接收功能、监测异常模块功能,这也是最简单的一种邮件发送,建立一个邮件消息对象,设置邮件的发送者、发送对象、邮件主题、邮件内容。

  • 业务层MailService.java
/** * 发送文本邮件 * @param to * @param subject * @param content */ public void sendTextMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); // 发送对象 message.setSubject(subject); // 邮件主题 message.setText(content); // 邮件内容 message.setFrom(from); // 邮件的发起者 javaMailSender.send(message); } 复制代码

对以上业务代码进行单元测试,查看下效果

  • 单元测试层MailServiceTest.java
@Test public void sendTextEmailTest() { mailService.sendTextMail(to, "发送文本邮件", "hello,这是Spring Boot发送的一封文本邮件!"); } 复制代码
  • 测试结果

 

图片描述

 

html邮件

基于MimeMessageHelper建立helper对象,设置setText第二个参数为true,将会使用html格式打印邮件。

  • 业务层MailService.java
/** * 发送HTMl邮件 * @param to * @param subject * @param content * @throws MessagingException */ public void sendHtmlMail(String to, String subject, String content) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); javaMailSender.send(message); } 复制代码
  • 单元测试层MailServiceTest.java
@Test public void sendHtmlEmailTest() throws MessagingException { String content = "<html>" + "<body>" + "<h1 style=\"" + "color:red;" + "\">hello,这是Spring Boot发送的一封HTML邮件</h1>" + "</body></html>"; mailService.sendHtmlMail(to, "发送HTML邮件", content); } 复制代码
  • 测试结果

能够看到邮件结果使用了例子中预先设置好的邮件格式

 

图片描述

 

附件邮件

  • 业务层MailService.java
/** * 发送带附件的邮件 * @param to * @param subject * @param content * @param filePathList * @throws MessagingException */ public void sendAttachmentMail(String to, String subject, String content, String[] filePathList) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); for (String filePath: filePathList) { System.out.println(filePath); FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath)); String fileName = fileSystemResource.getFilename(); helper.addAttachment(fileName, fileSystemResource); } javaMailSender.send(message); } 复制代码

filePathList写上你的附件文件路径,数组格式。

  • 单元测试层MailServiceTest.java
@Test public void sendAttachmentEmailTest() throws MessagingException { String[] filePathList = new String[2]; filePathList[0] = "/SpringBoot-WebApi/chapter4.zip"; filePathList[1] = "/SpringBoot-WebApi/chapter5.zip"; mailService.sendAttachmentMail(to, "发送附件邮件", "hello,这是Spring Boot发送的一封附件邮件!", filePathList); } 复制代码
  • 测试结果

 

图片描述

 

html内嵌图片邮件

也是基于html邮件发送,经过内嵌图片等静态资源,能够直接看到图片。

  • 业务层MailService.java
/** * 发送html内嵌图片的邮件 * @param to * @param subject * @param content * @param srcPath * @param srcId * @throws MessagingException */ public void sendHtmlInlinePhotoMail(String to, String subject, String content, String srcPath, String srcId) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); FileSystemResource fileSystemResource = new FileSystemResource(new File(srcPath)); helper.addInline(srcId, fileSystemResource); javaMailSender.send(message); } 复制代码

如下单元测试中srcPath为您的本地图片路径,srcId要和上面业务层的helper.addInline(srcId, fileSystemResource)srcId保持一致。

  • 单元测试层MailServiceTest.java
@Test public void sendHtmlInlinePhotoMailTest() throws MessagingException { String srcPath = "/SpringBoot-WebApi/chapter6/img/pic18.jpg"; String srcId = "pic18"; String content = "<html>" + "<body>" + "<h2>hello,这是Spring Boot发送的一封HTML内嵌图片的邮件</h2>" + "<img src=\'cid:"+ srcId +"\'></img>" + "</body></html>"; mailService.sendHtmlInlinePhotoMail(to, "发送图片邮件", content, srcPath, srcId); } 复制代码
  • 测试结果

 

图片描述

 

模板邮件

邮件内容相对简单的状况下,咱们能够选择使用以上几种简单邮件发送方法,在复杂业务中须要用到html结构,且html里的数据还须要动态修改,仍是选择模版邮件,可使用Freemarkerthymeleaf等模板引擎,这里主要介绍使用thymeleaf

  • 邮件模板编写

resources/templates目录下新建emailTemplate.html文件

<!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>,欢迎访问个人我的博客: <a href="https://github.com/Q-Angelo/summarize">Github</a>、 <a th:href="@{https://www.imooc.com/u/{id}(id=${id})}" href="#">慕课网</a> </body> </html> 复制代码

利用上面介绍的发送html邮件便可,在单元测试文件中增长一个方法进行测试。

  • 单元测试层MailServiceTest.java
@Test public void testTemplateEmailTest() throws MessagingException { Context context = new Context(); context.setVariable("username", "张三"); context.setVariable("id", "2667395"); String emailContent = templateEngine.process("emailTemplate", context); mailService.sendHtmlMail(to, "发送模板邮件", emailContent); } 复制代码
  • 测试结果

 

图片描述

 

常见问题

出现这个错误的缘由是网易将我发送的邮件当成了垃圾邮件,<<发送163文本邮件>>这是我填写的邮件标题,后来发现网易是对标题里面含了163致使的,你们遇到相似问题多检查下。

com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp10,DsCowADH1MxWegtcyxFjDw--.48939S2 1544256086
复制代码

如遇到什么问题可在下方评论区提问

Github查看本文完整示例 chapter6-1

做者:五月君
连接:www.imooc.com/article/267…
来源:慕课网
Github: Spring Boot实战系列

做者:五月君连接:https://juejin.im/post/5c198ddff265da611801a465

相关文章
相关标签/搜索