モヒカンは正義

プログラマー風林火山で言う「風のエンジニア」になりたい(比較的)若者Webエンジニアの備忘録

自宅からメールが送れない?それOP25Bのせいかも

メールを送るシステムを開発していて、会社のネットワークからはメールが送れるのに、自宅やポケットWiFiからだとメールが送れないことがあります。例えば、メールを送ろうとすると No route to hostDestination host unreachable Request timed out が起きる場合です。

実は多くのISPでは野良メール送信を制限するために外向きのTCP 25番を閉じています。このせいで、自宅PCから会社メールサーバを使ってメールを送ろうとしたり、自前メールサーバからのメールが送れなかったりします。

OP25B (Outbound Port 25 Blocking)

電子メールは技術的にはTCP 25番で相手先のメールサーバにSMTPでお話すると誰でも送ることができます。2010年頃、メールの添付ファイルで感染するウイルスが大流行したり、SPAMメールの社会問題化がきっかけでOP25Bが始まりました。

www.so-net.ne.jp

ISPからしてみれば

  • TCP 25番を閉じることで、ユーザ端末から直でSPAMメールやウイルスメールを送られることを防げる
  • 別ポートでメール送信用サーバを用意してユーザに使わせれば、これまで通りメールサービスは提供できる

わけですね。

一見、「ISPを経由すればSPAM送れるから一緒じゃね?」って思いそうですが、ISPのメールサーバに記録が残るので通報があった際に追跡しやすいし、メールサーバにウイルス対策ソフトを入れることで早期にウイルス感染を検出して直接ユーザに連絡を入れること可能になるので大きな違いなわけです。

どうすればメールが送れるか?

利用するメールサーバがサブミッションポート (TCP 587番) を提供している場合

メール送信時のメールサーバのポートをTCP 25番の代わりにTCP 587番を使う設定にすると、メールを送れるようになります。

$ git diff
diff --git a/.env.default b/.env.default
index e08cad1..f5d901a 100644
--- a/.env.default
+++ b/.env.default
@@ -1,2 +1,2 @@
 MAIL_HOST=mail.pinkumohikan.om
-MAIL_PORT=25
+MAIL_PORT=587

利用するメールサーバがサブミッションポート (TCP 587番) を提供していない場合

端的に、そのメールサーバを使ってメールを送ることはできません。

僕はだいたいそういう場合、Gmailアカウントを取得してGmailの提供しているメールサーバ (Gmail SMTP サーバー) を使ったりします。そもそもTCP 25番を提供していないというのがトラップを未然に防いでいてポイント高い。

support.google.com

ちなみに、ご存知の通りGoogleはセキュリティに厳しいのでVPSとかからメール送ろうとすると不審なリクエストと見なされてrejectされることもよくある。送信数の制限も厳しいので、本番用途では使わないこと。

自前メールサーバを使いたい場合

OP25Bの影響で相手先メールサーバとの直接通信ができないので、ISPの提供するメールサーバなどに代理でメールを送ってもらう必要があります。

自宅メールサーバ -> (TCP 25番) -> 相手先メールサーバ

という感じの構図から、

自宅メールサーバ -> (TCP 587番) -> ISPメールサーバ -> (TCP 25番) -> 相手先メールサーバ

という構図になるイメージです。

詳細な設定方法は割愛しますが、postfixだったら relayhost あたりの設定がキーワードです。