メールが送信されるまでをパケットを見ながら解剖!

以前、コマンドだけでメールを送信する記事を書きましたが、
メール送信の一連の流れをパケットで追いかけていきたいと思います!

人物相関図


下記のソースを使えば、上記の図の構成でDocker環境を構築することができ、実際に動作を検証することができます。
https://github.com/kuniiskywalker/mail-tester

登場人物


送信君(送り手のメールサーバー)

IP:10.5.0.6
ドメイン:fuga.local


受信君(受け手のメールサーバー)

役割:メールサーバー
IP:10.5.0.5
ドメイン:hoge.local


案内マン(ネームサーバー)

IP:10.5.0.4


あらすじ(送信完了までの送信サーバーのパケットの流れ)

この図を元に解説していきます。

① 送信先メールアドレスのMXレコード確認


※MXレコード:メールの送信先IPアドレスが設定されたDNSレコード。

 送信君:

root@hoge.localに送信したいので、hoge.localのMXレコード教えてください

 案内マン: MXレコードは`mail.hoge.local`です。
 送信君:

ではmail.hoge.localのIPアドレスを教えてください。

 案内マン:

10.5.0.5です。

② TCPハンドシェイク


 送信君:

はじめまして受信君!
案内マンからIPアドレスきいてご連絡しました!
今からメールを送るためのやり取りしたいのですがいいですか?

 受信君:

はい大丈夫です!

 送信君:

ありがとうございます!

③ EHLO


※EHLOとはSMTP拡張機能を使うために送信者と受信者でお互いにサポートしてる機能をあわせて使用しましょうというやり取り。

 受信君:

メール受信を行う上での開始準備できてます!

 送信君:

それではまず、受信君はどういった機能をサポートしてるか知りたいので、教えてもらっていいですか?

 受信君:

↓こういうやつに対応してます!

SIZE:受信可能サイズ 10240KB

PIPELINE:SMTPで送信を行うための準備に使うコマンドを一括実行できる

他は割愛。。。

 送信君:

ありがとうございます!

PIPELINE対応してるんですねー、ではまとめて送信メールアドレスとか、送り元メールアドレスを送りますので、送信可能かどうか確認お願いします!

※MAIL FROM, RCTP TO, DATAコマンドを使って上記の確認を行う。

※1個ずつ実行していく場合は通信の利用効率が悪くなるため、こういった方式が導入されている。

⑤ 送信可否結果


 受信君: 結果をまとめてお返しします!
 受信君: ありがとうございます! 全部OKそうですね!

⑥ メール送信

 送信君: 結果うけとりました! メールを送信を許可いただきありがとうございます!

それではroot@hoge.local宛てに、差出人root@fuga.localとして、件名:test本文:This is test mail.でお送りします!

まとめ

登場人物も含めてやり取りをまとめてみました!

ちょっと駆け足で書いたので、ちょっとずつ修正します。。。

ローカル環境でメールの送受信の確認ができる環境をDockerでつくったのでご活用ください!
https://github.com/kuniiskywalker/mail-tester

Please share