現在、Tomcat 7 コンテナー内で実行されている JavaMail アプリケーションで奇妙な問題が発生しています。Java Mail API は古典的な方法で使用され、派手すぎません (電子メール通知を送信するだけで、添付ファイルなどはありません)。テスト環境では、このコードは電子メールを MSExchangeServer に正常に送信します。
アプリケーションは Xen ハイパーバイザーで実行されており、ゲストは Windows 2008R2 です。Xen と Windows のバージョンはテスト用と実稼働用で同じです。JDK7u17 (最新、昨日ダウンロード) で実行しています。
EHLO/HELO フェーズで SMTP サーバーとの通信が途切れる
javax.mail.MessagingException: HELO コマンドを SMTP サーバーに送信できませんでした
次に、blatコマンドライン ユーティリティを使用して電子メールを送信しようとしましたが、 これは機能します。
putty で試してみましたが、telnet モードで putty を使用してメールサーバーに接続するときに問題を再現できます。RAW で putty に接続すると、EHLO コマンドを送信できます。
そのため、ゲームにスニファーを追加し、次の (再現可能な) 失敗したセッションセッション データを記録しました。
00000000 32 32 30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 220 **** ********
00000010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ******** ********
00000020 2a 0d 0a *..
00000000 45 E
00000001 48 4c 4f 20 53 52 56 2d 46 50 53 2d 30 32 0d 0a HLO SRV- FPS-02..
00000023 35 30 32 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 502 unim plemente
00000033 64 20 28 23 35 2e 35 2e 31 29 0d 0a d (#5.5. 1)..
00000011 48 H
00000012 45 4c 4f 20 53 52 56 2d 46 50 53 2d 30 32 0d 0a ELO SRV- FPS-02..
0000003F 35 30 32 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 502 unim plemente
0000004F 64 20 28 23 35 2e 35 2e 31 29 0d 0a d (#5.5. 1)..
00000022 51 Q
00000023 55 49 54 0d 0a UIT..
0000005B 35 30 32 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 502 unim plemente
0000006B 64 20 28 23 35 2e 35 2e 31 29 0d 0a d (#5.5. 1)..
EHLO コマンドは 2 つのセグメントに分割されていることに注意してください。
次に、blat を使用してセッションを記録しました。
00000000 32 32 30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 220 **** ********
00000010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ******** ********
00000020 2a 0d 0a *..
00000000 45 48 4c 4f 20 73 72 76 2d 66 70 73 2d 30 32 0d EHLO srv -fps-02.
00000010 0a .
00000023 32 35 30 2d 72 65 6c 61 79 2e 6d 65 64 69 61 6e 250-rela y.median
00000033 65 74 2d 77 6f 72 6c 64 2e 64 65 0d 0a 32 35 30 et-world .de..250
00000043 2d 50 49 50 45 4c 49 4e 49 4e 47 0d 0a 32 35 30 -PIPELIN ING..250
00000053 20 38 42 49 54 4d 49 4d 45 0d 0a 8BITMIM E..
ご覧のとおり、EHLO はパッケージの境界上にないため、サーバーは 250-... で応答します。
メールサーバーの recv 機能が壊れている可能性があるかどうかを確認するために、別のメールサーバーを試しましたが、他のサーバーも同じ動作を示しました。
別の JavaMail アプリケーションがまったく同じメールサーバーを介してメールを送信できることがわかりました。一見するとコードに違いはありませんが、もう一方のアプリケーションは JavaMail 1.3 を使用し、失敗したアプリケーションは JavaMail 1.4 (Geronimo 1.4 -1.7.1 から取得) を使用しています。
パケットのセグメンテーションがメールサーバーに影響を与える理由は何ですか? 私の見解では、TCP との通信時に IP パケットのセグメンテーションを気にする必要はありません。
事前に感謝します。
トーマス