JavaMail SMTPTransport.isConnected()与Exchange服务器的速度非常慢

时间:2012-05-23 01:25:29

标签: performance javamail

我有一个邮件守护程序,可以使用带有SMTP的JavaMail(1.4.5)发送电子邮件通知。建议使用实例方法sendMessage()而不是静态Transport.send()。所以我在调用isConnected()之前测试与sendMessage()的连接。它可以在我的家用电脑上使用我的ISP的SMTP服务器正常工作。但是,当我在工作计算机上测试相同的代码时,速度要慢得多。 (我的工作计算机比我的家用计算机快得多。)所以我认为唯一的区别是它与公司的Exchange服务器进行对话。有人遇到过类似的问题吗?

- 带ISP的家用电脑:isConnected()需要10-100毫秒

- 使用Exchange工作的计算机: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 = "yourname@gmail.com";   //System.getProperty("user.name") + "@aaaa.com"
        String from = "yourname@gmail.com"; //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;
    }

}

1 个答案:

答案 0 :(得分:2)

当然,您可以先使用sendMessage而不先调用isConnected。我不知道为什么Exchange会这么慢。 isConnected方法只是向服务器发送NOOP命令以确保服务器仍在那里。服务器可能故意延迟其对NOOP命令的响应以防止滥用。