SMTP配送の仕組みとsendmail
現在のインターネットの普及は、インターネットメールの利用が大きな要因の一つになっています。電子メールを書いて送信ボタンを押すと、設定したメールアドレスの宛先にメールが届く配送の仕組みはどのようになっているのでしょう。
メール環境を構成する要素(プログラム群)
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によるメール配信に使われています。エンベロープはメーラーで表示できるヘッダとは異なり、通常、見ることができません。
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」として運用します。
添付ファイル:



