如何在一个会话中发送多封电子邮件?

9
我希望向不同的收件人发送成千上万封不同的电子邮件,并希望打开与我的SMTP的连接并保持它。我希望这比为每封邮件重新打开连接更快。我想使用Apache Commons Email实现这一目标,但如有必要可以退而使用Java Mail API。
目前,我正在做以下操作,每次都会打开和关闭连接:
HtmlEmail email = new HtmlEmail();
email.setHostName(server.getHostName());
email.setSmtpPort(server.getPort());
email.setAuthenticator(new DefaultAuthenticator(server.getUsername(), server.getPassword()));
email.setTLS(true);
email.setFrom("test@example.com");
email.addTo(to);
email.setSubject(subject);
email.setHtmlMsg(htmlMsg);
email.send();

1
保持会话开启并发送1000封电子邮件,最后关闭会话。 - Buhake Sindi
你知道使用Commons Email是否可以实现这个吗? - Tim Büthe
好像不是这样的...我完全使用JavaMail。 - Buhake Sindi
3个回答

20

这是我的性能测试类。使用一个连接发送邮件比每次重新打开连接(当你使用commons mail时会发生)快4倍。通过使用多个线程,性能可以进一步提高。

    Properties properties = System.getProperties();
    properties.put("mail.smtp.host", server);
    properties.put("mail.smtp.port", "" + port);

    Session session = Session.getInstance(properties);
    Transport transport = session.getTransport("smtp");

    transport.connect(server, username, password);

    for (int i = 0; i < count; i++) {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] address = {new InternetAddress(to)};
        message.setRecipients(Message.RecipientType.TO, address);

        message.setSubject(subject + "JavaMail API");
        message.setSentDate(new Date());

        setHTMLContent(message);
        message.saveChanges();
        transport.sendMessage(message, address);

    }

    transport.close();

3
您可以使用之前的代码,但添加以下内容以获取底层会话。
email.getMailSession();

您可以通过以下方式添加额外的Java邮件属性:

email.getMailSession().getProperties().put(<key>, <value>);

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接