目前我正在使用Commons Email发送电子邮件,但我一直无法找到一种方法来共享发送的电子邮件之间的smtp连接。我有如下代码:
Email email = new SimpleEmail();
email.setFrom("example@example.com");
email.addTo("example@example.com");
email.setSubject("Hello Example");
email.setMsg("Hello Example");
email.setSmtpPort(25);
email.setHostName("localhost");
email.send();
这是非常可读的,但当我处理大量消息时速度很慢,我相信这是为每个消息重新连接的开销。因此,我使用以下代码对其进行了分析,并发现使用重用传输使速度提高了大约三倍。
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
Session mailSession = Session.getDefaultInstance(props, null);
Transport transport = mailSession.getTransport("smtp");
transport.connect("localhost", 25, null, null);
MimeMessage message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress("example@example.com"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress("example@example.com"));
message.setSubject("Hello Example");
message.setContent("Hello Example", "text/html; charset=ISO-8859-1");
transport.sendMessage(message, message.getAllRecipients());
所以我想知道是否有一种方法可以让Commons Email重复使用SMTP连接来发送多封邮件?我更喜欢Commons Email API,但是性能有点让人头疼。
谢谢,兰森
2条答案
按热度按时间eufgjt7s1#
在深入研究了commons源代码之后,我提出了下面的解决方案。这应该可以工作,但是可能有更好的解决方案,我不知道
2uluyalo2#
通过使用getMailSession()从第一封邮件中获取邮件会话,然后使用setMailSession()将其放到所有后续邮件中,难道我们不能更容易地实现这一点吗?
不是100%确定
请注意,传递用户名和密码(在邮件验证的情况下)将创建一个具有DefaultAuthenticator的新邮件会话。这是一个方便的操作,但可能会出现意外情况。如果使用邮件验证但未提供用户名和密码,则实现将假定您已设置验证器并将使用现有邮件会话(如预期)。
但是,来自javadoc的代码意味着:-/http://commons.apache.org/email/api-release/org/apache/commons/mail/Email.html#setMailSession%28javax.mail.Session%29
另请参见:https://issues.apache.org/jira/browse/EMAIL-96
不知道该怎么继续...