+ 作るログイン
図を読み込んでいます…
1 / 13
メールのしくみ ― DNS から SPF・DKIM・DMARC、Resend の運用まで / 全11章

メールのしくみ 3:SMTP ― メールが届くまで

発行
アニメモ公式
版
第1版
改訂
コマ
全13

アプリが送ったメールが相手の受信トレイに入るまでに何が起きているかを、4人の登場人物で追いかけます。MX の引き方、SMTP の会話と返事の番号、封筒と手紙の2つの差出人、ヘッダー、暗号化、ポート、そして届かなかったときの知らせの戻り方まで。

メールの旅の登場人物は4人

1本目と2本目で、インターネットの住所(IP アドレスとドメイン)と、名前から番号を引く仕組み(DNS)を見ました。この作品では、その上でメールが実際にどう運ばれるのかを追いかけます。

例として、Animemo のサーバーから、Gmail を使っている太郎さんへ招待メールを送る場面を考えます。登場人物は4人です。

登場人物役割この例では
アプリ「このメールを送りたい」と思う人Animemo のサーバー(Fastify)
送信サーバー頼まれたメールを相手まで運ぶResend
受信サーバー自分のドメインあてのメールを受け取るGmail のサーバー
受信トレイ受け取ったメールを読む場所太郎さんの Gmail

図の封筒が、これから右へ移動していきます。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 1 / 13
  • メールの旅の登場人物は4人
  • アプリ
  • 送信サーバー
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • アプリ → 送信サーバー → 受信サーバー → 受信トレイ。

① アプリが、送信サーバーに頼む

最初の一歩で、アプリは自分では配達しません。送信サーバーに「このメールを、この宛先へ送って」と渡すだけです。郵便でいえば、手紙をポストに入れる段階です。

自分で配達しない理由は、配達に付いてくる仕事が多いからです。

配達に付いてくる仕事中身
再送相手のサーバーが一時的に受け取れないとき、時間をおいて送り直す
失敗の処理届かなかった知らせを受け取り、記録する
評判の管理迷惑メール扱いされないよう、送り方や送り先を管理する(8本目)
出口の確保相手のサーバーへ渡すための通信ができること(このあとのページ)

これらは、アプリの本来の仕事(Animemo なら作品を作って見せること)とは関係がありません。だから専門の送信サーバーに任せます。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 2 / 13
  • ① アプリが、送信サーバーに頼む
  • アプリ
  • ①
  • 送信サーバー
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • 配達には再送・失敗の知らせ・評判の管理がついて回る
  • アプリは自分で配達しない。送信サーバーに「これを送って」と渡す。

② 宛先ドメインの MX を引く

送信サーバーは、宛先 [email protected] の @ の右側、つまり gmail.com を見ます。そして2本目の DNS に問い合わせます。

「gmail.com の掲示板の MX の行を見せて」

返ってくるのは「gmail.com あてのメールは gmail-smtp-in.l.google.com が受け取る(優先順位 5)」という答えです。送信サーバーは、さらにこの名前の A レコードを引いて番号を知り、接続を始めます。

ここで分かるのは、メールの宛先探しも、結局は DNS で住所を引いているということです。@ の右側は、DNS で引けるドメイン名そのものです。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 3 / 13
  • ② 宛先ドメインの MX を引く
  • アプリ
  • ①
  • 送信サーバー
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • ② MX は?
  • gmail.com の掲示板
  • MX 5 gmail-smtp-in.l.google.com
  • @ の右側(gmail.com)の掲示板で「メールはどこが受け取る?」を聞く。

③ 受信サーバーへ、SMTP で渡す

受け取り先が分かったので、送信サーバーは Gmail の受信サーバーに接続して、メールを渡します。このとき使う会話の決まりが SMTP(Simple Mail Transfer Protocol)です。

プロトコルとは、コンピューター同士が話すときの作法のことです。「まず挨拶する」「次に差出人を言う」「次に宛先を言う」「最後に本文を送る」という順番と言い回しが決まっていて、その通りに話せば、どこの会社のサーバー同士でもメールを受け渡せます。

