SpringBoot配置Email發(fā)送功能

SpringBoot配置Email發(fā)送功能

相信使用過Spring的眾多開發(fā)者都知道Spring提供了非常好用的 JavaMailSender接口實(shí)現(xiàn)郵件發(fā)送溢陪。在Spring Boot的Starter模塊中也為此提供了自動(dòng)化配置萍虽。下面通過實(shí)例看看如何在Spring Boot中使用 JavaMailSender 發(fā)送郵件。

快速入門

在Spring Boot的工程中的 pom.xml 中引入 spring-boot-starter-mail 依賴:

<dependency>  
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>  

如其他自動(dòng)化配置模塊一樣形真,在完成了依賴引入之后杉编,只需要在 application.properties 中配置相應(yīng)的屬性內(nèi)容超全。

下面我們以QQ郵箱為例,在 application.properties 中加入如下配置(注意替換自己的用戶名和密碼):

spring.mail.host=smtp.qq.com  
spring.mail.username=用戶名  //發(fā)送方的郵箱
spring.mail.password=密碼  //對(duì)于qq郵箱而言 密碼指的就是發(fā)送方的授權(quán)碼
spring.mail.properties.mail.smtp.auth=true  
spring.mail.properties.mail.smtp.starttls.enable=true  
spring.mail.properties.mail.smtp.starttls.required=true  注意:在spring.mail.password處的值是需要在郵箱設(shè)置里面生成的授權(quán)碼邓馒,這個(gè)不是真實(shí)的密碼嘶朱。

通過單元測(cè)試來實(shí)現(xiàn)一封簡(jiǎn)單郵件的發(fā)送:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {

    @Autowired
    private JavaMailSender mailSender;

    @Test
    public void sendSimpleMail() throws Exception {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("dyc87112@qq.com");
        message.setTo("dyc87112@qq.com");
        message.setSubject("主題:簡(jiǎn)單郵件");
        message.setText("測(cè)試郵件內(nèi)容");

        mailSender.send(message);
    }

}

到這里,一個(gè)簡(jiǎn)單的郵件發(fā)送就完成了光酣,運(yùn)行一下該單元測(cè)試疏遏,看看效果如何?

由于Spring Boot的starter模塊提供了自動(dòng)化配置救军,所以在引入了 spring-boot-starter-mail 依賴之后财异,會(huì)根據(jù)配置文件中的內(nèi)容去創(chuàng)建 JavaMailSender 實(shí)例,因此我們可以直接在需要使用的地方直接 @Autowired 來引入郵件發(fā)送對(duì)象唱遭。

對(duì)于qq郵箱這樣寫過后會(huì)報(bào)錯(cuò):

1戳寸、異常信息:

nested exception is:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure. Failed messages: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure; message exception details (1) are:
Failed message 1:
javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2046)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:711)
at javax.mail.Service.connect(Service.java:366)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:501)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:307)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:296)

這種錯(cuò)誤一般是因?yàn)閖re的lib下C:\Program Files\Java\jdk1.8.0_51\jre\lib\security,替換2個(gè)jar包拷泽,參考文檔

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

2疫鹊、異常信息


at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:424)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:307)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:296)
at com.vcredit.ddcash.monitor.controller.AppTest.testSendSimple(AppTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)

發(fā)送方必須要開啟smtp,獲取到的授權(quán)碼司致,界面如下:

image

3拆吆、異常信息:

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: STARTTLS is required but host does not support STARTTLS. Failed messages: javax.mail.MessagingException: STARTTLS is required but host does not support STARTTLS; message exception details (1) are:
Failed message 1:
javax.mail.MessagingException: STARTTLS is required but host does not support STARTTLS
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:721)
at javax.mail.Service.connect(Service.java:366)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:501)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:307)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:296)
at com.vcredit.ddcash.monitor.controller.AppTest.testSendSimple(AppTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

換成公司企業(yè)郵箱報(bào)錯(cuò),通過將properties文件的內(nèi)容修改就可以了蚌吸,這里的用戶密碼就是自己的郵箱密碼(這點(diǎn)不同于qq郵箱)

1. 發(fā)送HTML格式的郵件

spring.mail.properties.mail.smtp.starttls.required=false```

@Test
public void testSendHtml() {
    MimeMessage message = null;
    try {
        message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(username);
        helper.setTo("398986099@qq.com");
        helper.setSubject("標(biāo)題:發(fā)送Html內(nèi)容");

        StringBuffer sb = new StringBuffer();
        sb.append("<h1>大標(biāo)題-h1</h1>")
          .append("<p style='color:#F00'>紅色字</p>")
          .append("<p style='text-align:right'>右對(duì)齊</p>");
        helper.setText(sb.toString(), true);
    } catch (MessagingException e) {
        e.printStackTrace();
    }

    javaMailSender.send(message);
}

注意:這里創(chuàng)建的是MimeMessageHelper锈拨,且在調(diào)用setText時(shí)需要在第二個(gè)參數(shù)傳入true,這樣才會(huì)使用HTML格式發(fā)送郵件

通過velocity模板發(fā)送郵件:

<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
</dependency>

@Autowired

private VelocityEngine velocityEngine;

@Test
public void sendTemplateMail() throws Exception {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("dingfuzhao@vcredit.com");
helper.setTo("dingfuzhao@vcredit.com");
helper.setSubject("主題:模板郵件");
Map<String, Object> model = new HashedMap();
model.put("username", "didi");
String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, "template.vm", "UTF-8", model);
helper.setText(text, true);
javaMailSender.send(mimeMessage);
}

在resources下建一個(gè)templates包 該包下建立一個(gè)文件template.vm羹唠,內(nèi)容以html格式隨便寫

<html>
<body>
<h3>你好奕枢, ${username}, 這是一封模板郵件!</h3>
</body>
</html>

測(cè)試結(jié)果:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佩微,隨后出現(xiàn)的幾起案子缝彬,更是在濱河造成了極大的恐慌,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷浅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī)一疯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺姑,“玉大人墩邀,你說我怎么就攤上這事≌嫡悖” “怎么了眉睹?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵荔茬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我竹海,道長(zhǎng)慕蔚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任斋配,我火速辦了婚禮孔飒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艰争。我一直安慰自己十偶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天蛛勉,我揣著相機(jī)與錄音鹿寻,去河邊找鬼。 笑死诽凌,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣诵,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了杜顺?” 一聲冷哼從身側(cè)響起财搁,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躬络,沒想到半個(gè)月后尖奔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穷当,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年提茁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馁菜。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茴扁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出火邓,到底是詐尸還是另有隱情丹弱,我是刑警寧澤德撬,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站躲胳,受9級(jí)特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坯苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粹湃,春花似錦恐仑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孤钦,卻和暖如春歧斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偏形。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工静袖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俊扭。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓队橙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親萨惑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捐康,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容