SpringBoot發(fā)送各種復(fù)雜格式郵件的示例詳解
在Spring Boot中發(fā)送帶有附件、嵌入資源(如圖片)、抄送(Cc)和密送(Bcc)的復(fù)雜郵件,你可以使用JavaMailSender接口和MimeMessageHelper類。
郵件格式
一封電子郵件主要由以下幾個(gè)關(guān)鍵部分組成,這些部分共同構(gòu)成了郵件的整體結(jié)構(gòu)和內(nèi)容:
1.收件人(To)
這是郵件發(fā)送到的電子郵箱地址。確保你輸入的地址是正確的,以避免郵件發(fā)送錯(cuò)誤或丟失。
2.抄送(Cc)(可選)
如果你希望其他人也能收到這封郵件,可以將他們的電子郵箱地址添加到抄送欄。抄送的人可以看到郵件的所有其他收件人。
3.密送(Bcc)(可選)
密送允許你將郵件發(fā)送給其他人,但這些人的郵箱地址不會(huì)顯示在郵件的收件人或抄送列表中。這通常用于發(fā)送敏感信息,同時(shí)保護(hù)收件人的隱私。
4.主題(Subject)
郵件的主題是郵件內(nèi)容的簡(jiǎn)短描述,應(yīng)該準(zhǔn)確反映郵件的要點(diǎn)或目的。一個(gè)清晰的主題有助于收件人快速了解郵件內(nèi)容,并決定是否立即閱讀。
5.正文(Body)
正文是郵件的主要內(nèi)容,包括開頭問(wèn)候、具體信息或請(qǐng)求、行動(dòng)要求以及結(jié)尾感謝等。正文應(yīng)該清晰、簡(jiǎn)潔、有條理,避免使用過(guò)多的行業(yè)術(shù)語(yǔ)或復(fù)雜的句子結(jié)構(gòu)。
6.附件(Attachments)(可選)
如果郵件中包含文件(如文檔、圖片、表格等),你可以將它們作為附件添加到郵件中。確保附件的大小不超過(guò)收件人郵箱的限制,并提醒收件人檢查附件是否存在病毒或惡意軟件。
7.簽名(Signature)
郵件簽名通常位于正文的底部,包括你的全名、職位(如果適用)、公司名稱、聯(lián)系方式(如電話、郵箱等)以及可能的公司logo或社交媒體鏈接。簽名有助于建立你的專業(yè)形象,并方便收件人聯(lián)系你。
8.發(fā)送時(shí)間(Sent Time)
這不是由你手動(dòng)填寫的部分,而是郵件系統(tǒng)自動(dòng)記錄的。它顯示了郵件發(fā)送的確切時(shí)間,有助于收件人了解郵件的時(shí)效性。
9.優(yōu)先級(jí)(Priority)(可選)
一些郵件系統(tǒng)允許你設(shè)置郵件的優(yōu)先級(jí)(如高、中、低)。這有助于收件人根據(jù)郵件的重要性來(lái)安排閱讀順序。但請(qǐng)注意,不要濫用高優(yōu)先級(jí)標(biāo)記,以免降低其效果。
10.閱讀回執(zhí)(Read Receipt)(可選)
閱讀回執(zhí)是一種功能,當(dāng)你發(fā)送郵件時(shí),可以請(qǐng)求收件人在閱讀郵件后發(fā)送一個(gè)確認(rèn)回執(zhí)。這有助于你了解郵件是否已被閱讀,但請(qǐng)注意尊重收件人的隱私和意愿。
復(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"; }
抄送的郵箱會(huì)顯示在郵件的抄送列表,但是密送的郵箱不會(huì)顯示在郵件的收件人或抄送列表。
發(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ā)送來(lái)源 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);
的第二個(gè)參數(shù)必須設(shè)置為true,才會(huì)把第一個(gè)參數(shù)的內(nèi)容當(dāng)成html處理,否則會(huì)當(dāng)成普通文本處理。
注意:郵件html中不能寫javascript內(nèi)容,會(huì)被忽略。
發(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>歡迎來(lái)到 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ā)送來(lái)源 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) 對(duì)應(yīng),才能設(shè)置圖片成功, mimeMessageHelper.addInline(entry.getKey(), new ClassPathResource(entry.getValue())); } javaMailSender.send(mimeMessage); return "sendWithInlineImageHtml"; }
發(fā)送帶有附件、內(nèi)嵌資源時(shí),需要將MimeMessageHelper構(gòu)造方法的第二個(gè)參數(shù)設(shè)置為true,否則會(huì)拋出如下異常:
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ā)送來(lái)源 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ā)送來(lái)源 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)容,第二個(gè)參數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?Hystrix原理與注意事項(xiàng)小結(jié)
本文介紹了Hystrix的基本概念、工作原理以及其在實(shí)際開發(fā)中的應(yīng)用方式,通過(guò)對(duì)Hystrix的深入學(xué)習(xí),開發(fā)者可以在分布式系統(tǒng)中實(shí)現(xiàn)精細(xì)的錯(cuò)誤處理機(jī)制,并能夠及時(shí)響應(yīng)系統(tǒng)中的異常,避免服務(wù)的連鎖崩潰,感興趣的朋友一起看看吧2025-03-03一文帶你學(xué)會(huì)規(guī)則引擎Drools的應(yīng)用
Drools?就是一個(gè)開源的業(yè)務(wù)規(guī)則引擎,可以很容易地與?spring?boot?應(yīng)用程序集成,這篇文章就來(lái)和大家詳細(xì)聊聊Drools的具體應(yīng)用,需要的可以參考一下2023-03-03springboot如何查找配置文件路徑的順序和其優(yōu)先級(jí)別
此文是在工作中遇到的關(guān)于springboot配置文件的問(wèn)題,在網(wǎng)上查閱資料和自己測(cè)試之后記錄的,以便日后查閱。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08