Javamail,Transport.send() 非常慢
Posted
技术标签:
【中文标题】Javamail,Transport.send() 非常慢【英文标题】:Javamail, Transport.send() very slow 【发布时间】:2012-09-12 23:37:30 【问题描述】:我写了一个批量发送电子邮件的方法,但它非常慢(每 10 秒大约 3 封邮件)。我想发送数千封邮件。有什么方法可以更快地做到这一点?
我现在使用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;
【问题讨论】:
我希望限制是服务器接受电子邮件的速度。您应该期望自己的邮件服务器每秒处理超过 10 个。 您可以通过将 Transport.send 调用替换为: message.saveChanges(); 来衡量 JavaMail 创建消息的速度。 message.writeTo(new BufferedOutputStream(new FileOutputStream("msg.txt")));如果发送到您的服务器的速度比这慢,这很可能是由于网络性能、协议开销或服务器的速度。MimeMessage.saveChanges
can trigger a DNS lookup 这会偏离你的基准。
【参考方案1】:
好的,谢谢你的建议。
我的解决办法是:
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);
【讨论】:
以上是关于Javamail,Transport.send() 非常慢的主要内容,如果未能解决你的问题,请参考以下文章