SMTP
Simple Mail Transport Protocol
メールサーバ間(および MUA→MSA間)でメールを渡す対話型プロトコル
HTTP がブラウザ↔ウェブサーバの通信プロトコルなのと同じ立ち位置で、
SMTP は メール送信側↔受信側のサーバ間の通信プロトコル
table:_
HTTP SMTP
役割 ウェブページの取得・送信 メールの送信
主な相手 クライアント ↔ サーバ サーバ ↔ サーバ(とクライアント ↔ サーバ)
デフォルトポート 80 / 443 25 / 587 / 465
リクエスト/レスポンスの単位 リクエスト1回で完結 複数の対話(HELO, MAIL FROM, RCPT TO, DATA, QUIT…)
ポートが3つあるのは歴史的経緯
port 25
サーバ間 (MTA-to-MTA)
クライアントが直接使うことはほぼない(プロバイダがブロックしてる)
port 587
クライアントが自分のメールサーバに送信を依頼するとき (Submission)
認証ありが普通
port 465
TLS 暗号化版 Submission(昔の規格の復活)
メールの登場人物
MUA
MSA
MTA
MDA
実際には1つのソフトウェア(例: AWS SES)が MSA や MTA の役割を兼ねていることが多い。
メールが届くまでの流れ
SMTPの対話を覗いてみる
SMTP は対話型のテキストプロトコル。手で telnet して送ることもできる(昔は)。
code:_
S: 220 mail.example.com ESMTP ready
C: HELO sender.com
S: 250 Hello sender.com
C: MAIL FROM:<alice@sender.com>
S: 250 OK
C: RCPT TO:<bob@example.com>
S: 250 OK
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: Alice <alice@sender.com>
C: To: Bob <bob@example.com>
C: Subject: Hello
C:
C: Hi Bob, this is a test email.
C: .
S: 250 OK: queued as 12345
C: QUIT
S: 221 Bye
ポイント:
MAIL FROM と RCPT TO は エンベロープ(封筒)の送信者・宛先
DATA 以降の From: や To: は 本文中のヘッダ(=封筒の中身)
この2つは 一致しない場合がある(後述)
SMTPコマンドの全リスト
table:_
コマンド 何をする
HELO / EHLO 挨拶。自分のホスト名を名乗る (EHLOは拡張版)
MAIL FROM: 送信トランザクションを開始 + エンベロープfromを指定
RCPT TO: エンベロープ宛先を追加 (複数回呼べる)
DATA ここからメッセージ本体(ヘッダ+本文)を流す宣言
RSET トランザクションをリセット
VRFY / EXPN アドレス検証 / MLメンバー展開 (今はほぼ無効化)
QUIT 接続終了
STARTTLS TLSにアップグレード(拡張)
AUTH 認証(拡張、SMTP-AUTH)
メール送信時のバウンス・リトライ
SMTP 配送は失敗することがある:
一時的失敗(4xx応答) — 受信側サーバが混んでいる等。送信側は数分〜数時間後にリトライ
恒久的失敗(5xx応答) — 宛先が存在しない、ブロックされている等。送信元に「バウンスメール」を返す
サーバ間で何度もリトライするので、メールは「送信して即着」ではなく 数秒〜数分の遅延がある。