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