簡體   English   中英

用Java郵件發送bulkemails花費的時間太長

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM