Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送变得非常容易,这里使用QQ邮箱实现一下邮件发送的简单demo。
1.准备工作
开启QQ邮箱的POP3/SMTP服务和IMAP/SMTP服务:
登录邮箱,点击设置–>账户:
往下划,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启:
获取授权码:
这里你会获取到一个授权码,注意:这才是你发送邮件的账户的真正密码,不是你平时的QQ邮箱密码!
2.编码实现
1.创建一个spring boot工程:
2.导入maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
3.编写配置文件application.properties:
server.port=8090
#mail server host
spring.mail.host=smtp.qq.com
#username
spring.mail.username=2516222794@qq.com
#password 授权码 不是QQ密码
spring.mail.password=xxxxxxxxxx
spring.mail.default-encoding=UTF-8
#send mail
mail.fromMail.addr=2516222794@qq.com
4.编写邮件发送Service接口:
public interface MailService {
/**
* 发送简单纯文字内容信息
*
* @param to 邮件接受者
* @param subject 邮件主题
* @param content 邮件内容
*/
void sendSimpleMail(String to, String subject, String content);
/**
* 发送html内容格式的邮件
*
* @param to 邮件接受者
* @param subject 邮件主题
* @param content 邮件内容
*/
void sendHtmlMail(String to, String subject, String content);
/**
* 发送带有附件的邮件
*
* @param to 邮件接受者
* @param subject 邮件主题
* @param content 邮件内容
* @param filePath 附件路径
*/
void sendAttachmentMail(String to, String subject, String content, String filePath);
/**
* 发送带静态资源的邮件
*
* @param to 邮件接受者
* @param subject 邮件主题
* @param content 邮件内容
* @param rscPath 资源路径
* @param rscId 资源id
*/
void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
}
5.接口实现:
@Component
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
@Value("${mail.fromMail.addr}")
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("简单的邮件发送!");
System.out.println("简单的邮件发送!");
} catch (MailException e) {
e.printStackTrace();
logger.error("发送邮件时异常!", e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(mimeMessage);
logger.info("html邮件发送成功");
System.out.println("html邮件发送成功");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("发送邮件时异常!", e);
}
}
@Override
public void sendAttachmentMail(String to, String subject, String content, String filePath) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
// 添加多个附件可以使用多条 helper.addAttachment(fileName, file)
helper.addAttachment(fileName, file);
mailSender.send(mimeMessage);
logger.info("带附件的邮件已经发送。");
System.out.println("带附件的邮件已经发送。");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("发送邮件时异常!", e);
}
}
@Override
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
mailSender.send(mimeMessage);
logger.info("嵌入静态资源的邮件已经发送。");
System.out.println("嵌入静态资源的邮件已经发送。");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
}
}
6.创建测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {
@Autowired
private MailServiceImpl mailService;
}
a.测试简单邮件发送:
@Test
public void testSimpleMail() throws Exception {
mailService.sendSimpleMail("619312514@qq.com", "test simple mail", " hello this is simple mail");
}
收到邮件:
b.测试带有html格式邮件发送:
@Test
public void testHtmlMail() throws Exception {
String content = "<html><body><h3 style='color:blue'>hello world ! 这是一封Html邮件!</h3></body></html>";
mailService.sendHtmlMail("619312514@qq.com", "test simple html mail", content);
}
收到邮件:
c.测试带有附件的邮件发送:
@Test
public void sendAttachmentsMail() {
String filePath = "C:\\Users\\DELL\\Desktop\\备注.txt";
mailService.sendAttachmentMail("619312514@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}
收到邮件:
d.测试带有静态资源(背景图片)的邮件发送:
@Test
public void sendInlineResourceMail() {
String rscId = "1001";
String content = "<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' /></body></html>";
String imgPath = "C:\\Users\\DELL\\Desktop\\22.jpg";
mailService.sendInlineResourceMail("619312514@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}
收到邮件:
注意QQ邮箱查看spring boot发送的带背景图片的邮件有点特殊,直接点进去是看不到的!
点击邮箱首页:
点击未读邮件:
点全文,即可看到:
最后,我们使用Thyemeleaf来创建一个邮件模板,动态填充数据,然后发送邮件:
在resources目录下的templates目录下,创建一个emailTemplate.html
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>emailTemplate</title>
</head>
<body>
您好,这是验证邮件,请点击下面的链接完成验证,
<br />
<a href="#" th:href="@{ https://blog.csdn.net/{uid}(uid=${uid}) }">激活账号</a>
</body>
</html>
测试一下模板邮件的发送:
@Test
public void sendTemplateMail() {
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".html");
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(resolver);
Context context = new Context();
context.setVariable("uid", "C_AJing");
String emailContext = templateEngine.process("mailTemplate", context);
mailService.sendHtmlMail("619312514@qq.com", "主题:这是模板邮件", emailContext);
}
如果报错,追加maven依赖:
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.2.12</version>
</dependency>
收到的邮件: