ユーザーがメールをトリガーするたびに、新しい接続を取得してメールを送信するのではなく、接続を使用して送信されるように、常にメールサーバーに接続されたままのサービスを開発することを目的としています。JAVA Mail APIを使用して、常に電子メールサーバーへの接続を維持することは可能ですか??。親切にこれで私を助けてください。
3 に答える
SMTPサーバーに接続するとき(javax.mail
APIを使用するときも)、ソケット接続を使用します(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
)
ただし、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());
}
チャームのように機能します。乾杯!
常にアップ接続が必要な場合は、送信メソッドの外部にトランスポートを作成する必要がありますが、送信の例外を回避するために(SMTPSendFailedException 421タイムアウトデータクライアント)、トランスポートが接続されているかどうかを確認し、接続されていない場合は送信前に再度接続する必要があります。
if (!transport.isConnected())//make sure the connection is alive
transport.connect();
transport.sendMessage(message, message.getAllRecipients());