はじめに

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 がある。両者は役割の性質が異なり、ここが試験でも実務でも要点になる。

procmailSieve
正体MDAソフトウェア(プログラム本体)言語/スクリプト(RFC5228)。単体では動かず実行役が要る
実行役procmail 自身Dovecot(LDA)等が解釈・実行
設定~/.procmailrc~/.dovecot.sieve 等のスクリプト
外部コマンド実行可能(高機能だが危険)不可(サンドボックス=安全)
位置づけ伝統的・高機能だが古い標準化・安全。利用者に自分のフィルタを編集させやすい
  • procmail … sendmail などの MTA が受信したメールを各ユーザに配信する MDA.procmailrc でローカルな振り分けもできる。
  • Sieve … 配信時に動く サーバサイドの言語。Postfix / Dovecot / POP などの「ソフト」ではなく、それらの上で動く「ルール」である点に注意。

配送チェーンの他の役者と混同しないよう整理する。

ソフト / 言語配送上の役割
Postfix / sendmailMTA(送る・運ぶ)
procmailMDA(各ユーザへ配信)
DovecotMRA(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( )=ANDanyof( )=OR( ) 内にテストをカンマ区切りで並べる
マッチ型:contains(含む)/ :is(完全一致)/ :matches(ワイルドカード)

require(拡張機能の宣言)

if / keep / discard / redirect / stop などの中核コマンドは標準で使えるが、fileintorejectvacation などの 拡張を使うにはスクリプト先頭で require による宣言が必要。

require ["fileinto", "vacation"];

fileintokeep は基本だから require は不要」というのは誤り。fileinto は拡張なので require が要る。

暗黙のkeep

どのアクションもメールを保管・破棄しなかった場合、Sieve は自動的に keep(既定の受信箱へ配送)する。「ルールに書き忘れる=メールが消える」ではない。
また stop はスクリプトの 処理を止めるだけで、メールを破棄するわけではない(このとき暗黙の keep が効く)。

コマンドの3分類(コントロール / テスト / アクション)

Sieve のコマンドは コントロール / テスト / アクション の3種類に分かれる。「どのコマンドがどの分類か」が 211.2 で最も問われる。

分類役割コマンド
コントロールスクリプトの制御構造ifelsif / 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)= anyofand / or / oneof というコマンドは存在しない。

アクションの使い分け

アクション5種は動作が似ていて紛れやすい。特に「破棄」と「拒絶」の違いが頻出。

アクション動作送信者への通知
keep既定の受信箱に 保管
fileinto指定したメールボックス(フォルダ)へ 配送
redirect指定アドレスへ 転送
discard黙って 破棄なし(無言で消す)
reject配信を 拒絶し、エラー(バウンス)を返すあり
  • discard(黙って破棄)と reject(拒絶+エラー通知)の違いが定番。配信の拒絶は reject
  • deny / drop / refuse というアクションは 存在しない
  • 転送は redirectfileinto は同一サーバ内のフォルダ振り分けであり、外部アドレスへの転送ではない。
  • 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つのファイルに連結単一ファイル
Maildir1メール = 1ファイルcur / new / tmp の3サブディレクトリに分類
  • どの形式で保存するかは、配信側(Postfix の home_mailbox)と読み出し側(Dovecot の mail_location)で決まる。Sieve は「どのフォルダへ」を担当し、「どの形式で」はこれらに委ねる
  • 判別キーは、Maildir = cur / new / tmp の3ディレクトリ、mbox = 1ファイルに集約