【SpringBoot】发送各种复杂格式的邮件
在Spring Boot中发送带有附件、嵌入资源(如图片)、抄送(Cc)和密送(Bcc)的复杂邮件,你可以使用JavaMailSender接口和MimeMessageHelper类。
邮件格式
一封电子邮件主要由以下几个关键部分组成,这些部分共同构成了邮件的整体结构和内容:
收件人(To)
这是邮件发送到的电子邮箱地址。确保你输入的地址是正确的,以避免邮件发送错误或丢失。
抄送(Cc)(可选)
如果你希望其他人也能收到这封邮件,可以将他们的电子邮箱地址添加到抄送栏。抄送的人可以看到邮件的所有其他收件人。
密送(Bcc)(可选)
密送允许你将邮件发送给其他人,但这些人的邮箱地址不会显示在邮件的收件人或抄送列表中。这通常用于发送敏感信息,同时保护收件人的隐私。
主题(Subject)
邮件的主题是邮件内容的简短描述,应该准确反映邮件的要点或目的。一个清晰的主题有助于收件人快速了解邮件内容,并决定是否立即阅读。
正文(Body)
正文是邮件的主要内容,包括开头问候、具体信息或请求、行动要求以及结尾感谢等。正文应该清晰、简洁、有条理,避免使用过多的行业术语或复杂的句子结构。
附件(Attachments)(可选)
如果邮件中包含文件(如文档、图片、表格等),你可以将它们作为附件添加到邮件中。确保附件的大小不超过收件人邮箱的限制,并提醒收件人检查附件是否存在病毒或恶意软件。
签名(Signature)
邮件签名通常位于正文的底部,包括你的全名、职位(如果适用)、公司名称、联系方式(如电话、邮箱等)以及可能的公司logo或社交媒体链接。签名有助于建立你的专业形象,并方便收件人联系你。
发送时间(Sent Time)
这不是由你手动填写的部分,而是邮件系统自动记录的。它显示了邮件发送的确切时间,有助于收件人了解邮件的时效性。
优先级(Priority)(可选)
一些邮件系统允许你设置邮件的优先级(如高、中、低)。这有助于收件人根据邮件的重要性来安排阅读顺序。但请注意,不要滥用高优先级标记,以免降低其效果。
阅读回执(Read Receipt)(可选)
阅读回执是一种功能,当你发送邮件时,可以请求收件人在阅读邮件后发送一个确认回执。这有助于你了解邮件是否已被阅读,但请注意尊重收件人的隐私和意愿。
复杂邮件的发送
发送带抄送和密送的邮件
/**
* 发送带抄送和密送的邮件
*
* @return "sendWithCcAndBcc"
*/
@GetMapping("/sendWithCcAndBcc")
public String sendWithCcAndBcc() {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("1508787838@qq.com");
message.setCc("374785621@qq.com"); // 抄送
message.setBcc("2426497890@qq.com"); // 密送
message.setSubject("sendWithCcAndBcc");
message.setText("sendWithCcAndBcc Text");
message.setFrom("morris131@163.com");
javaMailSender.send(message);
return "sendWithCcAndBcc";
}
抄送的邮箱会显示在邮件的抄送列表,但是密送的邮箱不会显示在邮件的收件人或抄送列表。
发送带html格式的邮件
/**
* 发送带html格式的邮件
*
* @return "sendWithHtml"
*/
@GetMapping("/sendWithHtml")
public String sendWithHtml() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
String htmlContent = "<html><body><h1>sendWithHtml test</h1></body></html>";
// 邮件发送来源
mimeMessageHelper.setFrom("morris131@163.com");
// 邮件发送目标
mimeMessageHelper.setTo("1508787838@qq.com");
// 设置标题
mimeMessageHelper.setSubject("sendWithHtml");
// 设置内容,并设置内容 html 格式为 true
mimeMessageHelper.setText(htmlContent, true);
javaMailSender.send(mimeMessage);
return "sendWithHtml";
}
mimeMessageHelper.setText(htmlContent, true);
的第二个参数必须设置为true,才会把第一个参数的内容当成html处理,否则会当成普通文本处理。
注意:邮件html中不能写javascript内容,会被忽略。
发送带内嵌图片的html格式邮件
/**
* 发送带内嵌图片的html格式邮件
*
* @return "sendWithInlineImageHtml"
*/
@GetMapping("/sendWithInlineImageHtml")
public String sendWithInlineImageHtml() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
String htmlContent = "<html><body>" +
"<h1>欢迎来到 Spring boot 的世界</h1>" +
"<image width='200' height='300' src='cid:java'>图片1 </image>" +//cid:是约定好的固定格式,只需要修改后面的变量
"<image width='200' height='300' src='cid:springboot'>图片2 </image>" +
"</body></html>";
// 数组中的cid要和上面html中image中的cid一致,否则图片将设置失败
Map<String, String> map = new HashMap<>();
map.put("java", "images/java.png");
map.put("springboot", "images/springboot.jpg");
// multipart参数要设置为true,代表要支持附件
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
// 邮件发送来源
mimeMessageHelper.setFrom("morris131@163.com");
// 邮件发送目标
mimeMessageHelper.setTo("1508787838@qq.com");
// 设置标题
mimeMessageHelper.setSubject("sendWithImageHtml");
// 设置内容,并设置内容 html 格式为 true
mimeMessageHelper.setText(htmlContent, true);
// 设置 html 中内联的图片
for (Map.Entry<String, String> entry : map.entrySet()) {
// addInline() 方法 cid 需要 html 中的 cid (Content ID) 对应,才能设置图片成功,
mimeMessageHelper.addInline(entry.getKey(), new ClassPathResource(entry.getValue()));
}
javaMailSender.send(mimeMessage);
return "sendWithInlineImageHtml";
}
发送带有附件、内嵌资源时,需要将MimeMessageHelper构造方法的第二个参数设置为true,否则会抛出如下异常:
java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.
at org.springframework.mail.javamail.MimeMessageHelper.getMimeMultipart(MimeMessageHelper.java:414) ~[spring-context-support-5.3.19.jar:5.3.19]
发送带附件的邮件
/**
* 发送带附件的邮件
*
* @return "sendWithEnclosure"
*/
@GetMapping("/sendWithEnclosure")
public String sendWithEnclosure() throws MessagingException {
Map<String, String> map = new HashMap<>();
map.put("test1", "files/test1.txt");
map.put("test2", "files/test2.7z");
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// multipart参数要设置为true,代表要支持附件
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
// 邮件发送来源
mimeMessageHelper.setFrom("morris131@163.com");
// 邮件发送目标
mimeMessageHelper.setTo("1508787838@qq.com");
// 设置标题
mimeMessageHelper.setSubject("sendWithWithEnclosure");
// 设置内容
mimeMessageHelper.setText("sendWithWithEnclosure Text");
// 添加附件
for (Map.Entry<String, String> entry : map.entrySet()) {
mimeMessageHelper.addAttachment(entry.getKey(), new ClassPathResource(entry.getValue()));
}
javaMailSender.send(mimeMessage);
return "sendWithEnclosure";
}
发送Freemarker模板邮件
maven中引入包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
gradle中引入:
implementation 'org.springframework.boot:spring-boot-starter-freemarker:2.6.7'
// org.springframework.web.servlet.view.freemarker;
@Resource
private FreeMarkerConfigurer freeMarkerConfigurer;
/**
* 发送Freemarker模板邮件
*
* @return "sendWithFreemarker"
*/
@GetMapping("/sendWithFreemarker")
public String sendWithFreemarker() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
// 邮件发送来源
messageHelper.setFrom("morris131@163.com");
// 邮件发送目标
messageHelper.setTo("1508787838@qq.com");
// 设置邮件主题
messageHelper.setSubject("sendWithFreemarker");
// 获取模板
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("email.ftl", "UTF-8");
HashMap<String, Object> map = new HashMap<>();
map.put("userName", "Morris131");
map.put("age", 18);
// 填充数据并把模板转为字符串
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
// 设置邮件内容,第二个参数为true表示将发送内容设置为"text/html"
messageHelper.setText(content, true);
javaMailSender.send(mimeMessage);
return "sendWithFreemarker";
}
html模板的位置:默认在resource/templates/目录下,模板文件名为email.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello Email</title>
</head>
<body>
<p>用户:${userName}</p>
<p>年龄:${age}</p>
</body>
</html>