Springboot發(fā)送郵件及所遇到的超時(shí)問題

本篇主要介紹的是如何在Springboot中發(fā)送郵件,這個(gè)場(chǎng)景很容易遇到,比如我們?cè)谧?cè)一個(gè)賬號(hào)的時(shí)候,系統(tǒng)會(huì)提示你接收一個(gè)郵件驗(yàn)證碼,這個(gè)時(shí)候,就需要在后臺(tái)配置相關(guān)參數(shù)并發(fā)送該郵件了。具體怎么實(shí)現(xiàn)的呢,請(qǐng)往下看:

    1. 添加pom依賴
      <!--郵件-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
    
    1. 獲取郵箱授權(quán)碼。這里以QQ郵箱為例,我們登陸QQ郵箱,找到設(shè)置-郵箱設(shè)置-賬戶-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù),選擇開啟POP3/SMTP服務(wù),此時(shí)會(huì)得到一個(gè)授權(quán)碼,妥善保管,以下會(huì)用到的。
      image.png
  • 3.applocation.properties中添加如下配置,yml文件請(qǐng)自行轉(zhuǎn)換格式

    # 郵箱相關(guān)變量
    #這里以QQ郵箱為例
    #QQ郵箱服務(wù)器
    spring.mail.host=smtp.qq.com
    #你的QQ郵箱賬戶
    spring.mail.username=123456@qq.com
    #你的QQ郵箱第三方授權(quán)碼
    spring.mail.password=xxxxxxxxxxxxxxxxx
    #編碼類型
    spring.mail.default-encoding=UTF-8
    #發(fā)送端口
    spring.mail.port=465
    #ssl
    spring.mail.properties.mail.smtp.ssl.enable=true
    
    • 注意,我在本地調(diào)試的時(shí)候,沒有加上面的發(fā)送端口ssl兩個(gè)配置,是沒問題的,正常的能發(fā)送,我的電腦是mac系統(tǒng);當(dāng)我將項(xiàng)目部署到我的一個(gè)windows服務(wù)器上的時(shí)候,郵箱發(fā)送這個(gè)功能就出現(xiàn)了問題,出現(xiàn)類似如下錯(cuò)誤信息
      ERROR: Problem while 
      sending     message: javax.mail.MessagingException: Could not connect to SMTP host: 
      smtp.qq.com, port: 25,     response: -1
    
    • 搜索了一圈解決方案,統(tǒng)一的解決方案是讓我添加發(fā)送端口配置項(xiàng),修改默認(rèn)的25端口為465端口,原因是QQ郵箱提供的幫助信息是這樣的:
      image.png
    • 我就正常的添加了發(fā)送端口這一項(xiàng)配置,可情況還是一樣,在mac上可以發(fā)送,但是在windows上報(bào)的錯(cuò)誤和上面一樣,只是其中的端口變成了port: 465。經(jīng)過了一些查詢,找到了這樣一句話:
      465端口(SMTPS):465端口是為SMTPS(SMTP-over-SSL)協(xié)議服務(wù)開放的,這是SMTP協(xié)議基于SSL安全協(xié)議之上的一種變種協(xié)議,
      它繼承了SSL安全協(xié)議的非對(duì)稱加密的高度安全可靠性,可防止郵件泄露。
      SMTPS和SMTP協(xié)議一樣,也是用來發(fā)送郵件的,只是更安全些,防止郵件被黑客截取泄露,
      還可實(shí)現(xiàn)郵件發(fā)送者抗抵賴功能。防止發(fā)送者發(fā)送之后刪除已發(fā)郵件,拒不承認(rèn)發(fā)送過這樣一份郵件。
      
    • 這時(shí)候我就懷疑是不是自己漏掉了郵箱的ssl配置,經(jīng)過搜索,得到了上面的ssl配置,此時(shí),windows上報(bào)超時(shí)的問題就解決了。


      image.png
    1. 定義發(fā)送郵件的實(shí)現(xiàn)類
    package com.mutou.jobs.service;
    
    import javax.annotation.Resource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.stereotype.Service;
    
    /** 郵件service.
     * @author 楊喜存
     * @since 2019/12/6 11:22 AM
     */
    @Service
    public class MailService {
      @Value("${spring.mail.username}")
      private String mail_username;
    
      @Resource
      private JavaMailSender mailSender;
    
      public void sendDefaultMail(String to, String subject, String content){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);//收信人
        message.setSubject(subject);//主題
        message.setText(content);//內(nèi)容
        message.setFrom(mail_username);//發(fā)信人
    
        mailSender.send(message);
      }
    }
    
    1. 就可以直接發(fā)送啦
    mailService.sendDefaultMail( "收件人的郵箱","主題", "郵件內(nèi)容");
    

這是之前實(shí)現(xiàn)過的,前天晚上部署的時(shí)候發(fā)現(xiàn)的問題,這里拿出來做個(gè)記錄,實(shí)現(xiàn)的代碼不是重點(diǎn),問題才是重點(diǎn);如果你也遇到相同的問題,希望能幫到你。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容