如何有效地使用javax.mail API发送批量邮件?&我们可以使用经过身份验证的重用会话来提高速度吗?


问题内容

我可以使用javax.mail API发送邮件。但是,这里的问题是平均每一封邮件大约需要4.3秒才能发送到目的地。

如果我要依次发送20封邮件,则大约需要86.599秒。对于我的要求,这种方法将行不通。我正在寻找一种可以在更短的时间内发送大量邮件的方法。

当我查看调试日志时,API尝试针对发送的每条消息向SMTP服务器进行身份验证。但是我只创建一个会话,并且对我发送的所有邮件都使用相同的会话。现在我的问题是,每次向smtp服务器进行身份验证时,这是否是一个开销过程?有没有更好的方法?

以下是您可能会发现有用的日志跟踪。

250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded

请让我知道您对此的想法,并对此表示任何帮助。

-纳伦德拉


问题答案:

您如何发送消息?该JavaMail的常见问题表明,静态Transport.send方法将打开每封邮件建立新的连接,因为它是创建一个合适的便捷方法Transport的实例,将其连接,调用sendMessage,然后再次关闭连接。如果您从那里获得了自己的Transport实例,则Session可以连接一次,然后sendMessage反复调用以在一个连接上发送多个消息,最后再发送一次close。遵循(未试用)的内容:

Transport t = session.getTransport();
t.connect();
try {
  for(Message m : messages) {
    m.saveChanges();
    t.sendMessage(m, m.getAllRecipients());
  }
} finally {
  t.close();
}