使用Javamail库发送电子邮件时重用连接

时间:2017-04-01 20:56:39

标签: java performance email

我正在尝试使用JavaMail API发送大量电子邮件,并且发现我的代码中最慢的部分(每封电子邮件大约1秒)如下:

long startSendTime = System.currentTimeMillis();
Transport transport = mailSession.getTransport();
transport.connect();
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
transport.close();
long endTime = System.currentTimeMillis();
logger.info("Finished sending message, took: " + (endTime - startSendTime) + "ms");

我猜这是因为每封电子邮件都需要设置TCP连接。有没有办法为电子邮件发送连接池?是否有其他更高效的库我可以使用?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

根据您要查找的结果,您有多个选项。

使用当前的实现,您可以为套接字连接/断开连接添加额外的时间 - 这就是连接池将解决的问题。

选项1

使用连接池,结果是您获取已经建立的频道,并且您唯一的等待时间是实际发送该消息。

这样做的好处在于,您可以根据消息是否实际成功通过中继发送而返回响应 - 这仍然阻止网络IO,可能最长的调用

选项2

如果你不关心响应消息,或者可以稍后再回来 - 你可以选择将消息添加到其他地方的队列,其中一个独立的线程,独立于用户交互正在进行网络IO。这将导致执行速度更快,因为您最终在UI线程上没有阻塞调用。