世界中のメールサーバーが同じ SMTP を話すからこそ、Gmail と Outlook と会社のメールのあいだで、メールが行き来できます。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 4 / 13
  • ③ 受信サーバーへ、SMTP で渡す
  • アプリ
  • ①
  • 送信サーバー
  • ③
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • ② MX は?
  • gmail.com の掲示板
  • MX 5 gmail-smtp-in.l.google.com
  • SMTP は、サーバー同士がメールを受け渡すときの会話の決まり。

SMTP の会話は、ほぼ平文のやりとり

SMTP の会話を、実際に近い形で覗いてみます。

送: EHLO a1-23.smtp-out.amazonses.com
受: 250 はい、どうぞ
送: MAIL FROM:<[email protected]>
受: 250 OK
送: RCPT TO:<[email protected]>
受: 250 OK
送: DATA
受: 354 本文をどうぞ。最後は「.」だけの行で
送: From: Animemo <[email protected]>
送: To: [email protected]
送: Subject: 招待が届いています
送:
送: 本文……
送: .
受: 250 受け取りました
送: QUIT

1行ずつの意味は次のとおりです。

命令意味
EHLO挨拶。「こちらは○○という機械です」と名乗る
MAIL FROM封筒の差出人を伝える
RCPT TO封筒の宛先を伝える(複数あれば何回も言う)
DATAここから手紙の中身を送る
. だけの行中身の終わり
QUIT会話を終える

送る側が1行言い、受ける側が番号付きの返事を返す、という繰り返しです。この番号には大事な意味があります(次のページ)。

※ MAIL FROM の実際の値は長い英数字ですが、ここでは分かりやすく bounce@… と書いています。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 5 / 13
  • SMTP の会話は、ほぼ平文のやりとり
  • アプリ
  • ①
  • 送信サーバー
  • ③
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • 送: EHLO a1-23.smtp-out.amazonses.com / 受: 250 どうぞ
  • 送: MAIL FROM:<[email protected]> / 受: 250 OK
  • 送: RCPT TO:<[email protected]> / 受: 250 OK
  • 送: DATA … 本文 … . / 受: 250 受け取りました
  • 送る側が1行言い、受ける側が番号で返事をする。その繰り返し。

返事の番号で、次にどうするかが決まる

受信サーバーの返事には、必ず3桁の番号が付いています。最初の1桁で、送る側の次の行動が決まります。

番号意味送る側の行動
2xx成功次へ進む
4xx今は受け取れない(一時的)時間をおいて送り直す(数時間〜数日)
5xx受け取れない(恒久的)諦めて、差出人に「届かなかった」と知らせる

たとえば 421(混んでいるので後で)なら、送信サーバーはしばらく待ってから再送します。550(そのアドレスは存在しない)なら、何度送っても無駄なので、すぐに諦めます。

この再送と諦めの判断を、送信サーバーが代わりにやってくれています。①で「アプリは自分で配達しない」と書いた理由の1つがこれです。自分でやるなら、数日にわたって再送を管理し続けるしくみが必要になります。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 6 / 13
  • 返事の番号で、次にどうするかが決まる
  • アプリ
  • ①
  • 送信サーバー
  • ③
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • 2xx 成功(受け取った)
  • 4xx 一時的(後で再送)
  • 5xx 恒久的(諦める)
  • 例: 550 そのアドレスは存在しません / 421 混んでいるので後で
  • 4 で始まれば後でもう一度。5 で始まれば諦めて、差出人に知らせる。

差出人は2つある:封筒と手紙

SMTP の会話には、差出人が2回出てきました。MAIL FROM の行と、DATA の後の From: の行です。この2つは別物です。

郵便で考えると分かりやすくなります。封筒の裏に書く返送先と、便箋の最後に書く署名は、別々に書けます。

封筒の差出人手紙の差出人
正式な呼び名Envelope From / Return-Path(MAIL FROM)ヘッダーの From
誰が使う機械人間
何に使う届かなかったときの返送先受信者の画面に表示される
この例では[email protected]Animemo <[email protected]>

Gmail の画面に「Animemo」と出るのは、手紙の差出人のほうです。封筒の差出人は、ふだん利用者の目には触れません(受け取った側で Return-Path: というヘッダーとして記録されるだけです)。

