12.メールサービス

Linuxのメールシステムやpostfix,Sieveなどに関して

12.1. SMTPサーバの構築

12.1.1. メールの仕組み

メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。

  • MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
  • MTA(Mail Transfer Agent):メールの転送
  • MDA(Mail Delivery Agent):メールの配送(仕分け)

メール

メール転送のフローは以下の通り。

  1. MUAからメールサーバMTAはメールを受け取る
  2. メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
  3. 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
  4. 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す

MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。 MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。

SMTPサーバの代表的なものにはPostfixsendmaileximなどがある。 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を構成するプログラムは以下の通り。

プログラム役割
sendmailsendmail互換インターフェース
smtpd外部配送の処理
pickupmaildropキューの監視、内部配送の処理を行う
cleanupヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する
qmgrキュー内のメール配送プログラムに渡す
nqmgrqmgrと同じ(配送アルゴリズムのみ異なる)
master全体制御用デーモン
bounceバウンスメール(設定ミスなどで往復する)を処理する

12.1.3. Postfixの設定

Postfixの設定ファイルは/etc/postficディレクトリ以下のmain.cfmaster.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_name

postconfコマンド

Postfix全般設定値を表示するコマンド。 なお表示される値は設定ファイルに基づいて表示される。

postconf

-nオプションではデフォルト値から変更されている項目のみ表示される。

master.cfの設定

Postfixを構成するプロセスの動作を設定するファイル。

postfixコマンド

Postfixの制御を行うコマンド。

postfix <サブコマンド>
オプション説明
startPostfixの開始
stopPostfixの停止
abortPostfixの強制停止
flushキュー内にあるメッセージの再送
reloadPostfixの設定を再読み込みする
check設定ファイルの構文チェックを行う

また起動スクリプトやsystemdによる起動停止も行える。

/etc/init.d/postfix stop
systemctl stop postfix.services

Postfixの正規化機能

Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。 この機能により、以下のようなことが可能となる。

  • 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
  • ユーザ名(ログインID)と異なるメールアドレスを使用する

canonical機能は以下の手順で有効にする。

  1. main.cfにて、書き換えルールの参照先(検索テーブル)を指定 * 書き換えルールには以下のパラメータが指定可能 * canonical_maps:送受信時の書き換えで参照する検索テーブル * sender_canonical_maps:送信者アドレスの書き換え時に参照する検索テーブル * recipient_canonical_maps:受信者アドレスの書き換え時に参照する検索テーブル
  2. 検索テーブルの作成、更新

なお、指定する検索テーブルには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ディレクトリ以下のユーザ名のテキストファイル

12.2. メールのフィルタリング

メールのフィルタリングはスパムメールなどのメールをルールに従って振り分ける仕組み

12.2.1. Sieveの設定

Sieveはメールフィルタリングを行うための記述言語。 **「コントロール」「テスト」「アクション」**という3種類のコマンドで構成される。 Dovecotと連携し、サーバ側でメールフィルタリング処理を実行できる。

書式は以下の通り。

if 条件 {
    条件がマッチした場合の処理;
}

5GByteを超えるメールを拒否する設定例は以下の通り。

require ["reject"]

if size :over 5G {
    reject "Too Big Size";
}

sleveのコントロールは以下の通り。

コントロール説明
ifif-elsif-else
require拡張機能を指定
stop処理を停止

sieveの主なアクションは以下の通り。

アクション説明
fileinfoメールを指定したメールボックスに配送する
keepメールをデフォルトのメールアドレスに配送する
discardメールを破棄する
rejectメールを拒否する
redirectメールを指定したメールアドレスに転送する
stop処理を停止する
テスト説明
addressアドレスを評価
headerメールヘッダを評価
sizeメールサイズの評価
allofAND
anyofOR
notNOT
true
false

12.2.2. Procmailの設定

ProcmailはMDAの1つでMTAが受け取ったメールをここユーザに配送する。 procmaliをMDAに使うとメールフィルタリングや不要メールの自動破棄などが可能。

フィルタリング設定は各ユーザのホームディレクトリの.procmailrcファイルで設定を行う。 フィルタリングルールはレシピと呼ばれ3行で指定する。

:0 [フラグ] [:ロックファイル]
* 条件式
アクション

フラグはprocmailにメールを渡す方法を指定。条件式は正規表現でメール条件を記述する。

フラグ説明
D大文字小文字を区別する
Hメールのヘッダ部分で検索する
Bメールの本文部分で検索する
cメールのコピーを残す
hアクションにヘッダ部分を渡す
bアクションに本文部分を渡す
条件式説明
!条件否定
>指定したバイト数より大きいときに処理
<指定したバイト数より小さいときに処理
アクション説明
/dev/null破棄する
ファイル名指定したファイル名のファイルに格納する
ディレクトリ名ディレクトリ内にファイル名を付けて保存する
ディレクトリ名/.ディレクトリ内に連番を付けて格納する
|パス名指定したパスのプログラムに渡す
!メールアドレス指定したメールアドレスに転送する

12.3. POP/IMAP

POP/IMAPはメーラがメールボックスからメールを取りf出すのに使用する。 これらのサービスの利用にはDovecotCourier IMAPなどがある。

  • Dovecot
    • POP3/IMAPをサポートするMRA
    • Maildir及びmbox形式のメールボックスをサポート
  • Courier IMAP
    • 主にIMAPをサポートするMRA
    • Maildir形式のメールボックスのみをサポート

12.3.1. Dovecot

DovecotはPOP3/IMAP4に加えSSL/TLSに対応したMDA。 設定は/etc/dovecot.confで行う。

Dovecotの設定項目は以下の通り。

設定項目説明
auth_mechanisms利用する認証メカニズム
mail_locationメールの配送場所と配送形式
sslSSL/TLSの有効化のどうか
ssl_certサーバ証明書のファイル
ssl_keyサーバ鍵ファイル

メール関連のポートは以下の通り。

ポート説明
110POP3
143IMAP
993IMAP over SSL/TLS
995POP3 over SSL/TLS
# dovecot.confより
listen = 192.168.1.1

protocols = imap pop3 lmtp

# psコマンドの出力に詳細表示を行う
verbose_proctitle = yes

# /conf.d/10-mail.confより
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u

# /conf.d/10-auth.confより
auth_mechanisms = plain login cram-md5 apop digest-md5

# /conf.d/20-imap.confより
protocol imap {
    mail_max_userip_connections = 10
}

auth default {
    mechanisms = plain login cram-md5 apop digest-md5
}

doveconfコマンド

Dovecotの設定内容を出力できるコマンド。

doveconf
オプション説明
-nデフォルト以外の設定を表示
-c設定ファイルを指定

doveadmコマンド

Dovecotの管理用コマンド。

doveadm <サブコマンド>
サブコマンド説明
config設定内容を表示
reload設定の再読み込み
stopdovecotプロセスの終了
log findログファイルパスの確認
log testテストログメッセージの生成
mailboxメールボックスを管理
whoサーバログイン中のユーザ情報表示
pwパスワードハッシュ値の生成
最終更新 2025.01.19: Added ss command (683d062)