3

ユーザーがメールをトリガーするたびに、新しい接続を取得してメールを送信するのではなく、接続を使用して送信されるように、常にメールサーバーに接続されたままのサービスを開発することを目的としています。JAVA Mail APIを使用して、常に電子メールサーバーへの接続を維持することは可能ですか??。親切にこれで私を助けてください。

4

3 に答える 3

4

SMTPサーバーに接続するとき(javax.mailAPIを使用するときも)、ソケット接続を使用します(SMTPTransportクラスとTransportクラスのsrcを参照)。ソケットを使用すると、リモートサーバーに接続でき、その接続は明示的に閉じられるまで開いたままになります。これは、理論的には接続を作成して再利用できることを意味します。

ただし、多くのSMTPサーバーは非常に悪意があり、「遅すぎる」場合やSMTPセッションを頻繁に再利用しようとすると、接続が切断されます。(私はあなたのためにpostfix設定を調べました。)

Java Mail APIを使用すると、いつでも接続を作成して閉じることができます。Smth。このような:

        Transport transport = session.getTransport("smtp");
        transport.connect();
        transport.sendMessage(msg, addressArray);
        // you can do transport.close(); later

connect()ただし、SMTPサーバーの状態が原因で、一度実行して忘れることはできません。せいぜい、あなたができることは、再接続することによって強制的な切断を適切に処理することです。これを行うための通知メカニズムがJavaMailAPIにあります(メソッドの使用法を見てくださいnotifyConnectionListeners

于 2011-11-25T10:25:02.447 に答える
1

ただし、SMTPサーバーの状態が原因で、connect()を一度実行して忘れることはできません。せいぜい、あなたができることは、再接続することによって強制的な切断を適切に処理することです。

同意しました!

実際には、以下のロジックでJavaMailSMTP接続を再利用できます。

Transport transport = null;
MimeMessage message = null;

Properties prop = new Properties();
// load all smtp properties

Session session = Session.getDefaultInstance(prop, null);
transport = session.getTransport("smtp");

for (EachMail eachMail : list) {
    if (!transport.isConnected()) {
        if (port != null && port.length() > 0) {
            transport.connect(host, Integer.parseInt(port), "<username>", "<password>");
        } else {
            transport.connect(host, "<username>", "<password>");
        }
    }

    // set all mail attributes from eachMail object
    message.saveChanges();
    transport.sendMessage(message, message.getAllRecipients());
}

チャームのように機能します。乾杯!

于 2015-06-19T07:59:11.883 に答える
1

常にアップ接続が必要な場合は、送信メソッドの外部にトランスポートを作成する必要がありますが、送信の例外を回避するために(SMTPSendFailedException 421タイムアウトデータクライアント)、トランスポートが接続されているかどうかを確認し、接続されていない場合は送信前に再度接続する必要があります。

 if (!transport.isConnected())//make sure the connection is alive
            transport.connect();
 transport.sendMessage(message, message.getAllRecipients());
于 2017-07-10T09:34:19.800 に答える