javax.mail
を使用してメールを送信しようとしました。メールの送信中に、次の例外が発生しました。
**sendMail - Message Sending Failed: Invalid Addresses;
nested exception is:
javax.mail.SendFailedException: 550 #5.1.0 Address rejected.2013-02-28 13:17:08,236**
何が問題なのでしょうか?
これは、受信サーバーが電子メールアドレスのメールボックス(「@」の前の部分)を認識しないことを意味します。スペルが間違っているか、単に存在しない名前であるか、受信サーバーがコード550で応答することによってメッセージ(スパムなど)を拒否するように設定されている可能性があります。
これは、SMTP応答コードを要約し、関連するさまざまなRFCへのリンクを提供する多くのページの1つです。 http://www.greenend.org.uk/rjk/tech/smtpreplies。 html 。
編集:私はあなたの質問に答えるためにコメントが許すより少し多くのスペースが必要です。
@ RaghuKing、Javadoc for _javax.mail.SendFailedException
_を見ると、そのような例外オブジェクト(catch
ブロック内)で3つのメソッドを呼び出すことができることがわかります。
getInvalidAddresses()
無効であるために送信されないアドレスの配列を取得するには、getValidSentAddresses()
は、このメッセージが正常に送信されたアドレスの配列を取得し、getValidUnsentAddresses()
は、有効であるがメッセージの送信先ではないアドレスの配列を取得します。(明らかに、複数の受信者にメッセージを送信すると、成功するものと失敗するものがありますが、成功の数に関係なく、少なくとも1つの失敗がある場合は例外がスローされます。もちろん、1つのアドレスのみに送信する場合も、これらの配列の1つだけにその1つのアドレスがあり、おそらくValidSentリストにはありません。
これらの配列は、アドレスが含まれる配列のタイプに応じて、例外の処理方法に関する詳細情報を提供します。これは明らかにアプリケーションによって異なりますが、これらは妥当な提案である可能性があります。
しかし、結局のところ、常識を適用しなければならないのはあなたであり、おそらくあなたがそれらを理解するまであなたが理解していない機能を少し実験してください。
このコードは、無効なアドレスのログを出力できます。
try {
sender.send(message);
}catch (MailSendException me){
detectInvalidAddress(me);
}
private void detectInvalidAddress(MailSendException me) {
Exception[] messageExceptions = me.getMessageExceptions();
if (messageExceptions.length > 0) {
Exception messageException = messageExceptions[0];
if (messageException instanceof SendFailedException) {
SendFailedException sfe = (SendFailedException) messageException;
Address[] invalidAddresses = sfe.getInvalidAddresses();
StringBuilder addressStr = new StringBuilder();
for (Address address : invalidAddresses) {
addressStr.append(address.toString()).append("; ");
}
logger.error("invalid address(es):{}", addressStr);
return;
}
}
logger.error("exception while sending mail.", me);
}
これと同じ例外が発生しました。不明なユーザーにメールを送信できないことに気付きました。相談したところ、SMTPサーバーがオープンメールリレーサーバーではないことがわかりました オープンメールリレー 。