2012-09-20 352 views
4

我已经写了一个批量发送电子邮件的方法,但是它非常慢(每10秒约3封邮件)。我想发送数千封邮件。有没有办法做得更快?Javamail,Transport.send()很慢

我现在使用gmail,但只用于测试,最后我想用我自己的SMTP服务器发送。

下面是代码:

public boolean sendMessages() 
{ 
    try 
    { 
     Session session = Session.getInstance(this._properties, new javax.mail.Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication("user", "password"); 
      } 
     }); 
     MimeMessage message = new MimeMessage(session); 
     message.setFrom(new InternetAddress(this.getFrom())); 


     message.setSubject(this.getSubject()); 
     message.setText(this.getBody());     
     for (int i = 0, c = this._addresses.size(); i < c; i++) 
     { 
      message.setRecipient(Message.RecipientType.TO, new InternetAddress(this._addresses.get(i)));      
      Transport.send(message); 
     } 
     return true; 
    } 
    catch(AuthenticationFailedException e) { 
     e.printStackTrace(); 
      return false; 
    } 
    catch(MessagingException e) { 
     e.printStackTrace(); 
      return false; 
    } 
} 
+0

我期望的限制是服务器如何快速接受电子邮件。你应该期望你自己的邮件服务器处理速度超过每秒10。 –

+2

您可以通过将Transport.send调用替换为:message.saveChanges();来测量JavaMail可以创建消息的速度。 message.writeTo(new BufferedOutputStream(new FileOutputStream(“msg.txt”)));如果发送到您的服务器比这慢,这很可能是由于网络性能,协议开销或服务器的速度。 –

+1

['MimeMessage.saveChanges'可以触发DNS查找](https://stackoverflow.com/questions/44435457/mimemessage-savechanges-is-really-slow)这将甩掉你的基准。 – jmehrens

回答

6

好的,谢谢您的建议。

我的解决办法是:

Transport transport = session.getTransport("smtp"); 
transport.connect(this._properties.getProperty("mail.smtp.host"), 
Integer.parseInt(this._properties.getProperty("mail.smtp.port")), 
    this._properties.getProperty("mail.smtp.user"), 
    this._properties.getProperty("mail.smtp.password")); 

Address[] addr = new Address[this._addresses.size()]; 
for (int i = 0, c = this._addresses.size(); i < c; i++) 
{ 
    addr[i] = new InternetAddress(this._addresses.get(i)); 
} 

transport.sendMessage(message, addr);