邮件服务已是基础性服务了 ,是网站的必备功能之一,当注册了某些网站的时候,邮箱里一般会收到一封注册成功通知邮件或者点击激活帐号的邮件,博客园也是如此。本文使用Spring Boot,经过QQ邮箱来模仿博客园发送一封通知邮件。html
博客园发送的“欢迎您加入博客园”的主题邮件如图所示。这种通知邮件,只有登陆用户名在变化,其它邮件内容均不变,很适合用邮件模板来处理。java
模板能够实现显示与数据分离,将模板文件和数据经过模板引擎生成最终的HTML代码。git
Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎,可以处理HTML,XML,JavaScript,CSS甚至纯文本。Thymeleaf因为使用了标签属性作为语法,模版页面直接用浏览器渲染,与其它模板引擎(好比Freemaker)相比,Thymeleaf最大的特色是可以直接在浏览器中打开并正确显示模板页面,而不须要启动整个Web应用。github
Thymeleaf做为Spring官方推荐的模板引擎,Spring boot对Thymeleaf支持比较友好,配置简单,这里使用Thymeleaf做为模板引擎。spring
下面正式开始实现仿博客园发送通知邮件。浏览器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
复制代码
我使用的是QQ邮箱,须要得到QQ邮箱的受权码。缓存
关于QQ邮箱生成受权码:进入QQ邮箱 --> 邮箱设置 --> 帐户 --> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 --> 生成受权码 --> 手机发送验证短信 -->获得受权码springboot
spring.mail.host=smtp.qq.com
spring.mail.username=QQ邮箱
spring.mail.password=受权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
#thymelea模板配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type:text/html
#热部署文件,页面不产生缓存,及时更新
spring.thymeleaf.cache=false
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
复制代码
Service中有两个方法:服务器
sendSimpleMail用于发送简单的文本邮件,是一个比较基础的案例。app
sendHtmlMail用于发送HTML邮件,发送通知邮件用的就是这个方法。其实模板邮件也就是HTML邮件中的一个子类。
MailService:
public interface MailService {
public void sendSimpleMail(String to, String subject, String content);
public void sendHtmlMail(String to, String subject, String content);
}
复制代码
MailServiceImpl:
@Component
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);//邮件接收者
message.setSubject(subject);//邮件主题
message.setText(content);//邮件内容
try {
mailSender.send(message);
logger.info("发送简单邮件成功!");
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!", e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示须要建立一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
logger.info("发送HTML邮件成功!");
} catch (MessagingException e) {
logger.error("发送HTML邮件时发生异常!", e);
}
}
}
复制代码
在resorces/templates下建立emailTemplate.html模板,与模板配置中的spring.thymeleaf.prefix=classpath:/templates/对应,否则会找不到模板。
关于Thymeleaf的使用这里简单介绍一下:
引入命名空间:。不一样的约束文档中,可能会出现不一样含义的相同标记名称,引入名称空间能够避免混淆和冲突。
访问数据:#{user.name}
访问变量:${today}
输出URL: 博客园
更多详情的说明和规则请参见:Thymeleaf官方文档
emailTemplate.html:
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>欢迎您加入博客园</title>
</head>
<body>
<p>您好,您在博客园的账户激活成功,您的登陆用户名是:<span th:text="${username}"></span>。</p>
<p>--</p>
<div>博客园(
<a th:href="@{https://www.cnblogs.com }">www.cnblogs.com</a>
) - 开发者的网上家园</div>
<p>代码改变世界!</p>
</body>
</html>
复制代码
使用Junit进行单元测试,pom.xml中已经默认配置好了,须要编写测试类和测试方法。测试类以xxxTest.java命名,测试方法上面加@Test注解就可使用了。具体代码以下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailTest {
@Autowired
private MailService mailService;
@Autowired
private TemplateEngine templateEngine;
@Test
public void testSendSimpleMail() throws Exception {
mailService.sendSimpleMail("xxx@qq.com", "测试发送简单文本邮件", "测试发送简单文本邮件");
}
@Test
public void testSendTemplateMail() {
Context context = new Context();
context.setVariable("username", "shangguanhao");
String emailContent = templateEngine.process("emailTemplate", context);
mailService.sendHtmlMail("xxx@qq.com", "欢迎您加入博客园", emailContent);
}
}
复制代码
进行Junit测试,就能够发送一个简答的文本邮件和一个HTML的模板邮件,几乎和博客园的如出一辙(以下图所示):
完整代码:GitHub地址