У меня есть почтовый демон для отправки уведомлений по электронной почте с помощью JavaMail (1.4.5) с SMTP. Рекомендуется использовать метод экземпляра sendMessage()
вместо статического Transport.send()
. Поэтому я тестирую соединение с isConnected()
перед вызовом sendMessage()
. Он отлично работает на моем домашнем компьютере с моим SMP-сервером ISP. Однако, когда я тестирую один и тот же код на своем рабочем компьютере, он намного медленнее. (Мой рабочий компьютер намного быстрее моего домашнего компьютера.) Поэтому я думаю, что единственное различие заключается в том, что он разговаривает с сервером Exchange. Кто-нибудь сталкивался с подобными проблемами?JavaMail SMTPTransport.isConnected() очень медленный с сервером Exchange
-Home компьютер с Интернет-провайдером: isConnected()
принимает 10-100ms
-Работа компьютер с обменом: isConnected()
занимает 5с.
-Если я использую статический Transport.send()
для отправки сообщения (нет необходимости тестировать соединение), он занимает около 300 мс на моем рабочем компьютере.
Вот пример кода:
public class TestMail {
static Session session;
static InternetAddress fromAddr;
static InternetAddress[] toAddr;
static int n = 1;
public static void main(String[] args) throws MessagingException {
String to = "[email protected]"; //System.getProperty("user.name") + "@aaaa.com"
String from = "[email protected]"; //System.getProperty("user.name") + "@aaaa.com"
Properties props = new Properties();
props.put("mail.smtp.host", "mail.optonline.net");
// props.put("mail.smtp.host", "mail.aaaa.com");
session = Session.getInstance(props);
fromAddr = new InternetAddress(from);
toAddr = new InternetAddress[] { new InternetAddress(to) };
Transport bus = session.getTransport("smtp");
bus.connect();
String body = "This is the body of the email.\n";
for (int i = 1; i <= n; ++i) {
Message msg = createMessage(i + "th email", body);
long stime = System.currentTimeMillis();
if (!bus.isConnected()) {
System.out.println("Connecting ....");
bus.connect();
}
long etime = System.currentTimeMillis();
long isConnectedTime = etime - stime;
stime = etime;
bus.sendMessage(msg, toAddr);
// Transport.send(msg);
etime = System.currentTimeMillis();
long sendTime = etime - stime;
System.out.printf("IsConnected: %d, Sending: %d\n", isConnectedTime, sendTime);
}
bus.close();
}
public static Message createMessage(String subject, String body)
throws MessagingException {
Message msg = new MimeMessage(session);
msg.setFrom(fromAddr);
msg.setRecipients(Message.RecipientType.TO, toAddr);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(body);
msg.saveChanges();
return msg;
}
}
Хотели бы вы, чтобы получить обмен, пошлите вверх? Недавно я заметил, что send() намного быстрее, чем sendMessage через наш сервер Exchange, но не уверен, что это сеть или программное обеспечение (наши или Exchange). – ledlogic