SMTP, POP

電子メールシステムの基本構成について説明する.メールの送受信に必要なプログラム(MTA,MDA,MUA)の役割と,メール転送・受信に使用されるプロトコル(SMTP,POP,IMAP)の仕組みを理解することで,メールサーバの設定や障害対応に必要な基礎知識を習得できる.

メールに必要なプログラム

電子メールシステムは,MTA,MDA,MUAという3種類のプログラムが連携して動作する.この分離により,各プログラムが単一の機能に特化でき,保守性と拡張性が向上する.

MTA(Mail Transfer Agent)

MTAは,計算機間でメールの送受信を行うプログラムである.MTAは,送信するメールの宛先から受信先のリモートホストを調べ,そのホスト上で動作しているMTAと通信してメールを送受信する.

受信したメールの宛先が自分の計算機宛てでない場合は,宛先に応じて他の計算機のMTAへメールを転送する.

Unixで代表的なMTAとしてSendmailがある.現在の多くのLinux環境では,標準のMTAとしてPostfixが使われている(本資料ではSendmailを題材とする).

MDA(Mail Delivery Agent)

MDAは,MTAが受信したメールの宛先を解釈し,そのメールを受け取るユーザのメールスプールファイル(受信メールを一時的に保存するファイル)に書き込むプログラムである.

MUA(Mail User Agent)

MUAは,ユーザがメールを読んだり,メールの文章を作成したりするためのプログラムである.メールを送信するときはMTAと通信し,MTAに送信を依頼する.メールを読むときは,MDAが書き込んだメールスプールファイルからメールを取得する.

メールを扱うためのプロトコル

SMTP(Simple Mail Transfer Protocol)

SMTPは,電子メールの転送を行うためのプロトコルである.MTA間でメールを配送する場合や,MUAがMTAへメールを送信する場合に使用される.TCPポート番号は25である(MTA間の転送に使う).現在は,MUAがMTAへメールを送信する用途には,認証付きの送信専用ポートである587番(サブミッションポート)が一般的に用いられる.Sendmailでは拡張SMTPプロトコル(ESMTP:認証機能や大容量メール対応などの機能を追加したSMTP)が使用されている.

POP/APOP/IMAP

POPAPOPIMAPは,いずれもメールをサーバから受信するときに使用するプロトコルである.

POP3(Post Office Protocol Version 3)は,メールサーバからクライアントへメールを取得するためのプロトコルである.これにより,メールクライアントはメールをスプールしているサーバからメッセージを取得する.TCPポート番号は110である.メールスプールから直接メールを読むには,スプールを読み書きできる計算機でMUAを動かす必要があるが,POPを使うとスプールを持たない計算機からでも,NFS(Network File System:ネットワーク経由でファイルを共有する仕組み)を使わずにメールを読み出せる.なお,POP3は標準のポート110では認証情報やメール本文を暗号化せずに送るため,現在はTLSで暗号化する方式(ポート995)の利用が推奨される.

APOP(Authenticated POP)は,認証を強化したPOPである.POP3ではサーバへの接続時にパスワードが平文で送信されるが,APOPではパスワードそのものを送らず,MD5というハッシュ関数(入力データから固定長の値を計算する仕組み)を使った値を送ることで,平文での送信を避けている.ただしMD5には弱点が見つかっており,APOPは現在では安全とはみなされず,TLSによる暗号化が推奨される.

IMAP(Internet Message Access Protocol)は,POP3やAPOPのようにメールをクライアントへダウンロードするのではなく,メールを常にサーバ上に保持し,ユーザがサーバ上のメールを読み出す方式のプロトコルである.複数の端末から同じメールボックスにアクセスする場合に適している.現在の標準はIMAP4rev2(RFC 9051)である.

電子メールシステムの構成図
図1:MTA,MDA,MUAの関係とプロトコルの対応

sendmail

sendmailは,メール送信要求を受けると,sendmail.cf(/etc/mail/sendmail.cf)の指示に従って動作する.sendmail.cfの記述に基づいて,そのメールが自ホスト宛てかどうかを判定する.自ホスト宛てであればメールスプールに格納し,自ホスト宛てでなければsendmail.cfのルールに従って転送先を決定し,配送する.

sendmail.cf

