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

我想向不同的收件人发送数千封不同的电子邮件,并希望打开与我的SMTP的连接并保留它。 我希望这更快,然后重新打开ervy邮件的连接。 我想使用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(); 

这是我的表演测试课程。 使用一个连接发送邮件的速度要快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(); 

您可以使用早期代码,但添加以下内容以获取基础会话

 email.getMailSession(); 

您可以添加额外的Java邮件属性

 email.getMailSession().getProperties().put(, ); 

请查看http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html 。 有一个示例显示如何发送电子邮件。 您应该能够在传输上调用close()之前发送更多内容。