SpringBoot發(fā)送各種復(fù)雜格式郵件的示例詳解
在Spring Boot中發(fā)送帶有附件、嵌入資源(如圖片)、抄送(Cc)和密送(Bcc)的復(fù)雜郵件,你可以使用JavaMailSender接口和MimeMessageHelper類。
郵件格式
一封電子郵件主要由以下幾個關(guān)鍵部分組成,這些部分共同構(gòu)成了郵件的整體結(jié)構(gòu)和內(nèi)容:
1.收件人(To)
這是郵件發(fā)送到的電子郵箱地址。確保你輸入的地址是正確的,以避免郵件發(fā)送錯誤或丟失。
2.抄送(Cc)(可選)
如果你希望其他人也能收到這封郵件,可以將他們的電子郵箱地址添加到抄送欄。抄送的人可以看到郵件的所有其他收件人。
3.密送(Bcc)(可選)
密送允許你將郵件發(fā)送給其他人,但這些人的郵箱地址不會顯示在郵件的收件人或抄送列表中。這通常用于發(fā)送敏感信息,同時保護(hù)收件人的隱私。
4.主題(Subject)
郵件的主題是郵件內(nèi)容的簡短描述,應(yīng)該準(zhǔn)確反映郵件的要點或目的。一個清晰的主題有助于收件人快速了解郵件內(nèi)容,并決定是否立即閱讀。
5.正文(Body)
正文是郵件的主要內(nèi)容,包括開頭問候、具體信息或請求、行動要求以及結(jié)尾感謝等。正文應(yīng)該清晰、簡潔、有條理,避免使用過多的行業(yè)術(shù)語或復(fù)雜的句子結(jié)構(gòu)。
6.附件(Attachments)(可選)
如果郵件中包含文件(如文檔、圖片、表格等),你可以將它們作為附件添加到郵件中。確保附件的大小不超過收件人郵箱的限制,并提醒收件人檢查附件是否存在病毒或惡意軟件。
7.簽名(Signature)
郵件簽名通常位于正文的底部,包括你的全名、職位(如果適用)、公司名稱、聯(lián)系方式(如電話、郵箱等)以及可能的公司logo或社交媒體鏈接。簽名有助于建立你的專業(yè)形象,并方便收件人聯(lián)系你。
8.發(fā)送時間(Sent Time)
這不是由你手動填寫的部分,而是郵件系統(tǒng)自動記錄的。它顯示了郵件發(fā)送的確切時間,有助于收件人了解郵件的時效性。
9.優(yōu)先級(Priority)(可選)
一些郵件系統(tǒng)允許你設(shè)置郵件的優(yōu)先級(如高、中、低)。這有助于收件人根據(jù)郵件的重要性來安排閱讀順序。但請注意,不要濫用高優(yōu)先級標(biāo)記,以免降低其效果。
10.閱讀回執(zhí)(Read Receipt)(可選)
閱讀回執(zhí)是一種功能,當(dāng)你發(fā)送郵件時,可以請求收件人在閱讀郵件后發(fā)送一個確認(rèn)回執(zhí)。這有助于你了解郵件是否已被閱讀,但請注意尊重收件人的隱私和意愿。
復(fù)雜郵件的發(fā)送
發(fā)送帶抄送和密送的郵件
/**
* 發(fā)送帶抄送和密送的郵件
*
* @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";
}
抄送的郵箱會顯示在郵件的抄送列表,但是密送的郵箱不會顯示在郵件的收件人或抄送列表。

發(fā)送帶html格式的郵件
/**
* 發(fā)送帶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>";
// 郵件發(fā)送來源
mimeMessageHelper.setFrom("morris131@163.com");
// 郵件發(fā)送目標(biāo)
mimeMessageHelper.setTo("1508787838@qq.com");
// 設(shè)置標(biāo)題
mimeMessageHelper.setSubject("sendWithHtml");
// 設(shè)置內(nèi)容,并設(shè)置內(nèi)容 html 格式為 true
mimeMessageHelper.setText(htmlContent, true);
javaMailSender.send(mimeMessage);
return "sendWithHtml";
}
mimeMessageHelper.setText(htmlContent, true);的第二個參數(shù)必須設(shè)置為true,才會把第一個參數(shù)的內(nèi)容當(dāng)成html處理,否則會當(dāng)成普通文本處理。

注意:郵件html中不能寫javascript內(nèi)容,會被忽略。
發(fā)送帶內(nèi)嵌圖片的html格式郵件
/**
* 發(fā)送帶內(nèi)嵌圖片的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>";
// 數(shù)組中的cid要和上面html中image中的cid一致,否則圖片將設(shè)置失敗
Map<String, String> map = new HashMap<>();
map.put("java", "images/java.png");
map.put("springboot", "images/springboot.jpg");
// multipart參數(shù)要設(shè)置為true,代表要支持附件
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
// 郵件發(fā)送來源
mimeMessageHelper.setFrom("morris131@163.com");
// 郵件發(fā)送目標(biāo)
mimeMessageHelper.setTo("1508787838@qq.com");
// 設(shè)置標(biāo)題
mimeMessageHelper.setSubject("sendWithImageHtml");
// 設(shè)置內(nèi)容,并設(shè)置內(nèi)容 html 格式為 true
mimeMessageHelper.setText(htmlContent, true);
// 設(shè)置 html 中內(nèi)聯(lián)的圖片
for (Map.Entry<String, String> entry : map.entrySet()) {
// addInline() 方法 cid 需要 html 中的 cid (Content ID) 對應(yīng),才能設(shè)置圖片成功,
mimeMessageHelper.addInline(entry.getKey(), new ClassPathResource(entry.getValue()));
}
javaMailSender.send(mimeMessage);
return "sendWithInlineImageHtml";
}

發(fā)送帶有附件、內(nèi)嵌資源時,需要將MimeMessageHelper構(gòu)造方法的第二個參數(shù)設(shè)置為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]
發(fā)送帶附件的郵件
/**
* 發(fā)送帶附件的郵件
*
* @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參數(shù)要設(shè)置為true,代表要支持附件
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
// 郵件發(fā)送來源
mimeMessageHelper.setFrom("morris131@163.com");
// 郵件發(fā)送目標(biāo)
mimeMessageHelper.setTo("1508787838@qq.com");
// 設(shè)置標(biāo)題
mimeMessageHelper.setSubject("sendWithWithEnclosure");
// 設(shè)置內(nèi)容
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";
}

發(fā)送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;
/**
* 發(fā)送Freemarker模板郵件
*
* @return "sendWithFreemarker"
*/
@GetMapping("/sendWithFreemarker")
public String sendWithFreemarker() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
// 郵件發(fā)送來源
messageHelper.setFrom("morris131@163.com");
// 郵件發(fā)送目標(biāo)
messageHelper.setTo("1508787838@qq.com");
// 設(shè)置郵件主題
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);
// 填充數(shù)據(jù)并把模板轉(zhuǎn)為字符串
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
// 設(shè)置郵件內(nèi)容,第二個參數(shù)為true表示將發(fā)送內(nèi)容設(shè)置為"text/html"
messageHelper.setText(content, true);
javaMailSender.send(mimeMessage);
return "sendWithFreemarker";
}
html模板的位置:默認(rèn)在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>

到此這篇關(guān)于SpringBoot發(fā)送各種復(fù)雜格式郵件的示例詳解的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?Hystrix原理與注意事項小結(jié)
本文介紹了Hystrix的基本概念、工作原理以及其在實際開發(fā)中的應(yīng)用方式,通過對Hystrix的深入學(xué)習(xí),開發(fā)者可以在分布式系統(tǒng)中實現(xiàn)精細(xì)的錯誤處理機(jī)制,并能夠及時響應(yīng)系統(tǒng)中的異常,避免服務(wù)的連鎖崩潰,感興趣的朋友一起看看吧2025-03-03
一文帶你學(xué)會規(guī)則引擎Drools的應(yīng)用
Drools?就是一個開源的業(yè)務(wù)規(guī)則引擎,可以很容易地與?spring?boot?應(yīng)用程序集成,這篇文章就來和大家詳細(xì)聊聊Drools的具體應(yīng)用,需要的可以參考一下2023-03-03
springboot如何查找配置文件路徑的順序和其優(yōu)先級別
此文是在工作中遇到的關(guān)于springboot配置文件的問題,在網(wǎng)上查閱資料和自己測試之后記錄的,以便日后查閱。希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

