java Apache Commons电子邮件和重复使用SMTP连接

bkkx9g8r  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(222)

目前我正在使用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,但是性能有点让人头疼。
谢谢,兰森

eufgjt7s

eufgjt7s1#

在深入研究了commons源代码之后,我提出了下面的解决方案。这应该可以工作,但是可能有更好的解决方案,我不知道

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);

    Email email = new SimpleEmail();
    email.setFrom("example@example.com");
    email.addTo("example@example.com");
    email.setSubject("Hello Example");
    email.setMsg("Hello Example");
    email.setHostName("localhost"); // buildMimeMessage call below freaks out without this

    // dug into the internals of commons email
    // basically send() is buildMimeMessage() + Transport.send(message)
    // so rather than using Transport, reuse the one that I already have
    email.buildMimeMessage();
    Message m = email.getMimeMessage();
    transport.sendMessage(m, m.getAllRecipients());
2uluyalo

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
不知道该怎么继续...

相关问题