javamail程序源码_JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)
javamail程序源碼
在配置JavaMail時,總是有一種有趣的方法。 基本上,您必須填寫無類型的地圖或屬性結構,并希望獲得正確的解釋。 網絡上無數的教程顯示了使其正常工作(發送/接收郵件)所需的最小屬性。
但是,正如我們痛苦地了解到的那樣,您可能需要注意一些鮮為人知的屬性,即套接字IO的超時設置。 默認情況下,JavaMail對所有套接字操作(連接,IO等)都使用無限超時!
現在,假設您有一簇SMTP服務器,它們可以處理通過DNS循環訪問的傳出郵件。 如果其中一臺服務器發生故障(恰好是JavaMail想要連接的服務器),則您的郵件發送線程將永遠掛起! 這正是發生在我們身上的事情,我們需要表演一些真正令人討厭的魔術來避免悲劇。
因此,我們現在為所有操作設置超時:
String MAIL_SMTP_CONNECTIONTIMEOUT ="mail.smtp.connectiontimeout";String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout";String MAIL_SMTP_WRITETIMEOUT = "mail.smtp.writetimeout";String MAIL_SOCKET_TIMEOUT = "60000"; // Set a fixed timeout of 60s for all operations - // the default timeout is "infinite"props.put(MAIL_SMTP_CONNECTIONTIMEOUT, MAIL_SOCKET_TIMEOUT);props.put(MAIL_SMTP_TIMEOUT, MAIL_SOCKET_TIMEOUT);props.put(MAIL_SMTP_WRITETIMEOUT, MAIL_SOCKET_TIMEOUT);另外,如果您打算訪問基于DNS的循環服務(例如Amazon S3)或我們的郵件集群,請不要忘記配置Java的DNS緩存tiemout(默認情況下也是無限的):
// Only cache DNS lookups for 10 seconds java.security.Security.setProperty("networkaddress.cache.ttl","10");而且,在我們看來,將所有編碼設置為UTF-8(獨立于底層操作系統)以提供穩定的環境對我們來說是一個好主意:
System.setProperty("file.encoding", Charsets.UTF_8.name()); System.setProperty("mail.mime.charset", Charsets.UTF_8.name());…您根本不想關心這樣的事情嗎? 隨意使用我們的開源Java庫SIRIUS ,它通過提供簡潔的fluet API發送郵件來處理所有這些工作: GitHub上的Sources 。
可以在集群管理器中找到一個用法示例:
@Partprivate MailService ms;private void alertClusterFailure() {...ms.createEmail().useMailTemplate("system-alert", ctx).toEmail(receiver).send();...}翻譯自: https://www.javacodegeeks.com/2014/06/javamail-can-be-evil-and-force-you-to-restart-your-app-server.html
javamail程序源碼
總結
以上是生活随笔為你收集整理的javamail程序源码_JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑桌面备忘录提醒软件(可以在电脑桌面记
- 下一篇: 苹果电脑虚拟存储在哪(苹果电脑设置虚拟内