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

下記のソースを使えば、上記の図の構成で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レコード教えてください


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

10.5.0.5
です。
② TCPハンドシェイク


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

はい大丈夫です!

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


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

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

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

SIZE:受信可能サイズ 10240KB
PIPELINE:SMTPで送信を行うための準備に使うコマンドを一括実行できる
他は割愛。。。

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

※MAIL FROM, RCTP TO, DATAコマンドを使って上記の確認を行う。
※1個ずつ実行していく場合は通信の利用効率が悪くなるため、こういった方式が導入されている。
⑤ 送信可否結果



⑥ メール送信

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

まとめ
登場人物も含めてやり取りをまとめてみました!
ちょっと駆け足で書いたので、ちょっとずつ修正します。。。
ローカル環境でメールの送受信の確認ができる環境をDockerでつくったのでご活用ください!
https://github.com/kuniiskywalker/mail-tester