すがブロ

sugamasaoのhatenablogだよ

メールのSMTPが以外と知られていない件

おれが仕事がら使うから常識になっていただけかもしれないけど

メール送信っつったら一般的に SMTP 通信な訳で、メールを扱うっつったらこれくらい知っとけよ! ということで。
悪用しちゃだめだし、特に FROM で知らないアドレスとか使うと他の人に迷惑だから十分気をつけてね!><

見えない部分と見える部分

フツーにメールを受け取る時に見える TO(あて先)とか本文とか添付ファイルっていうのは”見える”部分だ!
メールサーバーがメール受信者(たとえば受信太郎としようか)である受信太郎宛と判断して受信太郎が見ることの出来るサーバー上の受信箱まで届ける[あて先]の部分は”見えない”部分だ!ココのことをエンベロープ FROM とかっていう。

メールを送るしくみ

英語の出来る人ならすぐにわかるし、英語ができなくても辞書とか調べればわかるんだけど、この「エンベロープ」というのは「封筒」という意味なわけ。鋭い人は下を読まずともピンときちゃうかもしれないね。
メールサーバーっていう赤がイメージカラーっぽい公務員が、エンベロープっていう封筒に書いてあるあて先を見て受信太郎へメールを送るわけ。受信太郎はちょっとアホだから封筒とか見向きもしない。
中の手紙に書いてある「拝啓 受信さま〜敬具」までしか見ない。ここに書いてある「受信さま」っていう部分で、あ、僕宛なんだなーって思っちゃう。これがメールを開いた時に表示されるTO(あて先)なのね。
手紙の中で名前を偽ったり、相手(受信太郎)の名前をあたかも別人のようにしたって全然だいじょうぶ。だって別に中身が適当でもちゃんと封筒にあて先を書いてあれば送れるもの。

というわけでまとめ

封筒にちゃんとあて先書けば中身は適当でも大丈夫だよ。

実演してみよう

実際にメールを送る時は公務員っぽい人に手伝ってもらうんじゃなくて、SMTPっていうプロトコルを使う。
これはメールサーバとお話しするための言葉で、 telnet っていうので突っつくと話せるようになる。
赤くて太い字が入力の部分だよ。
注意:この実演はメールサーバを coLinux 上で構築しているアホの環境だからできることです。間違っても自分の持っているアカウント(例えば Yahoo!とか)のSMTPサーバに接続しちゃダメだよ。

[masa@localhost]~% telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix

こんな風に、 telnet コマンドでメールサーバのIP(この場合はlocalhost)を指定して、 25番窓口でお話するよーっていうと、応答としてなんかリアクションが来るんだ。
こうなると、メールサーバは送信者についての情報を聞こうとしてジっと待っているので、自己紹介してあげる。

mail from:sugamasao@localhost.localdomain
250 2.1.0 Ok

「mail from:」っていうお決まりの文句の後に、自分のメールアドレスとかを書いてあげると、送信するのはこの人なんだーって理解する。理解できると 250 OK って言ってくる。でもこのメールアドレスって別になんでも良いんだよね(良い子は自分のアドレスを使おうね!)。
そうしたら次は送りたい人宛にメールを送るよ!

rcpt to:masa@localhost.localdomain
250 2.1.5 Ok

「rcpt to:」の後に送りたい人のメールアドレスを入力するよ。ここがエンベロープFROM」エンベロープTO」(さーせん。間違えてました)ってヤツなので間違えちゃダメだ。ちなみに、このメールサーバは localhost.localdomain っていう名前なので自分が管理してるユーザの中に「masa」って人いるかなーって探すんだ。せっかく探しても、いないと怒られちゃうんだ!><
もしこれがmasa@hogehogeとかだったら、自分で探すのはあきらめて hogehoge っていうサーバに送っちゃうんだ*1
ここまできたらお待ちかねの本文だよ!

data
354 End data with .

これからが本文だよ!ってお知らせ。本文を入力し終わったら改行コード+ピリオド(.)+改行コードで通信を終わりにするんだ。
じゃあ本文を入力してみよう。

to:tttttttttttttttttttttttt
from: fffffffffffffffffffff
subject: subsubsubsub
date: 1982/6/18 3:24:00

test
.
250 2.0.0 Ok: queued as 020AC27F44

ここで入力した to: とか from: っていうのが普段使ってる outlook express とかthunderbird とかで表示される送信者とかあて先とかになるんだよ。
上で書いたけど、好きなだけ捏造できちゃうね!><
xxx: 値 って書く部分をヘッダと読んで、その後一行あけて test って書いた部分をボディって呼ぶみたい。
最後に通信終了の合図。

quit
221 2.0.0 Bye
Connection closed by foreign host.

受信したメールを見てみよう。

受信したメールデータをテキストで開くとこんな感じだ。自分が書いたデータ以外に、メールサーバを通った時に書かれた値とかが付いているね*2

Return-Path:
X-Original-To: masa@localhost.localdomain
Delivered-To: masa@localhost.localdomain
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
by localhost.localdomain (Postfix) with SMTP id 020AC27F44
for ; Tue, 25 Sep 2007 14:22:04 -0400 (EDT)
to: tttttttttttttttttttttttt
from: fffffffffffffffffffff
subject: subsubsubsub
date: 1982/6/18 3:24:00
Message-Id: <20070925182213.020AC27F44@localhost.localdomain>

test

上に載っているテキストをローカルのテキストファイルにコピペして、拡張子を eml で保存してみよう。
そうして、ダブルクリックでメーラーから開いてみると……

わあ!手作りなのに本物っぽい!><
っていうか、これで本当にメールが送れちゃう!>< 悪用しちゃダメだよ!

あと

日本語で送る時のエンコードとか添付ファイルがあったときのマルチパート形式とか色々あるんだけれど、メールの基礎の基礎はこれで十分かな。

*1:しつこいけど悪ふざけしちゃだめだよ!

*2:メーラーで受信できる環境を整えていれば良かったかもしれないけど、POPは動かしてないので!><