[英]Sending bulkemails with java mail takes too long
我要注意以下情況。 我想使用Java郵件客戶端發送批量電子郵件。 這意味着我想一次發送很多電子郵件。 將它們全部放在“收件人”字段中的觀點是毫無疑問的,因為沒有收件人必須彼此見面(密件抄送不起作用,因為您仍然可以看到收件人)。 所以我要做的是,打開一個新的Transport
連接,對每個收件人使用sendMessage()
,然后關閉Transport
連接。 這是代碼片段:
Session session = Session.getInstance(smtpProps, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(authUser, authPass);
}
});
InputStream is = IOUtils.toInputStream(eml, "UTF-8");
MimeMessage message = new MimeMessage(session, is);
Transport transport = session.getTransport("smtp");
transport.connect(smtpServer, smtpPort, smtpUser, smtpPass);
Address[] recipients = message.getRecipients(RecipientType.TO);
for(Address address : recipients) {
message.setRecipient(RecipientType.TO, address);
transport.sendMessage(message, new Address[]{ address });
}
transport.close();
請記住, sendMessage()
方法是javax.mail.Transport
類的抽象方法,因此在我的案例中使用了com.sun.mail.smtp
SMTPTransport
的實現。
對我的問題不行: transport.connect()
的連接時間大約需要5秒, sendMessage
的發送時間也需要大約5秒。 這意味着,例如,如果我向10位收件人發送電子郵件,則需要5 +(10 * 5)=〜55秒。 好了,想想我們何時有1000個收件人。
這正常嗎? 還是花了這么長時間才知道是什么原因會導致問題? 還有其他(好的) sendMessage()
實現,還是SMTPTransport
是此方法的默認用法?
信息:
截取該代碼的for循環分別在單獨的線程中運行,因此電子郵件在后台發送。 包含此片段的整個servlet在servercluster的docker-container中運行。 因此,如果我將其並行化,或使用多個線程,則我不知道該行為與該集群上的其他servlet如何一致。
我想我找到了解決問題的辦法。 連接花費這么多時間似乎很正常。 我的問題是,附件必須每次大約4秒上載到smtp服務器。 對於整個請求,每次上載總計要花費非常長的時間。 因此,無需發送附件,請求就不會花費太多時間。 因此,在我的實現中沒有問題,而不是每次都上傳附件。
而不是使用:
Address[] recipients = message.getRecipients(RecipientType.TO);
for(Address address : recipients) {
message.setRecipient(RecipientType.TO, address);
transport.sendMessage(message, new Address[]{ address });
}
您應該使用:
Address[] recipients = message.getRecipients(RecipientType.TO);
message.addRecipients(RecipientType.CC, recipients);
這會將單個請求發送到郵件服務器,以節省郵件,並節省大量時間和請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.