我必须面对以下情况。我想用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
类的抽象方法,因此是 SMTPTransport
的实现在我的案例中使用了来自 com.sun.mail.smtp
的内容。
我的问题不是:transport.connect()
的连接时间大约需要 5 秒,sendMessage
的发送时间也是如此。这意味着,如果我向 10 个收件人发送电子邮件,则需要 5 + (10*5) = ~55 秒。这太长了,想想当我们有 1000 个收件人时。
这正常吗?或者您知道是什么导致了这个问题,花了这么长时间吗?是否有其他(好的)sendMessage()
实现,或者 SMTPTransport
是此方法的默认用法?
信息:
这段代码分别在单独的线程中运行,因此电子邮件在后台发送。包含此片段的整个 servlet 在服务器集群上的 docker 容器中运行。因此,如果我并行化它,或者使用多个线程,我不知道该行为如何与该集群上的其他 servlet 保持一致。
最佳答案
而不是使用:
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);
这将向邮件服务器发送一个邮件请求,并将节省大量时间和请求。
关于java - 使用java邮件发送批量电子邮件需要太长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43913302/