javaMailSender发送邮件
应用场景
在一些项目中,可能要用到报警提醒。常见的报警提醒有发送短信和发送邮件,由于发送短信需要对接第三方api且需要付费,这篇文章将介绍如何使用java实现发送邮件,包括发送普通文本邮件、普通html格式的邮件、配置模板的html格式邮件。
技术说明
Jdk8
Springboot 2.2.2.RELEASE
spring-boot-starter-mail
spring-boot-starter-thymeleaf,springboot 2.x版本后不再支持velcity模板
示例代码:
开启邮箱的smtp功能
以QQ邮箱为例:
》登录qq邮箱
》设置
》账户
》开启” POP3 /SMTP服务”
》点击下方的”生成授权码”
》短信验证后即可得到一个授权码,该授权码可以生成多次,多个授权码可以同时使用,更改邮箱密码后之前生成的所有授权码失效。
POP3和IMAP的区别?
如果只是通过java发送邮件,开通POP3服务即可;
POP3允许客户端下载邮件服务器上的邮件,但是在邮件客户端对该邮件的所有操作不会反馈到邮件服务器上。比如,在 foxmail 上你将邮件归档到一个文件夹,在QQ邮箱是不会体现该归档操作的。如果你使用的是IMAP协议,则该归档操作是会反馈到邮箱服务器的,IMAP是双向的。
详细可参考说明:
示例代码
项目结构
Pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="#34; xmlns:xsi="#34; xsi:schemaLocation=" #34;> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.firechou.demo</groupId> <artifactId>demo-mail</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-mail</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org. junit .vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <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> </dependencies> <build> < plugin s> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Application.properties配置文件
spring.mail.host=smtp.qq.com
## 发送方的邮箱
spring.mail. username =xxx@qq.com
## 对于qq邮箱而言,密码指的是发送方的授权码
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
## thymeleaf配置
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/template/
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=utf-8
# 收件人,测试
mail.to.username=xxx@qq.com
测试代码
package com.firechou.demo.demomail; import org.junit.jupiter.api.Test; import org.springframework.beans. factory . annotation .Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMail message ; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.util.HashMap; import java.util.Map; @SpringBootTest class DemoMailApplicationTests { @Autowired private JavaMailSender javaMailSender; @Value("${spring.mail.username}") private String fromUserName; @Value("${mail.to.username}") private String toUserName; @Autowired private TemplateEngine templateEngine; /** * 发送普通文本邮件 */ @Test void sendByText() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(fromUserName); message.setTo(toUserName); message.setSubject("观影调查"); message.setText("你觉得庆余年好看吗?"); javaMailSender.send(message); } /** * 发送html格式邮件 * * @throws MessagingException */ @Test void sendByHtml() throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(fromUserName); helper.setTo(toUserName); helper.setSubject("测试标题"); StringBuffer sb = new StringBuffer(); sb. append ("<h1>大标题-h1</h1>") .append("<p style='color:#F00'>红色字</p>") .append("<p style='text-align:right'>右对齐</p>"); helper.setText(sb.toString(), true); javaMailSender.send(message); } /** * 发送模板文件,在resources资源文件夹下配置模板文件 * * @throws MessagingException */ @Test void sendByTemplate() throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(fromUserName); helper.setTo(toUserName); helper.setSubject("测试标题"); HashMap<String, Object> dataMap = new HashMap<>(); dataMap.put("title", "模板测试"); dataMap.put("context", "这是内容"); String text = createTemplate(dataMap, "emailTemplate.html", templateEngine); helper.setText(text, true); javaMailSender.send(message); } /** * 创建模板字符串 * @param dataMap * @param templateName * @param templateEngine * @return */ private static String createTemplate(Map<String, Object> dataMap, String templateName, TemplateEngine templateEngine) { // context对象用于注入要在模板上渲染的信息 Context context = new Context(); context.setVariables(dataMap); String emailText = templateEngine.process(templateName, context); System.out.println(emailText); // 返回模板源代码String类型 return emailText; } }
测试结果