ちょっとした豆知識

メールの送信テスト

最近はSMTP-AUTHなどで使う暗号化が当たり前なので、エンコードにプログラムを使って試験するしかないのですが、localhostからメールを出すときの試験は、telnetで簡単に試験することができます。

メールの試験はともかく、メールサーバーとのやりとりがどのようにされているか知るだけでも、結構ためになったりします。

(1)SMTPサーバーへの接続

telnetを使って、SMTPサーバーへ接続します。
この場合、SMTPサーバーが接続許可をしていないといけないわけですが、localhostであれば通常は接続許可しているので、localhostのSMTPサーバーに接続します。

# telnet localhost 25

Trying 127.0.0.1...
Connected to smtp_test.
Escape character is '^]'.
220 smtp_test.fulldigit.net ESMTP Postfix (Debian/GNU)

(2)SMTPセッションの開始

ehloコマンドを発行して、SMTPサーバーからSMTPセッションを開始してもらいます。
セッションが確立すると、下記のような情報がメーラーに返信されてくることになります。

情報を何気なしに見ていればわかりますが、例えば「SIZE 10240000」は、メールのサイズは10MBまでよ! と最初に伝えてきていますので、メーラーからそれを超えるメールを送ろうとすると、「メールの サイズが上限値を超えています。」といったメッセージが出せるわけですね。

> EHLO

250-smtp_test.fulldigit.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH NTLM DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

(3)エンベロープ上のメールの送信者を指定

mailコマンドでエンベロープの送信者のアドレスを指定します。

> MAIL FROM:

250 2.1.0 Ok

(4)エンベロープ上のメールの受信者を指定

rcptコマンドでエンベロープの受信者のアドレスを指定します。

> RCPT TO:

250 2.1.5 Ok

(5)メッセージデータを入力

QUITコマンドで接続を終了します。DELEコマンドでメールの削除要求を行っていれば、この時点で削除されます。

> DATA

354 End data with .

※メールヘッダー部の入力

> subject:Test Mail

> from:test@fulldigit.net

> to:test@xxx.co.jp

※メール本文の入力

> test mailbody

※メール本文の最後に「.」ピリオドを入力して、メールを送信
> .

250 2.0.0 Ok: queued as 6F6E42B0B4D

(6)接続の終了

> QUIT

221 2.0.0 Bye
Connection closed by foreign host.

これでメールが送信できているはずなので、メールを受信して確認しましょう。

メールを送信する操作や原理は簡単ですね。通常使っているメーラーは、コマンド部分を自動的に発呼しているだけということになります。

その他にもいろいろなコマンドがあるので、参考まで

コマンド コマンドの動作
EHLO SMTPセッションの開始。SMTPサーバはSMTPクライアントを識別し、もしそのクライアントがそのSMTPサーバを利用できるならばセッションが開始される。
AUTH SMTP認証 サーバとクライアントがSASL(RFC 2222)を利用して相互認証できるようになる。
MAIL FROM: エンベロープ上のメールの送信者を示す。(メールヘッダーのFrom:とは意味が異なる)
RCPT TO: エンベロープ上メールの受信者を示す。(メールヘッダーのTo:とは意味が異なる)
DATA メッセージデータを送る。メッセージの終わりには「.」(ピリオド)だけの行を入力する。
メールのヘッダー部分(Subjectやfrom,to)もここで入力。
QUIT セッションを終了。
VRFY アドレスを参照する。
EXPN エイリアスを展開する。
HELP SMTPコマンドのhelpを参照する。
RSET セッションの状態をリセット。
SEND ユーザ端末に送られるメッセージの送信者を示す。
SOML 端末に出力あるいはメール。
SAML 端末出力とメール。
TURN クライアントとサーバの役割の交換する。