JavaMailのメール送信が失敗するケースとその説明の分析
[オリジナルセグメンテーションフォールト https://segmentfault.com/a/1190000008030346
前書き
JavaMailの使い方自体は難しくなく、Web上にわかりやすい例題がかなりあり、中国語の注釈も詳しく書かれています。しかし、JavaMailの仕組みがうまく設定されておらず、特に例外エラーの参考情報が少なすぎて、初心者を苦しめることが多く、私もその一人である。ここでは、同じ失敗を繰り返して時間を無駄にしないように、私が遭遇した落とし穴をまとめます。(注:今後も新たな問題に遭遇した場合は、ここで更新していく予定です)
I. JavaMailの概要
JavaMailは、Sunが定義した電子メールを送受信するためのAPI群であり、異なるベンダーが独自の実装クラスを提供することができます。ただし、JDKには含まれておらず、JavaEEの一部として含まれています。
ベンダーが提供するJavaMailサービスアプリケーションは、オプションで特定のメールプロトコルを実装することができ、一般的なメールプロトコルには次のようなものがあります。
-
SMTP:Simple Mail Transfer Protocol、電子メールの送信に使用されるトランスポートプロトコル。
-
POP3:電子メールを受信するための標準的なプロトコル。
-
IMAP。インターネットメッセージプロトコルで、POP3の代替プロトコル。
この3つのプロトコルには、SSL暗号化通信に対応した、SMTPS、POP3S、IMAPSがあります。JavaMailサービスプロバイダに加え、JavaMailは、MIME (Multipurpose Internet Mail Extensions)、URLページ、ファイル添付を含むプレーンテキストでないメールコンテンツを扱うためのJAF (JavaBeans Activation Framework)を必要とします。下図は、JavaMailのアーキテクチャを表したものです。
(画像出典 http://blog.csdn.net/t12x3456... )
-
mail.jar: このJARファイルには、JavaMail APIと、Sunが提供するSMTP、IMAP、POP3サービスプロバイダが含まれています。
-
activation.jar。この JAR ファイルには、JAF API と Sun の実装が含まれています。
(JavaMailの紹介は部分的にしか行いませんので、詳しい紹介は http://blog.csdn.net/zapldy/a... )
II. 様々な問題点と分析ノート
後述のエラーメッセージは、Sessionのデバッグモードを有効にする必要があり、以下のように設定されています。
Session sendMailSession = Session.getInstance(pro, authenticator);
sendMailSession.setDebug(true);
1. バックエンドでは、メールは正常に送信されたが、受信されていないことが示されている
問題現象
メール送信にsinaのメールボックスを使用して、メールを送信するために2つの方法を試して、次のとおりです。 中国 .cnからA 中国 .cn"と"A 中国 .cnからBへ 中国 .cn"の場合、サマリーセクションバックエンドは次のようなメッセージを表示します。
250 ok queue id 355937395546
QUIT
221 smtp-5-121.smtpsmail.fmail.xd.sinanode.com
Sent message ***@sina.cn successfully ....
Sent message using 163 email 尝试[email protected]发送给A シナ .cnの場合、サマリーセクションバックエンドは以下の情報を出力します。
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655
QUIT
221 Bye
Sent message ***@sina.cn successfully....
sinaメールボックスにログインし、smtpサービスとオープン状態を確認し、smtpサービスを再度オープンしてみましたが、まだメール送信がうまくいきません。また、インターネット上では、モバイルクライアントでsinaメールボックスにメールを送信できないという声が多く、foxmailでsinaメールボックスにログインしてみましたが、こちらもメールを受信するだけで送信はできませんでした。
問題分析
基本的にはsina mailboxの問題であることは間違いないのですが、smtpサービスの問題なのか、何か制限をかけているのかについては不明です。普段sina mailboxを使ってメールを送っている人は少ないようで、Webログインでもメールを送ることができ、結局は無料のメールボックスなので使えるようです。
これは、JavaMailでメールを送信するときに遭遇した最初の問題であり、ケースはすべて他の人の元のパッケージを参照していますが、メールが受信されません。
I changed several reference cases and the problem is the same. I started to suspect the code problem of the case given by others, after all, the dang Sina mailbox is not so unreliable. Then, based on this judgment, I had a big loss
コードや設定を分析し、主要なフォーラムで"send mail successfully but can't receive mail"を検索してみたところ、少なからず問題があり、アドバイスの多くはコードに問題がないかを確認し、質問した人が以下に返信しないため、誤情報が大量に発生していることがわかりました。まさに、私も数日無駄に過ごして、ようやく本来の理由がとてもシンプルであることが分かるまで...。
Sometimes someone else's answer can be twice as good, but this kind of dependency is not reliable, and sometimes it is more important to have your own troubleshooting ideas
.
2、sinaのメールボックスに送信したメッセージが返送されました。
問題現象
通常の展開 テスト 私的な共通メールボックスを使いたくないので、Sohuメールボックスを登録し、Sinaメールボックスにメールを送ろうとしたが、すぐにSohuメールボックスはバウンスした手紙を受け取った(この状況ではJavaMailはメッセージの判断を促さない)、バウンスした手紙の内容は以下の通りであった。
<ブロッククオート
<A
シナ
.cn>: ホスト freemx1.sinamail.sina.com.cn[202.108.35.47] が言いました。
554 送信側MTAの評判が悪いため拒否されました。
http://mail.sina.com.cn/help2...
をご参照ください。
http://chengxin.mail.sina.com...
123.125.123.1
(DATAコマンドへの返信)
課題分析
バウンスメッセージ内のリンク( Sina Mail Integrity Platform(新浪メール整合性プラットフォーム で、基本的にSohuのメールボックスサーバがブラックアウトしていると判断されます。もちろん、それは新浪によってブラックアウトされていませんが、RBLのブラックリストに、新浪は、そのデータをブロックするために参照します。これは、個人の能力の範囲を超えて、決定的に新浪のメールボックスをあきらめ、代わりに他のメールボックスに送信されます。
[RBLブラックリスト]。
<ブロッククオートRBLはRealtime BlackholeListの略で、リアルタイムのブラックリストを意味します。このリストに載っているIPアドレスは、外部にスパムを投稿しています。スパマーのアドレスをチェックするために、第三者のアンチスパム組織が提供しているサービスです。
[クエリサイト】をご覧ください。]
<ブロッククオート
MXToolBoxです。
http://mxtoolbox.com/
BlackListAlert
http://www.blacklistalert.org/
3. 163の郵便受けに手紙を送るが受け取られず、また未返送の郵便物もなし
問題現象
Sohuメールボックスを経由してSinaメールボックスに手紙を送り、バウンスに遭遇した後、自分宛に送ってみたところ、正常にメールを受信することができました。シミュレーションテストはできるだけリアルであるべきと考え、代わりに163メールボックスにメールを送ってみたところ、背景にはメールが正常に送信されたことが表示されるが、163メールボックスにはメールが届かず、ローカルメールボックスにはバウンスメールの通知が届かなくなる、という結果になった。
問題点の分析
これは、"の状態です。
The backend shows that the email was sent successfully but not received
送信サーバーだけでなく、受信サーバーにも問題がある可能性があります。受信サーバーによってはメールをバウンスしたり、受信しても破棄したりと、いろいろとおかしなケースがあるのです。
4. jar パッケージが重複して存在する javax.mail.*.
問題現象
から オラクル JavaMail関連のjarパッケージをダウンロードできる公式サイトがmail.jarですが、テストにインポートしたところ、いろいろとおかしなエラーが報告されました。geronimo-javamail_1.4_spec-1.3.jar がすでにプロジェクトにある場合に、mail.jar をインポートすると、以下のような例外が報告されます。
SMTPSendFailedException: 530 Authentication required
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)
よく見ないと、アカウントやパスワードを間違えて記入したのかと思いますが、geronimo-javamail_1.4_spec-1.3.jarを除外してメールを再送信すれば大丈夫です。
問題点の分析
上記は、私が投稿したエラー報告のうちの1つです。これらは、入門パッケージの問題であり、javax.mail.*と重複が存在するため、必ずしも再現性があるわけではありません。私は、最初の問題("
The backend shows that the email was sent successfully but not received
")この状況をネット上で他の人が説明しているのを見たとき(
javaMailはメールを正常に送信しますが、メールを受信しないか、件名と受信者メッシーコードのないメールを受信します。
javax.mail.*が重複して存在するjarは、mail.jar、geronimo-javamail_1.4_spec-1.x.jar, mailapi.jar と javaee.jar であることが判明しています。
また、javax.mail.Sessionを開いて、それが入っているjarを探し、それをカリングして、次のjarパッケージを探すといったトラブルシューティングも簡単に行えます。
5. jarパッケージが正しくてもエラーが報告される
問題現象
jarパッケージが動作し、正しく設定されているときに、多くのエラーメッセージに遭遇しました。状況は基本的に、最初の数回メールを送ると正常に動作し、再度送ると突然エラーが表示され、再度送ると以下のようなエラーメッセージを複数投稿し、問題が再発することはない。
(エラー1)
DEBUG SMTP: Sending failed because of invalid destination addresses
RSET
DEBUG SMTP: MessagingException while sending, THROW:
SendFailedException: Invalid Addresses;
nested exception is:
SMTPAddressFailedException: 554 5.7.1 <*@163.com>: Relay access denied
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1862)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1118)
(エラー報告2)
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert. CertPathValidatorException: timestamp check failed
(エラー3)
SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP host: smtp.sohu.com, port: 25 (java.net. ConnectException: Connection timed out: connect))
at javax.mail.Transport.send(Transport.java:163)
at javax.mail.Transport.send(Transport.java:48)
at javamail.EmailSender.sendMail(EmailSender.java:91)
at javamail.EmailSender.main(EmailSender.java:64)
(エラー4の報告)
250-zw_71_47
250-AUTH PLAIN LOGIN
250 STARTTLS
DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
課題分析
これらのエラーは再現性がないため、テストプロセスも私は、もちろん、メール配信のケースの90%以上が正常である、コードも洗練された多くのケースの組み合わせであり、多かれ少なかれ同じです、また、提供される公式サンプルを読んで、構成内容が似ている、コードの問題は、可能性が低く、またSMTPサーバのジャークは、現時点では私は当分の間無視されません。 もちろん、コードの問題の分析がある場合は、共有するメッセージを残すことを歓迎します。(注:私は私のコードを貼り出して、記事の後半でそれを共有する予定です)
6. 送信成功後、応答メッセージが異なる
問題現象
成功したメールをテストするためにJavaMailコードをエクストラネットに送信すると、バックエンドは基本的に以下のように終わるメッセージを印刷します。
250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655
QUIT
221 Bye
メール配信の成功をテストするために、JavaMailのコードを内部環境に移植したところ、バックエンドは以下のようにメッセージの末尾を出力しました。
250 Message accepted for delivery
QUIT
221 srv201.mail.*. * SMTP Service closing transmission channel
課題分析
インターネットで調べてみると、250や221といったコードは、実はsmtpのやりとりのメッセージコードで、221はメールセッションの終了間際、つまりすべてのメッセージの処理が終わったことを意味していることがわかりました。コード "srv201.mail...の後のメッセージ。 SMTP Service closing transmission channel" は "Bye" に似ているので、特定の内容は無視して、221はメールが正しく送信されていることを意味することだけを知っていればよいでしょう。
<テーブル 221 サーバーが通信路を閉じている。Goodbye"やClosing connection"などのサイドメッセージが表示されることがあります。 メーリングセッションが終了します。これは、すべてのメッセージが処理されたことを単純に意味します。iii. 付録
1.
SMTPエラーコードと対処方法
2.
SMTPエラーとリプライコード
3.
javaMailのメール送信は成功したが、メールを受信できない、または件名と受信者コードがないメールを受信できない。
4.
Sinaメールボックス整合性プラットフォーム
関連
-
java.util.NoSuchElementException 原因解析と解決方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
Methodのinvokeメソッド実装のJavaリフレクション
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
java 例外。Javaツールの初期化
-
プラグインの実行は、ライフサイクル構成によってカバーされていません: org.codehaus.mojo:aspectj-maven-plugin:1.3.
-
Java文字列プレースホルダー使用
-
Tomcat 8は、「少なくとも1つのJARがTLDをスキャンされたが、TLDが含まれていない」問題を解決します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IllegalArgumentException この例外を解決する方法
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
HttpClientがGZIP形式でない場合の対処法
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
宣言されたパッケージ XX は、期待されるパッケージ src.main.java.XX と一致しません。
-
JAVA のエラーです。公開型***は、独自のファイルで定義する必要があります***。
-
引数型[java.lang.String]の名前がありません..........................。.バグ処理