メールクライアントからメールを送信した時の、MTUとMTAのやりとりをキャプチャ(*1)したもの。
IPアドレス192.168.1.100がクライアント、192.168.1.1がサーバです。
No. Source Destination Protocol Info 1 192.168.1.100 192.168.1.1 TCP 1563 > smtp [SYN] Seq=0 Len=0 MSS=1260 2 192.168.1.1 192.168.1.100 TCP smtp > 1563 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 3 192.168.1.100 192.168.1.1 TCP 1563 > smtp [ACK] Seq=1 Ack=1 Win=65535 Len=0
上記でTCP通信の確立を行っています。3ウェイハンドシェイクと呼ばれるものです。
No. Source Destination Protocol Info 4 192.168.1.1 192.168.1.100 SMTP Response: 220 mail.hoge.example.com ESMTP Postfix 5 192.168.1.100 192.168.1.1 SMTP Command: EHLO [192.168.1.100] 6 192.168.1.1 192.168.1.100 TCP smtp > 1563 [ACK] Seq=43 Ack=23 Win=5840 Len=0 7 192.168.1.1 192.168.1.100 SMTP Response: 250-mail.hoge.example.com
TCP/IP接続確立後、サーバ側がリプライコード「220」で自己紹介を行っています。
メールサーバのホスト名がわかると思います。サーバはPostfixを使っているという記述もあります。
サーバの自己紹介を受け、クライアント側も「EHLO」で自分を名乗っています。
「EHLO」はSMTP拡張サービスと呼ばれるもので、拡張サービスに対応していない場合は「HELO」を送信します。
最後にサーバ側が「250」リプライコードを返します。これでサーバとクライアントの接続処理が終了しました。
ここからメールデータ部分の送信を行います。
SMTP拡張サービスについてはこちらを参照~@IT
SMTPリプライコード
8 192.168.1.100 192.168.1.1 SMTP Command: MAIL FROM:<test@hoge.example.com> SIZE=372 9 192.168.1.1 192.168.1.100 SMTP Response: 250 Ok 10 192.168.1.100 192.168.1.1 SMTP Command: RCPT TO:<hoge@test.local.net> 11 192.168.1.1 192.168.1.100 SMTP Response: 250 Ok
「MAIL FROM:」コマンドで始まる部分が、送信元のメールアドレスになります。
サーバはリプライコード「250」で応答を返しています。
次に「RCPT TO:」コマンドでメールの送信先を指定します。
12 192.168.1.100 192.168.1.1 SMTP Command: DATA 13 192.168.1.1 192.168.1.100 SMTP Response: 354 End data with <CR><LF>.<CR><LF> 14 192.168.1.100 192.168.1.1 SMTP Message Body 15 192.168.1.1 192.168.1.100 TCP smtp > 1563 [ACK] Seq=193 Ack=482 Win=6432 Len=0 16 192.168.1.100 192.168.1.1 SMTP EOM: . 17 192.168.1.1 192.168.1.100 TCP smtp > 1563 [ACK] Seq=193 Ack=485 Win=6432 Len=0 18 192.168.1.1 192.168.1.100 SMTP Response: 250 Ok: queued as D97C69F5597 19 192.168.1.100 192.168.1.1 SMTP Command: QUIT 20 192.168.1.1 192.168.1.100 SMTP Response: 221 Bye 21 192.168.1.1 192.168.1.100 TCP smtp > 1563 [FIN, ACK] Seq=233 Ack=491 Win=6432 Len=0 22 192.168.1.100 192.168.1.1 TCP 1563 > smtp [ACK] Seq=491 Ack=234 Win=65303 Len=0 23 192.168.1.100 192.168.1.1 TCP 1563 > smtp [FIN, ACK] Seq=491 Ack=234 Win=65303 Len=0 24 192.168.1.1 192.168.1.100 TCP smtp > 1563 [ACK] Seq=234 Ack=492 Win=6432 Len=0
「DATA」コマンドを送信し、これ以降はメールのデータ部分を送信するとサーバに伝えます。
「Message Body」の部分でタイトルや本文データの送信を行っています。
16行目の「 . (ピリオド)」は、メールデータがこれで終わりということを表しています。
送信が終わったら「QUIT」コマンドで切断を行っています。サーバ側からは「bye」応答を返しています。
Message Body部抜粋 Message: Message-ID: <47328AFF.7010904@hoge.example.com>\r\n Message: Date: Thu, 08 Nov 2007 13:05:19 +0900\r\n Message: From: test@hoge.example.com Message: User-Agent: Thunderbird 2.0.0.6 (Windows/20070728)\r\n Message: To: hoge@test.local.net\r\n Message: Subject: TEST_MAIL\r\n Message: Hello World\r\n
メッセージボディ部の抜粋です。
1行目のMessage-IDはメッセージの識別子を表すもので、それぞれ唯一無二である必要があります。
3行目でFrom、5行目でToの指定がありますが、MAIL FROMやRCPT TOとは別物として扱われ、これらはメールデータとして扱われます。
ですので、この記述はメール転送には一切関係しません。
Subjectがタイトル、最終行がメール本文になります。
以上がメール送信の一連の流れです。今回はMTAとMTU間の通信でしたが、MTAとMTA間のメールのやりとりもほぼ同じです。
また、Telnetでメールサーバに接続し、上で紹介したコマンドを手で入力してもメール送信を行うことが可能です。
*1 パケットのキャプチャはWiresharkを利用 [[http://www.wireshark.org/:http://www.wireshark.org/]]