sendmailはsendmail.cfの内容に従って動作する.しかしsendmail.cfの記述は複雑で,直接編集するのは難しい.そのため,sendmail.cfを生成するCF(Configuration File generator)というツールを使う.CFを使うと,簡潔な定義ファイルから複雑なsendmail.cfを自動生成できる.

課題:CFを使ったsendmail.cfの作成

本課題では,CFツールを使ってsendmail.cfを作成し,メールの送受信が正常に動作することを確認する.この作業を通じて,sendmailの設定ファイルの構造とメール配送の仕組みを理解する.

注意事項

  1. suになる

  2. バックアップを取得する

    • cd /etc/mail

    • cp sendmail.cf sendmail.cf.back

  3. cd /tmp

  4. ソースファイルを取得する

    • cp -r /u/kubo/work/rinkou/sendmail/CF* .

    • 以下の3つのファイルがあることを確認する

    • CF-3.7Wpl2.tar.gz

    • CF-3.7Wpl2-smtpcheck.patch1

    • CF-3.7Wpl2-smtpcheck.patch2

  5. cd CF

  6. 展開する

    • gunzip CF-3.7Wpl2.tar.gz

    • tar xvf CF-3.7Wpl2.tar

  7. cd CF-3.7Wpl2/Master

  8. パッチを適用する

    • patch < /tmp/CF/CF-3.7Wpl2-smtpcheck.patch1

    • patch < /tmp/CF/CF-3.7Wpl2-smtpcheck.patch2

  9. cd ..

  10. make cleantools

  11. make tools

  12. make samples

  13. sendmail.cfの元になるファイルをコピーする

    • cp Standards/sendmail-v8.def ./sendmail.def

  14. viでsendmail.defを編集する

    • OS_TYPE=bsd4.5

    • MX_SENDMAIL=yes

    • MY_DOMAIN=4f.db.is.kyushu-u.ac.jp

    • MY_NAME=(自分のマシン名)

    • FROM_ADDRESS='$m'

    • RECIPIENT_GENERIC=yes

    • REWRITE_GENERIC_FROM=lower

    • REWRITE_GENERIC_TO=yes

    • REWRITE_LOCAL_ON_RELAY=generic

    • ACCEPT_ADDRS='$m'

    • SPOOL_HOST='popple.db.is.kyushu-u.ac.jp'

    • BITNET=mx

    • REJECT_JUNET=yes

    • ALIAS_FILE_PATH='/etc/mail/aliases'

    • PRIVACY_FLAGS='noexpn,novrfy,authwarnings'

    • MAIL_RELAY_RESTRICTION=yes

    • LOCAL_HOST_IPADDR=/etc/mail/sendmail.localip

    • LOCAL_HOST_DOMAIN=/etc/mail/sendmail.localdomain

  15. 編集後,make sendmail.cfを実行する

  16. sendmailを停止する

    • ps -ax | grep sendmail

    • kill sendmailのプロセス番号

  17. sendmail.cfをコピーする

    • cp sendmail.cf /etc/mail/sendmail.cf

  18. sendmailをデバッグモードで起動する

    • sendmail -bt

    • > 0 ユーザ名
      (最後に...returns $# local $: ユーザ名と出力されれば正常)

    • > 0 ユーザ名@マシン名.4f.db.is.kyushu-u.ac.jp
      (最後に...returns $# local $: ユーザ名と出力されれば正常)

    • > 0 外部のメールアドレス(自宅のPCのアドレスなど)
      (最後に...returns $# smtp $: 外部アドレスと出力されれば正常)

  19. C-dでデバッグモードを終了する

  20. sendmailを起動する

    • sendmail -bd

  21. mailコマンドで自分にメールを送信する

    • mail 自分のメールアドレス

    • subject:(テストメールの題名)

    • テストメールの文章を入力する(日本語は使用不可)

    • . を入力して送信する

  22. exitでsuから戻る

  23. minakoで受信を確認する

    • ssh minako

    • mail

    • 先ほど送信したメールを受信していることを確認する

    • 確認後はqで終了する

    以上で課題は完了である.以下の手順で編集前の状態に戻す.

    • su

    • cd /etc/mail

    • ps -ax | grep sendmail

    • kill sendmailのプロセス番号

    • mv sendmail.cf.back sendmail.cf

作者;久保 正明,Jul/04/2002

校閲を実施