java - 使用java邮件发送批量电子邮件需要太长时间

标签 java email smtp jakarta-mail

我必须面对以下情况。我想用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/

相关文章:

email - Outlook 2007 HTML电子邮件呈现错误(水平空白)需要解决方法

java - 无法连接到 SMTP 主机 : {remote-server}, 端口 : {port}, 响应:-1

java - 如何从Java中的邮件服务器捕获电子邮件?

java - 从 Java Action 监听器返回一个字符串

css - 使用内联 CSS 的 GMail 电子邮件中的水印 - 无法使用 STYLE 标签 - 在电子邮件正文中心覆盖透明图像

email - 如何在 Go 中解码邮件正文

c# - 在 C# Windows 应用程序中通过电子邮件发送附件

Java if 条件检查空值和 null 值

java - 哪种更好的方式通过 Tomcat 提供文件(用于下载)?

java - 本地构建时自动重建依赖项目