1

SMTPでJavaMail(1.4.5)を使用して電子メール通知を送信するメールデーモンがあります。sendMessage()staticの代わりにinstanceメソッドを使用することをお勧めします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 に答える