はじめに
LPIC202 のトピック 211「電子メールサービス」より、電子メール配信の管理(Sieve / procmail)についての学習メモをまとめる。本稿で 211.1(電子メールサーバの使用)・211.3(メールボックスアクセスの管理)と合わせてトピック211を完結させる。
シラバスは公式サイトを参照。
メール配送の用語と全体像(MTA / MDA / MRA / MUA)は211.3 メールボックスアクセスの管理のメモで整理した。本稿は配送の最終段、届いたメールを「どの箱に入れるか/捨てるか/転送するか」を判定するフィルタリングが主役になる。
Sieve とは(配送フローでの位置)
Sieve は、メールが配信される瞬間にサーバ側で実行される メールフィルタリング専用の言語(RFC5228)。要点は3つ。
- 言語であってソフトではない(Postfix や Dovecot のような「製品」ではなく、それらの上で動く「ルール」)
- サーバサイドで動く(クライアント=MUA ではなくサーバ側で処理する)
- メール振り分け専用(汎用プログラミング言語ではない)
配送フロー(211.3の図)でいうと、MTA が運び終え、メールボックスに入れる直前の「配送(MDA / LDA)」の関所が Sieve の定位置になる。
[送信MUA] --SMTP--> [MTA: Postfix/sendmail] --> ┌─ MDA/LDA:配送=振り分けの関所 ─┐
│ procmail (MDAソフト)│
│ Dovecot-LDA + Sieve (言語を実行)│
└──────────┬───────────────────┘
fileinto / discard / redirect …
▼
メールボックス (Maildir / mbox)
[受信MUA] <--POP3/IMAP-- [MRA: Dovecot] <----読み出し-------┘
- Sieve が扱うのは「この箱へ振り分ける/転送する/捨てる/拒否する」という配信時の判定。
- サーバ側で動くため、利用者が PC(MUA)を開いていなくても、メールが届くたびに自動でフィルタが効く。これが MUA 側の仕分けルール(クライアント起動中だけ動く)との決定的な違い。
- Dovecot と連携し、メールボックスへの配信時に SPAM 破棄などを行える。
Sieve と procmail(言語 vs MDAソフト)
同じ「配送時の振り分け」を担う仕組みに procmail がある。両者は役割の性質が異なり、ここが試験でも実務でも要点になる。
| procmail | Sieve | |
|---|---|---|
| 正体 | MDAソフトウェア(プログラム本体) | 言語/スクリプト(RFC5228)。単体では動かず実行役が要る |
| 実行役 | procmail 自身 | Dovecot(LDA)等が解釈・実行 |
| 設定 | ~/.procmailrc | ~/.dovecot.sieve 等のスクリプト |
| 外部コマンド実行 | 可能(高機能だが危険) | 不可(サンドボックス=安全) |
| 位置づけ | 伝統的・高機能だが古い | 標準化・安全。利用者に自分のフィルタを編集させやすい |
- procmail … sendmail などの MTA が受信したメールを各ユーザに配信する MDA。
.procmailrcでローカルな振り分けもできる。 - Sieve … 配信時に動く サーバサイドの言語。Postfix / Dovecot / POP などの「ソフト」ではなく、それらの上で動く「ルール」である点に注意。
配送チェーンの他の役者と混同しないよう整理する。
| ソフト / 言語 | 配送上の役割 |
|---|---|
| Postfix / sendmail | MTA(送る・運ぶ) |
| procmail | MDA(各ユーザへ配信) |
| Dovecot | MRA(POP3 / IMAP で読み出し)+ Sieve の実行役 |
| Sieve | 配信時のフィルタ言語(ソフトではない) |
Sieve の基本構文
Sieve スクリプトは「拡張の宣言(require)→ 条件分岐(if)→ 処理(action)」という骨格で書く。
require ["fileinto", "reject"]; # ① 使う拡張を最初に宣言
if anyof (header :contains "subject" "SALE", # ② 条件(テスト)。anyof=OR
header :contains "from" "spam-sales.com") {
discard; # ③ 処理(アクション)。文末は ;
}
elsif header :is "from" "boss@example.com" {
fileinto "Important"; # 指定フォルダへ振り分け
}
else {
keep; # 既定の受信箱に保管
}
構文ルールは次の通り。
| ルール | 内容 |
|---|---|
| 文末 | 各コマンドは ;(セミコロン) で終える |
| ブロック | 条件にマッチした処理は { } で囲む |
| 条件結合 | allof( )=AND ・ anyof( )=OR。( ) 内にテストをカンマ区切りで並べる |
| マッチ型 | :contains(含む)/ :is(完全一致)/ :matches(ワイルドカード) |
require(拡張機能の宣言)
if / keep / discard / redirect / stop などの中核コマンドは標準で使えるが、fileinto・reject・vacation などの 拡張を使うにはスクリプト先頭で require による宣言が必要。
require ["fileinto", "vacation"];
「fileinto や keep は基本だから require は不要」というのは誤り。fileinto は拡張なので require が要る。
暗黙のkeep
どのアクションもメールを保管・破棄しなかった場合、Sieve は自動的に keep(既定の受信箱へ配送)する。「ルールに書き忘れる=メールが消える」ではない。
また stop はスクリプトの 処理を止めるだけで、メールを破棄するわけではない(このとき暗黙の keep が効く)。
コマンドの3分類(コントロール / テスト / アクション)
Sieve のコマンドは コントロール / テスト / アクション の3種類に分かれる。「どのコマンドがどの分類か」が 211.2 で最も問われる。
| 分類 | 役割 | コマンド |
|---|---|---|
| コントロール | スクリプトの制御構造 | if(elsif / else)/ require / stop |
| テスト | 条件を真偽で評価(if の中で使う) | address / header / size / allof(AND)/ anyof(OR)/ not / true / false |
| アクション | メールに対する処理 | keep / fileinto / redirect / discard / reject |
特に取り違えやすい点。
requireはコントロール。「拡張機能を“要求”する」と動詞的なのでアクションに見えるが、分類はコントロール。allof/anyofはテスト。「全部/いずれか」と束ねる語感からコントロールと誤解しやすいが、真偽を返すテスト。- 3分類は「コントロール/テスト/アクション」。「コントロール/テスト/エクステンション」という分け方は誤り。
- 論理積(AND)=
allof、論理和(OR)=anyof。and/or/oneofというコマンドは存在しない。
アクションの使い分け
アクション5種は動作が似ていて紛れやすい。特に「破棄」と「拒絶」の違いが頻出。
| アクション | 動作 | 送信者への通知 |
|---|---|---|
keep | 既定の受信箱に 保管 | — |
fileinto | 指定したメールボックス(フォルダ)へ 配送 | — |
redirect | 指定アドレスへ 転送 | — |
discard | 黙って 破棄 | なし(無言で消す) |
reject | 配信を 拒絶し、エラー(バウンス)を返す | あり |
discard(黙って破棄)とreject(拒絶+エラー通知)の違いが定番。配信の拒絶はreject。deny/drop/refuseというアクションは 存在しない。- 転送は
redirect。fileintoは同一サーバ内のフォルダ振り分けであり、外部アドレスへの転送ではない。 keepはユーザのメールボックスに 保管 するアクション。「サーバのキューに残したままにする」ではない。
拡張機能と vacation(休暇自動応答)
長期休暇中などにメールへ自動応答したい場合は、Sieve の vacation 拡張を使う。
require "vacation";
vacation
:days 7
:subject "休暇中の自動応答"
"現在休暇中です。○月○日以降に返信します。";
- サーバ側で動くため、PC(MUA)を開いていなくても自動応答が成立する。MUA の転送機能や「Web メールでその都度対応」より確実で、これが Sieve を使う理由になる。
vacationは拡張なのでrequire "vacation";が必要。:daysで再送間隔を指定し、同じ送信者へ何度も自動返信しないよう制御する。
メール保存形式(mbox / Maildir)
Sieve の fileinto が「どの箱へ入れるか」を決めるのに対し、その箱の 保存形式には mbox と Maildir の2方式がある(特徴の詳細は211.3 のメモで整理した)。
| 形式 | 格納方法 | 構造 |
|---|---|---|
| mbox | 全メールを 1つのファイルに連結 | 単一ファイル |
| Maildir | 1メール = 1ファイル | cur / new / tmp の3サブディレクトリに分類 |
- どの形式で保存するかは、配信側(Postfix の
home_mailbox)と読み出し側(Dovecot のmail_location)で決まる。Sieve は「どのフォルダへ」を担当し、「どの形式で」はこれらに委ねる。 - 判別キーは、Maildir =
cur/new/tmpの3ディレクトリ、mbox = 1ファイルに集約。