Pocket

こんにちは、nemotoです。


早速ですが、メールを送信するプロトコルはSMTP(Simple Mail Transfer Protocol)です。
ただ、これを意識してメールを送信する人はいません。メーラが変わりに行っているからです。


ではまず、どのようなメールがメーラから投げられるか見てみましょう。


【検証方法】
1.localにダミーメールサーバ(smtp4dev)をポート25番で起動させる。
smtp4dev
2.Mozilla Thunderbirdを起動し、SMTPサーバの設定をlocalhostのポート25番に設定。
account

smtp
3.原稿を作成し、送信。
mailCreate
4.smtp4devにメールが届いていることを確認し、Sessionsタグの[View log]ボタンをクリックし、発行されたSMTPコマンドを確認。
smtp4dev3


この結果、メーラからメールを送信する際にどのような手順で行っているのかがわかりましたね。

220 localhost smtp4dev ready
EHLO [127.0.0.1]
250-Nice to meet you.
250-8BITMIME
250-STARTTLS
250-AUTH=CRAM-MD5 PLAIN LOGIN ANONYMOUS
250-AUTH CRAM-MD5 PLAIN LOGIN ANONYMOUS
250 SIZE
MAIL FROM:<nemoto@sample.com> SIZE=356
250 Okey dokey
RCPT TO:<test@sample.com>
250 Recipient accepted
RSET
250 Rset completed
RSET
250 Rset completed
MAIL FROM:<nemoto@sample.com> SIZE=356
250 Okey dokey
RCPT TO:<test@sample.com>
250 Recipient accepted
DATA
354 End message with period
Message-ID: <4F9F23A3.1000208@sample.com>
Date: Tue, 01 May 2012 08:43:31 +0900
From: nemoto <nemoto@sample.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20120428 Thunderbird/12.0.1
MIME-Version: 1.0
To: test@sample.com
Subject: Hello
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

I am Bob

.
250 Mail accepted
QUIT
221 See you later aligator

この手順は、メールサーバにtelnetで接続し、SMTPコマンド叩く場合にも同様です。

では次に、実際に[telnet localhost 25]で接続し、以下のSMTPコマンドを実行します。

220 localhost smtp4dev ready
EHLO [127.0.0.1]
250-Nice to meet you.
250-8BITMIME
250-STARTTLS
250-AUTH=CRAM-MD5 PLAIN LOGIN ANONYMOUS
250-AUTH CRAM-MD5 PLAIN LOGIN ANONYMOUS
250 SIZE
MAIL FROM:<nemoto@sample.com> SIZE=3RCPT TO:<test@sample.com>
250 Recipient accepted56
250 Okey dokey

DATA
354 Please start mail input.
Message-ID: <4F9F23A3.1000208@sample.com>
Date: Tue, 01 May 2012 08:43:31 +0900
From: nemoto <nemoto@sample.com>
ird/12.0.1: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20120428 Thunderb
MIME-Version: 1.0
To: test@sample.com
Subject: Hello
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

I am Bob
.
250 Mail queued for delivery.
QUIT
221 Closing connection. Good bye.

先ほど同様、ダミーメールサーバにメールが送信されたことが確認でき、また同様のSMTPコマンドが発行されていることがわかります。

さてここで、Thunderbirdから送信されたメールと、telnetで接続しSMTPコマンドを叩いて送信されたメールの両方をsmtp4devのMessageタグから[View]ボタンをクリックし確認してみてください。

どちらも同様のSMTPコマンドを発行しているので、メールの内容も同様であることを確認出来たと思います。
同様のメールです。

あら?と思われる方もいるとは思いますが、どちらのメールも送信したタイミングが違うのに、日付はどちらも同じ日時を示しています。


そうなんです。メールの日付はメールを送信した日付でもなければ、メールを受信した日付でもありません。
日付は、メールヘッダーに記述されているメールヘッダーのDateを表示しているだけです。


SMTPではMAIL FROMコマンドで指定したアドレスが、差出人になります。
次にRCPT TOコマンドで指定したアドレスが、宛先になります。
複数の宛先が存在する場合は、その分だけRCPT TOコマンドを繰り返します。
これがSMTPでの宛先です。


つまり、メールに表示されている差出人(From)、宛先(To)についても、日付同様にメールヘッダーのFromおよびCcを表示しているだけであり、正しい差出人・宛先ではないということです。


ただ、実際にはメーラ側で、メーラのFromに指定しているアドレスを、MAIL FROMコマンドで指定し、かつメールヘッダーのFROMにも指定していることから、送った人はFromの人と認識しメールのやり取りをしていることになります。(Toについても同様)


また、CcやBccについてもメーラ側で指定がある場合には、RCPT TOコマンドでTo同様に繰り返します。(Bccの宛先はメールヘッダーに記述しなければ、受け取る側としては誰に送信しているかわからないので、Bccの挙動としては満たしていますよね?)


ということで、今回は
・メーラからメールを送信する際にどのようなプロトコルで送信しているのか?
・そのプロトコルでメールを送信した結果、メーラではどのように見えるのか?
について話ました。


またね