1

我有一个邮件守护程序,可以使用带有 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;
    }

}
4

1 回答 1

2

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

于 2012-05-23T05:36:46.133 回答