そして、ここがこのシリーズ全体でいちばん大事な点の1つです。どちらも、送る側が好きな値を書けます。 SMTP には、それが本当かどうかを確かめる手順がありません。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 7 / 13
  • 差出人は2つある:封筒と手紙
  • From: Animemo <[email protected]>
  • 封筒の差出人
  • Return-Path = 届かなかった時の返送先
  • 手紙の差出人
  • 封筒: [email protected]
  • From = 受信者の画面に出る名前
  • どちらも、送る側が好きに書ける
  • 封筒の差出人は機械の返送先。手紙の From は画面に出る名前。

手紙の中身:ヘッダーと本文

DATA の後に送る「手紙の中身」は、ヘッダーと本文に分かれています。間は空行1つで区切ります。

ヘッダーは、手紙の冒頭にある決まった欄の並びです。

ヘッダー意味
From差出人(画面に出る)
To宛先(画面に出る)
Subject件名
Date送った日時
Message-IDこのメール1通ごとに付ける固有の番号

注意したいのは、ヘッダーの `To` と、封筒の宛先(`RCPT TO`)も別物だということです。BCC が成り立つのはこのためです。BCC の宛先は封筒にだけ書かれ、手紙のヘッダーには書かれないので、他の受信者には見えません。

本文は、HTML で飾った版と、文字だけの版の両方を入れて送ることが多いです。文字だけの版があると、HTML を表示しないメールソフトでも読めますし、迷惑メールの判定でも不自然に見えにくくなります。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 8 / 13
  • 手紙の中身:ヘッダーと本文
  • From: Animemo <[email protected]>
  • ヘッダー
  • To: [email protected]
  • 差出人・宛先・件名・日時・ メールごとの固有の番号
  • Subject: 招待が届いています
  • Date: Thu, 24 Sep 2026 10:00:00 +0900
  • Message-ID: <[email protected]>
  • (本文)太郎さん、作品への招待が届いています…
  • 本文
  • HTML と文字だけの版を 両方入れることが多い
  • ヘッダーは手紙の冒頭の決まった欄。空行のあとが本文。

通信路は暗号化されるが、差出人の証明にはならない

SMTP は、もともと平文(暗号化なし)でやりとりする決まりでした。これでは途中の中継機で中身を覗かれてしまいます。

そこで今は、会話の最初に STARTTLS という命令を出して、通信路を暗号化してから本題に入るのが普通です。Gmail は、暗号化できない相手からのメールを警告付きで表示します。

ただし、ここで誤解しやすい点があります。

暗号化は「途中で覗かれない」ためのもので、「差出人が本物である」ことの証明にはなりません。

偽の差出人を書いたメールも、きちんと暗号化して送れます。暗号化された通信路を通ってきたからといって、From: に書かれた名前が本当だとは限りません。

差出人が本物かどうかを確かめる仕組みは、SMTP とは別に、後から作られました。それが5〜7本目の SPF・DKIM・DMARC です。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 9 / 13
  • 通信路は暗号化されるが、差出人の証明にはならない
  • アプリ
  • 送信サーバー
  • ③
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • STARTTLS で暗号化
  • 途中の中継機に中身を覗かれない
  • 差出人が本物かどうかは分からない
  • 暗号化は「途中で覗かれない」ため。「本人が送った」ことは別の話。

④ 受信サーバーが判定して、行き先を決める

メールを受け取った Gmail は、そのまま受信トレイに入れるわけではありません。まず、このメールを信じてよいかを判定します。

結果は3通りです。問題が無ければ受信トレイへ。怪しければ迷惑メールフォルダへ。明らかに偽物なら受け取りを拒否して、送信サーバーに 5xx の返事を返します。

判定するのは受け取る側で、送る側にはどうにもできません。送る側にできるのは、「このメールは本物です」と判定してもらうための材料を、あらかじめきちんと揃えておくことだけです。

その材料が、5〜7本目の SPF・DKIM・DMARC と、8本目の評判です。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 10 / 13
  • ④ 受信サーバーが判定して、行き先を決める
  • アプリ
  • ①
  • 送信サーバー
  • ③
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • ④ ここで 身元確認と判定
  • 受信トレイ
  • 迷惑メール
  • 拒否
  • 受信トレイか、迷惑メールか、受け取り拒否か。決めるのは受け取る側。

