SMTP配送の仕組み Postfix

現在のインターネットの普及は、インターネットメールの利用が大きな要因の一つになっています。電子メールを書いて送信ボタンを押すと、設定したメールアドレスの宛先にメールが届く配送の仕組みはどのようになっているのでしょう。

メール環境を構成する要素(プログラム群)

MTA(Mail Transfer Agent)
メールを配送するためのプログラムで、ホスト間でのメールの配送や配送されてきたメールを受け取る機能をもっています。代表的なMTPは、sendmail,qmail,Postfixなどがあります。

MDA(Mail Delivery Agent)
MTAがメールを受け取ると、各ユーザのメールボックスにメールを配信する機能を持っています。代表的なMDAは、mail.local,procmail,qmail-localなどがあります。

MUA(Mail User Agent)
主にユーザがメールを読み書きし、送受信する機能を持っています。メーラーとも言われ、アドレス帳やメールの振り分け機能を持っているアプリケーションが多く存在ます。また、インターネットメールの仕様に合わせたコード変換などを自動的に行います。代表的なMDAは、Becky!,Outlook Express,Eudora,Muleなどがあります。

メール環境を構成する要素(プログラム群)

MTA(Mail Transfer Agent)
メールを配送するためのプログラムで、ホスト間でのメールの配送や配送されてきたメールを受け取る機能をもっています。代表的なMTPは、sendmail,qmail,Postfixなどがあります。

MDA(Mail Delivery Agent)
MTAがメールを受け取ると、各ユーザのメールボックスにメールを配信する機能を持っています。代表的なMDAは、mail.local,procmail,qmail-localなどがあります。

MUA(Mail User Agent)
主にユーザがメールを読み書きし、送受信する機能を持っています。メーラーとも言われ、アドレス帳やメールの振り分け機能を持っているアプリケーションが多く存在ます。また、インターネットメールの仕様に合わせたコード変換などを自動的に行います。代表的なMDAは、Becky!,Outlook Express,Eudora,Muleなどがあります。

メール配送を構成するプロトコル

SMTP(Simple Mail Transfer Protocol)
MTA同士でメールを配送したり、MUAからMTAへメールを送るためのプロトコルです。SMTPは2つのメール・システムがどのように対話するかを指定し、メールを配送するための制御メッセージフォーマットを定めています。通常、TCPポート25番を使用します。

POP(Post Office Protocol)
メールサーバにスプールされたメールをクライアントに取り込むためのプロトコルです。POPではユーザ認証に関する情報を含みます。また、POPには POP2,POP3などのバージョンがありますが、最近ではPOP3を利用することが一般的です。POP3は通常、TCPポート110番を使用します。

IMAP(Internet Message Access Protocol)
POPがクライアント側にメッセージをダウンロードし、クライアントでメッセージの管理を行うのに対し、IMAPはサーバ側でメッセージの管理を行い、クライアント側はその操作を行うことができます。IMAPにもバージョンがあり、IMAP4は現在でも拡張を続けています。IMAP4は通常、 TCPポート143番を使用します。

SMTPのコマンドと応答コード

SMTPの仕様は、RFC821で規格化されており、さらに一部を拡張して、8bitデータの送受信を可能にしたり、メッセージサイズのネゴシエーションを可能にしたりしたものが RFC1651~1653で規格化されています(後者の拡張仕様はESMTPと呼ばれる)。SMTPでは、送信側から送られるコマンドや、受信側からの応答はすべてテキストベースのもので、文字列の最後にCR LFが付けられる。こうしたコマンドとその応答をやり取りしながら、メッセージの送信を行います。

SMTPでの基本的なメッセージ転送の手順は次のようになります。

  • 接続を開始する
  • 「HELO」コマンドを送り、セッションを開始する
  • 「MAIL」コマンドを送り、メールの送信者を通知する
  • 「RCPT」コマンドを送り、メールの受信者を通知する
  • 「DATA」コマンドを送り、メッセージの送信開始を通知する
  • 受信先から送信確認が到着したら、実際にメッセージの送信を開始する
  • 「CR LF.CR LF」(2つのCR LFの間にピリオドだけがある)を送り、転送メッセージが終了したことを通知する
  • 「QUIT」コマンドを送り、セッションを終了する

SMTPコマンド

HELO 	書式 : HELO <SP> <domain> <CRLF>
	意味 : 接続の確立
MAIL 	書式 : MAIL <SP> FROM:<reverse-path> <CRLF>
	意味 : 発信者の指定
RCPT 	書式 : RCPT <SP> TO:<forward-path> <CRLF>
	意味 : 受信者の指定
