こんにちは、ふぃぶです。
Webアプリケーションでoffice365を介してメールを送ってる機能があったんですが突然メールが送れなくなりました。
解決したっぽいので記事を書いておきます。
エラーの始まり
突然起きました。
構成変えてないし、昨日まで遅れてたんだけど突然ダメになった…みたいな状況です。
SSLHandshakeExceptionの発生
Exceptionがこれでした。
どうやらメールサーバー(Office365)側と通信を確立する際のハンドシェイクに失敗してるっぽいです。なぜ…
構成などの確認。
Webアプリのメールが飛ぶざっくりした送るルートは
①Webアプリ(Java) ⇒ ②Office365 ⇒ ③送信
の流れです。
JavaMailにてSMTPサーバを「smtp.office365.com」に指定しTLS通信にてメールを送信してました。
イメージ的には①⇒②間でなんかエラーが出るようになりました。
結局なにがあかんかったのか。
どうやらJavaが古すぎたのが原因のようです。
Webアプリ側ではJava6を使用していました。最近はTLS1.2未満のバージョンは廃止される流れになっているのですがJava6はTLS1.2の通信をサポートしていないようです。
(TLS自体の指定はできるんですがバージョンの指定ができない。
※これは私の推察ですが、TLSバージョンの指定がない場合SMTP側が対応可能な通信バージョンを提示してその中から良しなに決まるらしいので、今まではTLS1.2未満も許可されてたけどOffice365側でTLS1.2未満が許可されなくなったとかそういう感じではないかと。)
ちなみにWebアプリ側のJavaは上げらない状況です。
どう解決したの? ~SMTP中継する~
Office365からは逃げられない
Javaも上げられない。
そんなわけで自サーバ内に中継用のSMTPサーバをひとつ立ててそこを経由することで解決しました。所謂SMTPリレーです。
って流れですね
Java→中継の間はSSLを使わず暗号化無しで普通に通信します
中継SMTP側にTLSの設定をonにしOffice365側に流すように設定してあげればOK。
SMTPはwindowsコンポーネントの追加かなんかで簡単に出来るし再起動も必要ないため意外と手間はかからずに対応出来ました。
Javaに限らず古いシステムには潜在的リスクが出てくるので気をつけましょう。