技術(shù):springboot2 + freemarker +郵件
運(yùn)行環(huán)境:idea + maven + jdk1.8?
概述
基于freemarker發(fā)送模板郵件,圖片郵件包晰,文本郵件等湿镀】晃基于ftl模板,郵件樣式美觀勉痴。
詳細(xì)
一赫模,前言
FreeMarker是一種模板引擎:即一種基于模板并且要改變的數(shù)據(jù),并同時(shí)生成輸出文本(HTML網(wǎng)頁(yè)蒸矛,電子郵件瀑罗,配置文件,源代碼等)的通用工具雏掠。它不是面向最終用戶的斩祭,而是一個(gè)Java的類庫(kù),是一款程序員可以嵌入他們所開(kāi)發(fā)產(chǎn)品的組件乡话。【百度百科】
二摧玫,效果預(yù)覽
三,程序?qū)崿F(xiàn)
1绑青,項(xiàng)目結(jié)構(gòu)圖
2诬像,相關(guān)參數(shù)配置
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">彈簧:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
??郵件:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????#設(shè)置郵箱主機(jī)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????主持人:smtp.ym.163.com</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????#設(shè)置用戶名</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????用戶名:lnbld@bld365.com</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????#這里不是注冊(cè)時(shí)的密碼,而是生成的授權(quán)碼</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????密碼:“ bld123456”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????端口:465</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????默認(rèn)編碼:UTF-8</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????特性:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
??????郵件:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
????????smtp:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
??????????#設(shè)置是否需要認(rèn)證闸婴,如果為true坏挠,那么用戶名和密碼就必須</font></font><font></font>
??????????auth:?true<font></font>
??????????starttls:<font></font>
????????????#加密通訊,true開(kāi)啟邪乍,false不開(kāi)啟<font></font>
????????????enable:?true<font></font>
????????????#是否必須通過(guò)使用加密通訊進(jìn)行通訊降狠,true開(kāi)啟,false不開(kāi)啟<font></font>
????????????required:?true<font></font>
??????????socketFactory:<font></font>
????????????port:?465<font></font>
????????????class:?javax.net.ssl.SSLSocketFactory<font></font>
????????????fallback:?false
3庇楞,測(cè)試類
packagecom.sylujia.mail;<font></font>
<font></font>
importcom.sylujia.mail.service.MailService;<font></font>
importlombok.extern.slf4j.Slf4j;<font></font>
importorg.junit.Test;<font></font>
importorg.junit.runner.RunWith;<font></font>
importorg.springframework.beans.factory.annotation.Autowired;<font></font>
importorg.springframework.boot.test.context.SpringBootTest;<font></font>
importorg.springframework.test.context.junit4.SpringRunner;<font></font>
<font></font>
importjava.util.HashMap;<font></font>
importjava.util.Map;<font></font>
<font></font>
@Slf4j<font></font>
@RunWith(SpringRunner.class)<font></font>
@SpringBootTest<font></font>
publicclassMailServiceTest?{<font></font>
<font></font>
????@Autowired<font></font>
????privateMailService?mailService;<font></font>
<font></font>
????@Test<font></font>
????publicvoidsendTemplateMailTest(){<font></font>
????????Map<String,?Object>?mailContentMap?=?newHashMap<>();<font></font>
????????mailContentMap.put("contactName",?"sylujia");<font></font>
????????mailContentMap.put("platformAddr",?"https://www.baidu.com");<font></font>
????????mailContentMap.put("loginName",?"sylujia");<font></font>
????????mailContentMap.put("loginPswd",?"123456");<font></font>
????????mailContentMap.put("payPswd",?"123456");<font></font>
????????mailContentMap.put("contactMail",?"xxx@163.com");<font></font>
????????mailContentMap.put("contactPhone",?"13144112255");<font></font>
????????try{<font></font>
????????????mailService.sendTemplateMail("系統(tǒng)賬號(hào)開(kāi)通",?"xxx@163.com","AccountOpenMail.ftl",?mailContentMap);<font></font>
????????}?catch(Exception?e)?{<font></font>
????????????log.error("賬號(hào)開(kāi)通郵件發(fā)送失敯衽洹:{}",?mailContentMap?,?e);<font></font>
????????}<font></font>
????????log.info("郵件發(fā)送成功");<font></font>
????}<font></font>
<font></font>
<font></font>
<font></font>
}
4,郵件服務(wù)
packagecom.sylujia.mail.service.impl;<font></font>
<font></font>
importcom.sylujia.mail.service.MailService;<font></font>
importfreemarker.template.Configuration;<font></font>
importlombok.extern.slf4j.Slf4j;<font></font>
importorg.springframework.beans.factory.annotation.Autowired;<font></font>
importorg.springframework.beans.factory.annotation.Value;<font></font>
importorg.springframework.mail.javamail.JavaMailSender;<font></font>
importorg.springframework.mail.javamail.MimeMessageHelper;<font></font>
importorg.springframework.stereotype.Service;<font></font>
importorg.springframework.ui.freemarker.FreeMarkerTemplateUtils;<font></font>
<font></font>
importjavax.mail.internet.MimeMessage;<font></font>
importjava.util.Map;<font></font>
<font></font>
@Slf4j<font></font>
@Service<font></font>
publicclassMailServiceImpl?implementsMailService?{<font></font>
<font></font>
????@Autowired<font></font>
????privateJavaMailSender?mailSender;<font></font>
<font></font>
????@Value("${spring.mail.username}")<font></font>
????privateString?from;<font></font>
<font></font>
????@Override<font></font>
????publicbooleansendTemplateMail(String?title,?String?toUser,?String?templateName,?Map<String,?Object>?params)?{<font></font>
????????try{<font></font>
<font></font>
????????????MimeMessage?mimeMessage?=?mailSender.createMimeMessage();<font></font>
????????????MimeMessageHelper?helper?=?newMimeMessageHelper(mimeMessage,?true);<font></font>
????????????//?發(fā)件人<font></font>
????????????helper.setFrom(from);<font></font>
????????????//收件人<font></font>
????????????helper.setTo(toUser);<font></font>
????????????//郵件標(biāo)題<font></font>
????????????helper.setSubject(title);<font></font>
<font></font>
????????????Configuration?configuration?=?newConfiguration(Configuration.VERSION_2_3_28);<font></font>
????????????configuration.setClassForTemplateLoading(this.getClass(),?"/templates");<font></font>
????????????String?text?=?FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(templateName),?params);<font></font>
????????????////?text:內(nèi)容姐刁,true:為HTML郵件(false則為普通文本郵件)<font></font>
????????????helper.setText(text,?true);<font></font>
????????????mailSender.send(mimeMessage);<font></font>
<font></font>
????????}?catch(Exception?e)?{<font></font>
????????????log.error("sendTemplateMail?發(fā)送模板郵件錯(cuò)誤芥牌,",?e);<font></font>
????????????thrownewRuntimeException(e);<font></font>
????????}<font></font>
????????returntrue;<font></font>
????}<font></font>
<font></font>
}
四,總結(jié)
郵件發(fā)送本地(Windows環(huán)境)能測(cè)試成功聂使,部署到linux服務(wù)器后一直報(bào)錯(cuò)?
1個(gè)com.sun.mail.util.MailConnectException:?Couldn't?connect?to?host異常解決
重要信息失敗的消息:com.sun.mail.util.MailConnectException:無(wú)法連接到主機(jī)和22壁拉。首先想到的是linux的端口22沒(méi)有開(kāi)通,遂聯(lián)系相關(guān)人員開(kāi)通柏靶,但是可能出于安全考慮沒(méi)有同意開(kāi)通弃理。?
沒(méi)辦法,只能更換端口了屎蜓,需要對(duì)配置進(jìn)行修改痘昌,這里我換的465端口,具體看上面的配置信息。
如果注意的是云服務(wù)器辆苔,例如阿里云算灸,騰訊云等。需要注意驻啤,他們出于安全考慮可能會(huì)限制郵件端口菲驴,這個(gè)需要咨詢,實(shí)在不行就改用465 ssl端口發(fā)送郵件骑冗。