轉:
springboot java mail sender郵件發送超時
springboot java mail sender郵件發送超時
西門吹雪碧 2020-10-10 11:18:55 751 收藏
版權
正常來說,發送郵件在本地發送走25端口都不會有問題,但是部署到linux環境就失敗?看過很多博主寫的,大多相互抄襲,不妨看看下面的解決方案吧。
1. 有關 SpringBoot 郵件服務
Spring Framework 自己有一套基於 JavaMail 的郵件服務包 org.springframework.mail,並通過 JavaMailSender 接口提供了一種簡易的發送郵件的方式。這樣,開發人員就可以不用操心底層的郵件系統,使用 Spring 提供的接口即可方便地使用郵件服務。官方文檔:https://docs.spring.io/spring/docs/5.0.10.RELEASE/spring-framework-reference/integration.html#mail
而在 SpringBoot 中,提供了更為簡便的自動配置,又進一步簡化了開發人員工作。官方文檔:https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#boot-features-email 。下面介紹一下 SpringBoot 中配置郵件服務的具體方法。
2. 具體操作
2.1 添加 Maven 依賴
想要使用 SpringBoot 的郵件服務,需要依賴 spring-boot-starter-mail。所以在 pom 中添加依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.2 配置 yml
一定要注意的點是,25接口有可能被運營商封了,為了驗證,可以使用命令 telnet smtp.163.com 25,測試接口是否是可聯通的。
如果不行,我們考慮使用465接口,該接口需要ssl證書驗證,因此需要做一些權限相關的配置。具體為:starttls、socketFactory下的配置。
host: 為郵件服務的地址。一般在郵箱設置中可以看到。
port: 端口號。不同的服務商端口號可能不同,這個也需要自行查看。
username: 為登錄郵箱的用戶名。
password: 這個不是郵箱登錄密碼,而是第三方授權碼。在郵箱設置中或者幫助文檔中會有介紹,需要開通第三方授權。
properties: 其它參數。如果需要使用 SSL 方式,需要配置 mail.smtp.starttls.enable 為 true。有關詳細的參數說明見文檔https://javaee.github.io/javamail/#Development_Releases
有關 SpringBoot 中 auto-configuration 的參數見源碼:
————————————————
版權聲明:本文為CSDN博主「西門吹雪碧」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sduliding/article/details/108993306
轉:
JavaMail 發送郵件阻塞問題解決——設置 smtp 超時時間
背景
最近發現項目中有關發送郵件的模塊偶爾會阻塞住,導致整個線程阻塞。詭異的是沒有捕獲到任何異常日志,程序莫名其妙就卡在了 sendMail 上。
后來想到發送郵件的內容過大,可能由於這個原因導致,所以找了一下有關 JavaMail 超時設置的資料。現做整理,順便聊聊一些小坑。
JavaMail smtp 超時參數
參數 | 類型 | 描述 |
---|---|---|
mail.smtp.connectiontimeout | int | Socket connection timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout. |
mail.smtp.timeout | int | Socket read timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout. |
mail.smtp.writetimeout | int | Socket write timeout value in milliseconds. This timeout is implemented by using a java.util.concurrent.ScheduledExecutorService per connection that schedules a thread to close the socket if the timeout expires. Thus, the overhead of using this timeout is one thread per connection. Default is infinite timeout. |
源自 JavaMail API,文末有鏈接。
參數簡介
- mail.smtp.connectiontimeout:連接時間限制,單位毫秒。是關於與郵件服務器建立連接的時間長短的。默認是無限制。
- mail.smtp.timeout:郵件接收時間限制,單位毫秒。這個是有關郵件接收時間長短。默認是無限制。
- mail.smtp.writetimeout:郵件發送時間限制,單位毫秒。有關發送郵件時內容上傳的時間長短。默認同樣是無限制。
大部分博客、資料都提到了前兩個屬性,而容易忽略最后一個。因為我是用來發送郵件的,所以上傳郵件的內容過大是導致發送模塊阻塞的原因。而設置 writetimeout 時間后,再超時時就會報異常,捕獲處理下就可以了。
在 SpringBoot 中的配置
我所用的是 SpringBoot 工程,之前也發表過一篇有關 SpringBoot 配置郵件的博客:SpringBoot 配置郵件服務
只需要在原有配置的基礎上,加上如下設置即可。
spring: |
站在前人的肩膀上前行,感謝以下資料的支持。
- 本文鏈接: https://www.interhorse.cn/a/2959154794/
- 版權聲明: 本博客所有文章除特別聲明外,均采用 BY-NC-SA 許可協議。轉載請注明出處!