SMTP, POP

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

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

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

MTA(Mail Transfer Agent)

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

他の計算機のMTAから受信したメールの宛先によっては,自分自身の計算機が受け取るべきメールでない場合がある.その場合,第三者の計算機にメールを転送する必要がある.

Unixで代表的なMTAとしてSendmailがある.

MDA(Mail Delivery Agent)

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

MUA(Mail User Agent)

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

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

SMTP(Simple Mail Transfer Protocol)

SMTPは,電子メールの転送を行うためのプロトコルである.このプロトコルは,MTA間で電子メールを配送する場合や,MTAとMUA間で電子メールを送信する場合に使用される.TCPポート番号は25である.sendmailでは拡張SMTPプロトコル(ESMTP:認証機能や大容量メール対応などの機能を追加したSMTP)が使用されている.

POP/APOP/IMAP

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

POP3(Post Office Protocol Version 3)は,メールサーバからクライアントへメールを取得するためのプロトコルである.これにより,メールクライアントは電子メールをスプールしているサーバからメッセージを取得する.TCPポート番号は110である.メールスプールからメールを読むためには,メールスプールを読み書きできる計算機でMUAを動かす必要があるが,POPを利用するとメールスプールを持たない計算機から,NFS(Network File System:ネットワーク経由でファイルを共有する仕組み)を使わずにメールを読み出すことができる.

APOP(Authenticated POP)は,認証を強化したPOPである.POP3では受信サーバにアクセスする際に必要なパスワードが平文で送信されるため,APOPではパスワードを暗号化して送信することで安全性を向上させている.

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

電子メールシステムの構成図
図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

校閲を実施