.
Counter: 83232, today: 3, yesterday: 6

SMTP配送の仕組みとsendmail

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

mail_transfer.gif SIZE:524x247(47.0KB)

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

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によるメール配信に使われています。エンベロープはメーラーで表示できるヘッダとは異なり、通常、見ることができません。

envelope.gif SIZE:404x300(9.9KB)

sendmailによるSMTPサーバの運用

sendmailは最も有名なMTAの1つです。 sendmailの設定は、sendmail.cfに記述しますが、sendmail.cfファイルを直接記述することは皆無と言って良いでしょう。 sendmail-8.9.3までのバージョンでは、WIDEプロジェクトの「CF」と呼ばれるコンフィギュレーション生成ツールを日本ではよく利用されていました。現在では、sendmailの付属ソフトである、M4と呼ばれるマクロ言語プロセッサを使って設定することが一般的になってきました。

sendmailの設定ポリシー

  • 直接配送かリレー用MTAへの配送か (sendmail.mc)
  • ローカルメーラー(MDA)は何を使うか (sendmail.mc)
  • 受け取るべきドメインの設定 (local-host-names)
  • リレーを許可すべき条件の設定 (access)
  • 受け取ったメールの転送設定(aliases)

不正中継の制限
不正中継の制限は、/etc/mail/access ファイルを利用して通常の配送ルールを決定します。一般的には、プライベートネットワークからのリレーのみを許可しますが、外出時や海外からも自サイトの MTAを利用したい場合、認証することでリレーを許可する仕組みがあります。

  • POP before SMTP

通常のSMTPにはユーザ認証機能が無いため、送信する前にPOP認証させて、認証が成功した場合、一時的に送信しようとしているIPアドレスからのリレーを許可する仕組みです。 sendmail.mc の記述に設定を追加し、POP3サーバの qpopperを利用することで実装することができます。

  • SMTP AUTH

sendmail 8.10以降では、SASLをベースにしたRFC2554に定義しているSMTP AUTHをサポートしています。 sendmailの再コンパイルと、Cyrus-saslライブラリを利用することで実装することができます。

sendmailの起動オプション
よく使われる起動オプションは次のとおりです。

bd sendmailをデーモンとして実行
bi aliasesの再構築(newaliasesコマンド)
bv ベリファイモードで実行
bp メールキューに溜まっているメールの表示
d1h 1h(時間)毎にメールキューの処理(再配送)を行う
q 直ちにメールキューの処理を行う

MSPによるセキュリティ強化
sendmailは、バージョン8.12以降からセキュリティ強化として、sendmailのMTAの機能のMSP(Mail Submission Program)の機能をアプリケーションとして分離しました。ローカルサーバからメールを送る時に利用されます。 sm-clientと呼ばれ、submit.cfファイルにより制御されます。また、sm-clientを起動するユーザは「smmsp」として運用します。

sm-client.gif SIZE:404x188(5.1KB)

添付ファイル: file00.JPG 327件 [詳細] filelinuxexpert.ne.jp_sm-client.gif 2024件 [詳細] filelinuxexpert.ne.jp_envelope.gif 2059件 [詳細] filelinuxexpert.ne.jp_mail_transfer.gif 1800件 [詳細]
リロード   差分 ソース ファイル添付 添付ファイル一覧   Wikiトップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
トラックバック [ トラックバック(1) ]
トラックバック URL: http://linuxexpert.ne.jp/modules/pukiwiki/tb/46
メールサーバはメールヘッダを頼りとして配送先を知るのではない
要約: 先日、あるメールアカウントのバウンスメールが大量にサーバの管理者宛メールアドレス(root@***.co.jp)に戻ってくるという状態が発生した。 ネットワークエンジニアに聞くと、メールの送り方に問題があるために、発信元(Fromヘッダ)にバウンスメールが届かない状況になっているとのこと。 調べてみると、そのメールアカウントを使ってあるメール送信システムがメールを送信していた。 そのメール送信部分のプログラムは以下のようになっていた。 mb_send_mail($mail_to, $mail_subject, $mail_content, "From: $mail_from\nBcc: $ma...
Weblog: Shoulder.jp
日時: 2007年5月23日 08:01:06

Expert Menu
最新記事
なぜここへ
Yahoo Japanから
検索結果から
友人に聞いて
前からURLを知っていた
他サイトからリンク
最新バージョンの確認

Linuxexpert is one of the service presented by InfomationSquare. / OmakaseBlog Login  |  Register Now!