JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)
在配置JavaMail時,總是有一種有趣的方法。 基本上,您必須填寫無類型的地圖或屬性結構,并希望獲得正確的解釋。 網絡上無數(shù)的教程顯示了使其正常工作(發(fā)送/接收郵件)所需的最小屬性。
但是,正如我們痛苦地了解到的那樣,您可能需要注意一些鮮為人知的屬性,即套接字IO的超時設置。 默認情況下,JavaMail對所有套接字操作(連接,IO等)都使用無限超時!
現(xiàn)在,假設您有一簇SMTP服務器,它們可以處理通過DNS循環(huán)訪問的傳出郵件。 如果其中一臺服務器發(fā)生故障(恰好是JavaMail想要連接的服務器),則您的郵件發(fā)送線程將永遠掛起! 這正是發(fā)生在我們身上的事情,我們需要表演一些真正令人討厭的魔術來避免悲劇。
因此,我們現(xiàn)在為所有操作設置超時:
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的循環(huán)服務(例如Amazon S3)或在我們的示例中的郵件集群,請不要忘記配置Java的DNS緩存tiemout(默認情況下也是無限的):
// Only cache DNS lookups for 10 seconds java.security.Security.setProperty("networkaddress.cache.ttl","10");而且,在我們看來,將所有編碼設置為UTF-8(獨立于底層操作系統(tǒng))對我們來說是一個好主意,以提供穩(wěn)定的環(huán)境:
System.setProperty("file.encoding", Charsets.UTF_8.name()); System.setProperty("mail.mime.charset", Charsets.UTF_8.name());…您根本不想關心這樣的事情嗎? 隨意使用我們的開源Java庫SIRIUS ,它通過提供簡潔的fluet API發(fā)送郵件來處理所有這些工作: 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可能是邪恶的(并迫使您重新启动应用程序服务器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 您必须学习Java 8的函数式编程吗?
- 下一篇: 为什么要在Java的Serializab