The King's Museum

ソフトウェアエンジニアのブログ。

Vercel からは SMTP ポート 25 番に接続できない

サイドプロジェクトで Vercel と Next.js で Web サイトを構築している。

その Web サイトからメールを送る必要があり、横着して SendGrid などのメールサービスを介さずに直接 SMTP 25 番で送ろうとした(SMTP auth もなし)。 もちろん、筋のいい方法ではないことが分かっており、スパム扱いされやすかったり、接続拒否される可能性はある程度想定済みだ。

状況

使ったライブラリは node-sendmail。

GitHub - guileen/node-sendmail: send mail without setting up a SMTP server

Qiita だと下記のような記事が出てくるので少し参考にした。

Node.jsにてSMTPサーバなしでメール送信 - Qiita

ローカルから送信

まず、ローカルで npm run dev で立ち上げたサーバーからメールを送信しようとしたが、タイムアウトで SMTP サーバーに接続できなかった。 送信先ドメインの MX レコードに書かれている SMTP サーバーのポート 25 番と connection を確立できず。

これは自宅で契約している ISP の NURO 光が Outbound Port25 Blocking をしているためだ。 下記に説明がある。

Outbound Port25 Blocking (OP25B)のご説明 | 基本メールボックス | NURO 光

Vercel から送信

次に Vercel からは送信できるかと思い、試してみたができなかった。

挙動としてはローカルから接続しようとしたときと同じ。Serverless Function が 60 sec timeout なので、コネクションのタイムアウトより前に 60 秒でメソッドの実行が中断してしまう。 明確に SMTP サーバーから接続が拒否されたような雰囲気ではなかったので、Vercel も Outbound Port25 Blocking なのかなと思いドキュメントを調べたら次のように書いてあった。

While the Vercel platform does not block outgoing SMTP connections, ...

ref: https://vercel.com/guides/serverless-functions-and-smtp

どうやら Vercel としては特に 25 番への接続を block していないらしい。 でも、明らかに block されいるような挙動なのでサポートに問い合わせてみた。

回答は下記のようなものだった。

I think our upstream provider is blocking outbound traffic on port 25 (SMTP) by default

ということで、Vercel としては block してないが、より上位の network provider で block されているのだろう、ということだった。 また、Vercel の Serverless Function は Dynamic IP なので、Yahoo メールなどでは明確に「接続拒否」されるから、接続できても拒否されることは多そうだよ、と説明してくれた。

https://support.yahoo-net.jp/PccMail/s/article/H000007342

結論

Vercel からは 25 番 Port へは接続できない。 外部のメールサービス(SendGrid など)を REST API で使うか、SMTP auth (587, 465) を使うことが必須である。 ドキュメントでは「外部のサービスを使うことを推奨」と書いてあるが、推奨というよりそれが必須であることが分かった。

余談

Vercel のサポートで担当だった人がとてもすばらしく、こちらがそこまで詳細に書いてないにも関わらずかなり明確に説明してくれて、サービスとしての印象がめちゃくちゃよくなった。

(c) The King's Museum