DATA 	書式 : DATA <CRLF>
	意味 : 本文の送信
RSET 	書式 : RSET <CRLF>
	意味 : 処理の中断
SEND 	書式 : SEND <SP> FROM:<reverse-path> <CRLF>
	意味 : 発信者の指定
SOML 	書式 : SOML <SP> FROM:<reverse-path> <CRLF>
	意味 : 発信者の指定
SAML 	書式 : SAML <SP> FROM:<reverse-path> <CRLF>
	意味 : 発信者の指定
VRFY 	書式 : VRFY <SP> <string> <CRLF>
	意味 : 受信者の確認
EXPN 	書式 : EXPN <SP> <string> <CRLF>
	意味 : メーリングリストの会員アドレスの要求
HELP 	書式 : HELP [<SP> <string>] <CRLF>
	意味 : ヘルプメッセージの要求
NOOP 	書式 : NOOP <CRLF>
	意味 : ダミーコマンド
QUIT 	書式 : QUIT <CRLF>
	意味 : 処理の終了
TURN 	書式 : TURN <CRLF>
	意味 : クライアントとサーバの役割の逆転

SMTP応答コード

211 	System status, or system help reply
214 	Help message
	ヘルプメッセージ。
220 	<domain> Service ready
	準備完了。
221 	<domain> Service closing transmission channel
	接続を閉じる。
250 	Requested mail action okay, completed
	要求された処理は実行可能。完了。
251 	User not local; will forward to <forward-path>
	受信者が存在しないので[forward-path]に転送する。
354 	Start mail input; end with <CRLF>.<CRLF>
	メールの入力開始。入力終了は「.」のみの行を送信。
421 	<domain> Service not available,closing transmission channel
	サービスは利用不能。接続を閉じる。
450 	Requested mail action not taken: mailbox unavailable
	メールボックスが利用できないため、要求された処理は実行不能。
451 	Requested action aborted: local error in processing
	処理中にエラーが発生。要求された処理は失敗。
452 	Requested action not taken: insufficient system storage
	記憶装置の空き領域が不十分なため、要求された処理は実行不能。
500 	Syntax error, command unrecognized
	文法に間違いがあるため、コマンドが理解できない。
501 	Syntax error in parameters or arguments
	引数の文法に間違いがある。
502 	Command not implemented
	指示されたコマンドはこのシステムには実装されていない。
503 	Bad sequence of commands
	コマンドの発行順序が間違っている。
504 	Command parameter not implemented
	コマンドの引数が未定義。
550 	Requested action not taken: mailbox unavailable
	メールボックスが利用できないため、要求された処理は実行不能。
551 	User not local; please try <forward-path>
	受信者が存在しない。[forward-path]に送信せよ。
552 	Requested mail action aborted: exceeded storage allocation
	ディスク不足のため、要求された処理は実行不能。
553 	Requested action not taken: mailbox name not allowed
	メールボックスの名前が不適切なため、要求された処理は実行不能。
554 	Transaction failed
	処理失敗。

メールヘッダとエンベロープ

メールが相手に届くのはなぜでしょうか? MUA(メーラー)でメールを作成する時に宛先(Toヘッダ)を指定しますが、複数人を指定してメールを送ることも可能です。 2人に同様のメールを送ると言うことは、どこかでメール自体がコピーされ2つに分かれて配送されます。メーリングリストを利用している場合、To:ヘッダがメーリングリストのアドレスであるにもかかわらず、自分自身にメールが届くのは、エンベロープの機能を理解する必要があります。

主なメールヘッダ

From: 差出人アドレス
Sender: 差出人アドレスが不明確な場合に差出人を明示
To: 宛先アドレス
Cc: カーボンコピー
Reply-To: 返信先アドレス
Message-Id: 5年間固有のメッセージID
Subject: タイトル(件名)
Return-Path: エラー返信先アドレス
Date: 差出時間
Received: 配送経路
In-Reply-To: どのメールに返信したかを示す
References: どのメールに返信したかを示す
Precedence: 配送優先度
X-Mailer: メールを作成したMUA名

エンベロープとは
一般的にメールの配送の仕組みは郵便に、メール自体を封筒に例えられます。封筒に書く宛先(住所と名前)は、メールで置き換えるとヘッダではなく、エンベロープと言われる情報になります。エンベロープには配送の宛先、発信者のアドレス情報などが記入されており、ここに記述されている情報が実際のMTAによるメール配信に使われています。エンベロープはメーラーで表示できるヘッダとは異なり、通常、見ることができません。