自分のサーバーから直接は送れない

「送信サーバーを使わず、アプリのサーバーから直接 Gmail に渡せばいいのでは?」と思うかもしれません。実際には、ほぼできません。

1本目で見たとおり、メールには窓口(ポート)が複数あります。

ポート用途
25サーバー同士の受け渡し(③の段階)
587 / 465アプリが送信サーバーに「送って」と頼む(①の段階)。ログインと暗号化が付く

AWS や Google Cloud など多くのクラウドは、25番ポートからの外向きの通信を最初から塞いでいます。 乗っ取られたサーバーから迷惑メールが大量に流れるのを防ぐためです。

そのため、アプリは 587 番か 465 番で送信サーバーにログインして送信を頼み、25番で相手に渡す仕事は送信サーバーに任せます。Supabase に SMTP の設定を入れるとき、ホストに smtp.resend.com、ポートに 465 を指定するのは、この「頼むための入口」を使っているからです(9本目)。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 11 / 13
  • 自分のサーバーから直接は送れない
  • クラウドの壁
  • 25番で直接
  • Gmail
  • 25番で受け付ける
  • アプリ
  • 25番で渡す
  • 例: Fastify
  • 587 / 465番(ログイン+暗号化)
  • Resend
  • 頼まれて代わりに届ける
  • クラウドは25番を塞いでいる。送信サーバーには 587 / 465 番で頼む。

届かなかったら、封筒の差出人へ知らせが戻る

宛先のアドレスが存在しないなどで受け取りを拒否されると、送信サーバーは「届きませんでした」という知らせを作ります。これをバウンス(バウンスメール)と呼びます。

この知らせが届くのは、手紙の `From:` ではなく、封筒の差出人です。封筒の差出人が「届かなかったときの返送先」だったのは、このためです。

受信サーバーが会話の途中で拒否した場合は、送信サーバーがその場で知ります。一方、いったん受け取ってから後で配れないと分かった場合は、受信サーバーが封筒の差出人のドメインの MX を引いて、知らせをメールとして送り返します。

ここから、10本目で出てくる設定の理由が見えてきます。封筒の差出人は、戻ってきた知らせを受け取れる住所でなければなりません。Resend の設定で「送るだけなのに MX を登録する」のは、この戻り道を作るためです。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 12 / 13
  • 届かなかったら、封筒の差出人へ知らせが戻る
  • アプリ
  • 送信サーバー
  • 受信サーバー
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • 550 そのアドレスは存在しません
  • 返送先 = [email protected]
  • だから封筒の差出人は、戻りを受け取れる住所でなければならない
  • 「届きませんでした」は手紙の From ではなく、封筒の差出人に届く。

まとめ:SMTP

この作品で見たことをまとめます。

段階起きること
① 頼むアプリは 587 / 465 番で送信サーバーに渡す
② 探す送信サーバーが宛先ドメインの MX を DNS で引く
③ 渡す25番で、SMTP の会話を通して受信サーバーへ
返事2xx 成功・4xx 後で再送・5xx 諦めて知らせる
④ 判定受信トレイ・迷惑メール・拒否を、受け取る側が決める
戻り届かなければ、封筒の差出人へ知らせが戻る

そして、次の作品につながる大事な事実があります。SMTP には、差出人が本物かどうかを確かめる手順がありません。 封筒の差出人も手紙の差出人も、送る側が自由に書けます。暗号化も、差出人の証明にはなりません。

次の作品では、この欠陥が何を招いたのか、そしてどう直そうとしたのかを見ていきます。

  • メールのしくみ 3 / 11 ― SMTP:メールが届くまで
  • 13 / 13
  • まとめ:SMTP
  • アプリ
  • ①
  • 送信サーバー
  • ③
  • 受信サーバー
  • ④
  • 受信トレイ
  • 例: Fastify
  • 例: Resend
  • 例: Gmail
  • 太郎さん
  • MX で受け取り先を探し、SMTP の会話で渡す
  • 差出人は封筒と手紙の2つ。どちらも自由に書ける
  • 判定するのは受け取る側
  • SMTP には差出人を確かめる手順が無い。次の作品で、それが何を招くかを見る。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]