最近从零开始学习SpringBoot框架,试着借助SpringBoot实现几个简单功能,发送邮件是我参考gitHub上的示例后借助Spring Boot实现的第一个功能,在这里做下学习笔记。如果有错误的地方,欢迎在评论区指出。
SpringBoot版本:2.4.0
发送的邮件根据所发送内容可以简单分为以下四类:
- 发送简单文本邮件;
- 发送html邮件;
- 发送带附件的邮件;
- 发送正文中有静态资源(图片)的邮件;
SpringBoot org.springframework.mail 包下提供了SimpleMailMessage、MimeMessageHelper和JavaMailSender API,借助这些API我们可以轻松实现邮件发送功能。
SimpleMailMessage:用来发送简单的文本邮件;
MimeMessage:用来发送html邮件、带附件的邮件、有静态资源(图片)的邮件。
发送简单文本邮件代码示例:
mail内容设定
SimpleMailMessage message = new SimpleMailMessage();
// 设置邮件发送人
message.setFrom(username);
// 设置邮件接收人
message.setTo(to);
// 设置抄送(可选),有普通抄送(setCc)和 盲抄送(setBcc)两种类型,普通抄送邮件接收者可以看到邮件都抄送给了哪些人,而盲抄送邮件接收者则看不到
if(!StringUtil.isEmpty(cc)) {
message.setBcc(cc);
}
// 设置邮件主题
message.setSubject(subject);
// 设置邮件正文内容
message.setText(content);
try {
// 发送邮件
mailSender.send(message);
logger.info("简单邮件已经发送。");
} catch (MailException e) {
logger.error("发送简单邮件时发生异常!", e);
}
发送html邮件代码示例:
try {
mail内容设定
MimeMessage message = mailSender.createMimeMessage();
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置邮件发送人
helper.setFrom(username);
// 设置邮件接收人
helper.setTo(to);
// 设置抄送
if(!StringUtil.isEmpty(cc)) {
helper.setBcc(cc);
}
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
helper.setText(content, true);
// 发送邮件
mailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
}
发送带附件的邮件代码示例:
try {
mail内容设定
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置邮件发送人
helper.setFrom(username);
// 设置邮件接收人
helper.setTo(to);
// 设置抄送
if(!StringUtil.isEmpty(cc)) {
helper.setBcc(cc);
}
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
helper.setText(content, true);
// 发送的附件
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (Exception e) {
logger.error("发送带附件的邮件时发生异常!", e);
}
发送正文中有静态资源(图片)的邮件代码示例:
try {
mail内容设定
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置邮件发送人
helper.setFrom(username);
// 设置邮件接收人
helper.setTo(to);
// 设置抄送
if(!StringUtil.isEmpty(cc)) {
helper.setBcc(cc);
}
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件正文内容 第二个参数为true表示将发送内容设置为"text/html"
helper.setText(content, true);
// 图片
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
// 发送邮件
mailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送。");
} catch (Exception e) {
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
application.properties配置文件中与邮件发送有关的配置:
#邮件设定
#邮件发送的主机,我这里使用是qq邮箱
spring.mail.host=smtp.qq.com
#邮件发送的端口 SMTP协议默认端口是25
spring.mail.port=25
#邮件发送的邮箱地址
spring.mail.username=xxxx@qq.com
#这里的password是邮箱SMTP认证所需的password,不是username邮箱的登录密码,QQ邮箱的SMTP在设置页面开通
spring.mail.password=
#开启SMTP认证
spring.mail.properties.mail.smtp.auth=true
#邮件的默认编码格式
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.starttls.enable=false
测试代码:
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.context.annotation.PropertySource;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
/**
* springboot mail Demo
*
* @version 16.33 2020-12-06
* @author Yolo
*
*/
@SpringBootTest
@PropertySource(value= {"classpath:mailConfig.properties", "file:./config/mailConfig.properties"},ignoreResourceNotFound = true)
public class MailServiceTest {
@Autowired
private MailService mailService;
@Autowired
private TemplateEngine templateEngine;
@Value("${mail.to}")
private String to;
@Value("${mail.cc}")
private String cc;
/**
* host
*/
@Value("${host}")
private String host;
/**
* port
*/
@Value("${port}")
private String port;
/**
* username
*/
@Value("${username}")
private String username;
/**
* password
*/
@Value("${password}")
private String password;
@Test
public void testSimpleMail() throws Exception {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
mailService.sendSimpleMail(to, cc, "test simple mail"," hello this is simple mail");
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
}
@Test
public void testHtmlMail() throws Exception {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
String content="<html>n" +
"<body>n" +
" <h3>hello world ! 这是一封html邮件!</h3>n" +
"</body>n" +
"</html>";
mailService.sendHtmlMail(to, cc,"test simple mail",content);
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
}
@Test
public void sendAttachmentsMail() {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
String filePath="D:TesttmpjustTest.xlsx";
mailService.sendAttachmentsMail(to, cc, "主题:带附件的邮件", "有附件,请查收!", filePath);
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
}
@Test
public void sendInlineResourceMail() {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
String rscId = "avatar";
String content="<html><body>这是有图片的邮件:<img src='cid:" + rscId + "' ></body></html>";
String imgPath = "D:Testtmpavatar.jpg";
mailService.sendInlineResourceMail(to, null, "主题:这是有图片的邮件", content, imgPath, rscId);
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
}
@Test
public void sendTemplateMail() {
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " Start");
//创建邮件正文
Context context = new Context();
context.setVariable("id", "007");
String emailContent = templateEngine.process("emailTemplate", context);
mailService.sendHtmlMail(to,null, "主题:这是模板邮件",emailContent);
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + " End");
}
}
Tip:SpringBoot从2.2版本开始junit从junit4升级到junit5,测试代码的写法稍有不同,在junit5中不再需要使用@RunWith(SpringRunner.class)注解。
测试结果:
简单文本邮件
简单html邮件
带附件的邮件
带静态资源的邮件
模板邮件,使用模板,利用thymeleaf对值进行绑定