12.1. SMTPサーバの構築
12.1.1. メールの仕組み
メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。
- MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
- MTA(Mail Transfer Agent):メールの転送
- MDA(Mail Delivery Agent):メールの配送(仕分け)

メール転送のフローは以下の通り。
- MUAからメールサーバMTAはメールを受け取る
- メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
- 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
- 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す
MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。
MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。
SMTPサーバの代表的なものにはPostfixやsendmail、eximなどがある。
POP/IMAPサーバにはDovecotやCourier Mail Serverなどがある。
メールボックスの形式には2種類ある。
- mbox形式 … /var/mailディレクトリに1ユーザ1ファイルとして保存する形式(1つのファイルに全部保存)
- Maildir形式 … ユーザのホームディレクトリ以下に1メール1ファイルとして保存する形式
12.1.2. Postfixとは
Postfixはsendmailと互換性を持つ新規開発されたMTA。
高速動作と設定が簡単なのが特徴で、デフォルトで使用するMTAとして最も一般的となっている。
Postfixは単一のデーモンプではなく複数のプログラムが協調して動作する。
Postfixを構成するプログラムは以下の通り。
| プログラム | 役割 | 
|---|---|
| sendmail | sendmail互換インターフェース | 
| smtpd | 外部配送の処理 | 
| pickup | maildropキューの監視、内部配送の処理を行う | 
| cleanup | ヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する | 
| qmgr | キュー内のメール配送プログラムに渡す | 
| nqmgr | qmgrと同じ(配送アルゴリズムのみ異なる) | 
| master | 全体制御用デーモン | 
| bounce | バウンスメール(設定ミスなどで往復する)を処理する | 
12.1.3. Postfixの設定
Postfixの設定ファイルは/etc/postficディレクトリ以下のmain.cfとmaster.cfで行う。
main.cfはMTAの基本設定ファイル、master.cfはPostfix構成する各種デーモンの設定ファイルとなる。
main.cfの設定
main.cfの書式は以下の通り。
設定項目 = パラメータ[, パラメータ ...]#でコメントアウト$を設定項目に付けると変数名のように参照できる。
設定例は以下の通り。
# ホスト名
myhostname = www.sample.com
# ドメイン名
mydomain = example.com
# メールアドレスの@以降のドメイン名
myorigin = $mydomain
# SMTP接続を待ち受けるNIC
inet_interfaces = all
# IPv4/IPv6の動作をall/ipv4/ipv6で指定
ip_protocols = all
# ローカル配送を行うドメイン名(メール受け取りドメイン名)
mydistination = $myhostname, localhost. $mydomain, localhost, $mydomain,mail.$mydomain, www.$mydomain, ftp.$mydomain
# 中継許可するSMTPクライアントのアドレス
mynetworks = 172.20.0.0/16, 127.0.0.0/8
# メールスプールディレクトリ
mail_spool_directory = /var/spool/mail
# ローカル配送を行うプログラム
mailbox_command = /usr/bin/procmail
# SMTPで出力されるバナー情報(デフォルトではバージョン非表示)
smtpd_banner = $myhostname ESMTP $mail_namepostconfコマンド
Postfix全般設定値を表示するコマンド。
なお表示される値は設定ファイルに基づいて表示される。
postconf-nオプションではデフォルト値から変更されている項目のみ表示される。
master.cfの設定
Postfixを構成するプロセスの動作を設定するファイル。
postfixコマンド
Postfixの制御を行うコマンド。
postfix <サブコマンド>| オプション | 説明 | 
|---|---|
| start | Postfixの開始 | 
| stop | Postfixの停止 | 
| abort | Postfixの強制停止 | 
| flush | キュー内にあるメッセージの再送 | 
| reload | Postfixの設定を再読み込みする | 
| check | 設定ファイルの構文チェックを行う | 
また起動スクリプトやsystemdによる起動停止も行える。
/etc/init.d/postfix stop
systemctl stop postfix.servicesPostfixの正規化機能
Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。
この機能により、以下のようなことが可能となる。
- 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
- ユーザ名(ログインID)と異なるメールアドレスを使用する
canonical機能は以下の手順で有効にする。
- main.cfにて、書き換えルールの参照先(検索テーブル)を指定- 書き換えルールには以下のパラメータが指定可能
- canonical_maps:送受信時の書き換えで参照する検索テーブル
- sender_canonical_maps:送信者アドレスの書き換え時に参照する検索テーブル
- recipient_canonical_maps:受信者アドレスの書き換え時に参照する検索テーブル
 
- 検索テーブルの作成、更新
なお、指定する検索テーブルにはMySQLやPostgreSQLなどのデータベース、LDAP、正規表現などが使える。
12.1.4. メールのリレー
メールのリレーはMTA間でのメール中継のこと。
他ホスト宛てのメールを受け取った場合、MTAはそのメールリレーを許可するか判断する。
リレーを無制限に許可すると、スパム送信の踏み台として利用されかねないので設定をしっかり行う必要がある。
以下の原則に従うと良い。
- リレーを許可したいLAN内のアウトバンドメールは許可
- リレーを許可したいドメインのメールは許可
- 外部のアウトバンドメールは拒否
なお一般的にはデフォルト設定でメールリレーは禁止されている。
Postfixの場合はmydistinationパラメータやmynetworksパラメータで制御を行う。
12.1.5. メールエイリアス/メール転送
/etc/aliases(または/etc/mail/aliases)によりメールアカウントと実際に受け取るユーザ名の対応設定ができる。
書式は以下の通り。
アカウント:   受取ユーザ1[, 受取ユーザ2...]受取ユーザの別名ではユーザ以外に以下のように指定できる。
| 別名 | 説明 | 
|---|---|
| /path | パスにあるファイルにメールメッセージを追加する | 
| |command | 指定したコマンドの標準入力へメールメッセージを送る | 
| user@domain | 指定したメールアドレスにメールを転送する | 
| :include:/path | パスに指定したファイルに別名として読み込む | 
newaliasesコマンド
/etc/aliasesのファイル内容を変更後に設定を反映させるコマンド。
newaliases.forwardファイル
ユーザのホームディレクトリに.forwardファイルを作成し、そこに届けたい先のメールアドレスを記述すると、そのユーザに届いたメールアドレスを届けたい先のメールアドレスに転送できる。
12.1.6. SMTPサーバの運用と管理
メールキュー
メールキューは処理待ちメールが一時的に保持される場所のこと。
各MTAでは以下の場所に格納される。
- Postfix- /var/spool/postfixディレクトリ以下のサブディレクトリ
- mailqコマンドで内容表示可能
- postfix flushコマンドで直ちに送信が可能
- postsuper -dコマンドでメールキュー内のメールを削除可能
 
- Sendmail- /var/spool/mqueueディレクトリ以下
- postqueue -pコマンドで内容表示可能
- postqueue -fコマンドで直ちに送信が可能
 
メールボックス
メールボックスはメールサーバが受け取ったメールが保存される場所。
各MTAでは以下の場所に格納される。
- Postfix- /var/spool/postfixディレクトリ以下のユーザ名のテキストファイル
- メールの保存にはmbox形式とmaildir形式が使用できる
- maildir形式の利用設定にはhome_mailbox = Maildir/とmain.cfで記述する
 
- Sendmail- /var/spool/mailディレクトリ以下のユーザ名のテキストファイル