2012-05-23 1 views
0

У меня есть почтовый демон для отправки уведомлений по электронной почте с помощью 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; 
    } 

} 
+0

Хотели бы вы, чтобы получить обмен, пошлите вверх? Недавно я заметил, что send() намного быстрее, чем sendMessage через наш сервер Exchange, но не уверен, что это сеть или программное обеспечение (наши или Exchange). – ledlogic

ответ

1

Вы можете, конечно, использовать SendMessage без вызова IsConnected первым. Я понятия не имею, почему это было бы намного медленнее с Exchange. Метод isConnected просто отправляет команду NOOP на сервер, чтобы убедиться, что сервер все еще существует. Сервер может преднамеренно откладывать свой ответ на команду NOOP для предотвращения злоупотреблений.

Смежные вопросы