7.sieveを使ったフィルタリングアクション(POPサーバ側でのフィルタリング)

 自分のドメインに届いたメールで重要なものは携帯に転送してリアルタイムで確認したい。
例えば、Amazonからのメールでおすすめ商品のメールは家に帰ってからでもいいけど、購入した商品が「発送されました」とか「配達完了しました」などのメールは携帯に転送することでリアルタイムで見れるようにする。
というような細かい条件によってどうしたいかをsieveを使うことで叶います。

 ここではとりあえず、PostfixとDovecotを使ったメール環境でLDAを使ってsieveを有効にし、.sieveファイルに転送条件を記載する方法を記します。
なんか、調べてたらLDAよりLMTPの方が多数のメールアカウントが存在するサーバで高負荷状態でも正常に動作して高性能らしい。
(LDAでは同時に大量のメールが送られてくると配送ミスなどを起こすらしい。)
さらにLMTPはバーチャルユーザや複数ドメインも扱えるらしい。

 とはいえアタイは自分一人しか使わないし1つのドメインしか使ってない。
ましてやバーチャルユーザも使っていない。そのような場合はLDAでも問題なく使えるらしいのでLDAでの設定を行っていきます。
まぁそのうち時間があったらLMTPで設定してみようかな・・・

目次
 Postfix側の設定
  main.cfの設定
   mailbox_command
  Postfixサービス再起動

 Dovecot側の設定
  15-lda.conf
   protocol lda { }
  90-sieve.conf
   sieve_script personal
  Dovecotサービス再起動

 .sieveファイルの作成

 .svbinファイルの作成

Postfix側の設定

main.cf

mailbox_command

ローカルユーザのメールボックス配信コマンド
自ドメイン宛のメールを、ローカルのメールボックスに配送する際に使用するコマンド。
sieveを使えるようにする為にはldaを呼びだすことでsieveを使えるようになります。

#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
   ↓ ↓ ↓ ↓ ↓
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

-f "$SENDER" ・・・ ldaを呼び出した際にバウンスメールを返すようにするためのオプション。
(sieveを使用することとは関係ない)
-a "$RECIPIENT" ・・・ こちらはsieveでenvelope条件を使用する場合に必要になります。
              → メールヘッダの「RCPT TO」欄を条件に使う際に必要になる。(という理解。今アタイはenvelope条件を使ってないので確かめられてないです。)

Postfix再起動

systemctl restart postfix.service

Dovecot側の設定 (Ver 2.4以降)

15-lda.conf

protocol lda { }

ローカル配信エージェント設定
Dovecot CEから落としたコンフィグ例では、コメントアウトされた状態でsieveがyesとなっているのでコメントアウトを削除します。
間違えて本来のコメント行部分も「#」を消さないように!
アタイはコメント文の#も消して再起動時に怒られました(w

protocol lda {
  # Boolean list of plugins to load
  #mail_plugins {
  #   sieve = yes
  #}
}

       ↓  ↓  ↓

protocol lda {
  # Boolean list of plugins to load
  mail_plugins {
     sieve = yes
  }
}

90-sieve.conf

sieve_script personal { }

ユーザごとのsieveスクリプト定義
ユーザごとに読み込むsieveファイルがどこにあるかを記載します。
Dovecot CEから落としたコンフィグ例では、コメントアウトすら外れた状態で記載されているのでconf.d 配下に90-sieve.confファイルを置くだけでよいです。
一応記載内容を下記に示します。

sieve_script personal {
  path = ~/sieve
  active_path = ~/.dovecot.sieve
}

基本はそれぞれのユーザごとに書くことができるファイルになるので、
/home/[ユーザ名]/ 配下に .dovecot.sieve というファイルに書くことになります。

Dovecot再起動

systemctl restart dovecot.service

.sieve ファイルの書き方(転送のみ)

 sieveはいろいろな条件によってメールを制御することができます。
条件はいろいろあって、メール本文やメールヘッダの内容。日付や時間。容量なんかも見れるかも。
それらの条件によってどうアクションするかもいろいろあるみたいです。
メールそのものを拒否。メールヘッダを修正。コピー・転送。etc
ここではいろいろな条件やアクションは書きません。
メールヘッダ情報の送信者メアドを参照して、送信先にメール受信。そのメールをコピーして携帯にも転送。という条件を書きます。

 ファイルの置き場所は対象ユーザのホームディレクトリ直下になります。
例えば、fedoraユーザであれば /home/fedora/.dovecot.sieve
所有者は対象ユーザ。パーミッションについては600が推奨されているようです。
まぁ、上位ディレクトリのfedoraが700になっているので644になっていたとしても他ユーザが見れることはないと思うけど変えておきましょう。

require ["copy"];

if anyof (
    address :is "From" "auto-confirm@amazon.co.jp",        ##  注文完了
    address :is "From" "shipment-tracking@amazon.co.jp",   ##  発送済み
    address :is "From" "order-update@amazon.co.jp"         ##  配達中・配達済み
) {
    redirect :copy "hogge-hogge@docomo.ne.jp";        ##  携帯にコピー転送
}


if address :matches "From" "*@hogge-hogge-corp.com" {   ##  会社からのメールは全てアカウントを問わず
    redirect :copy "hogge-hogge@caramelsauce.info";   ##  このアドレスにコピー転送
}

require ["copy"] ・・・ アクションで :copy を使う場合にはrequireを使って宣言する必要あり。

■1つ目の条件
 amazonからのメールでアカウント部分(3種類)によって、hogge-hogge@docomo.ne.jpにもメールを転送。という内容になります。
 ----
 if anyof ( ) ・・・ 複数の条件を「,」区切りで記載可能。OR条件。
          ※ 補足 if allof ( ) と書くとAND条件。

   address ・・・ メールヘッダのアドレス部分を参照
     :is  ・・・ 完全一致
    ”From” ・・・ 送信者のアドレスを参照
 { } ・・・ アクション部分
   redirect ・・・ 転送
    :copy ・・・ 対象メールをコピーして転送。(もともとの送信先にも配信される。)

■2つ目の条件
 @hogge-hogge-corp.com ドメインからのメールは、hogge-hogge@caramelsauce.infoにもメールを転送。という内容になります。
 ----
 :matches ・・・ 「*」や「?」を使うことができる。 

こんな感じでいろいろな条件で、いろいろなアクションを起こすことができます。
「sieveの書き方」で調べればいろいろな条件の書き方などがわかると思います。
 ここでは書きませんが・・・

.svbin ファイルの作成(sievec コマンド)

 実際はわざわざコマンドを打って作成しなくても.svbinファイルが存在していない場合は勝手に作成してくれます。
が、
動作フローは、パフォーマンス優先の為最優先でバイナリの.svbinファイルを参照しに行き、なければ.sieveファイルを参照。
.svbinファイルがあっても、.svbinファイルと.sieveファイルの日付を比較して.sieveファイルの更新日時が新しければ.svbinファイルを作成します。
よってわざわざコマンドを実行して.svbinを作らなくてもよいですが、一応コマンドも知っておこうかな、と。
sievecコマンドを実行して .svbinファイルを作成・更新することができます。

cd /home/fedora
sievec .dovecot.sieve

 これで.dovecot.svbin ファイルが作成されます。
セキュリティー的には.sieve同様に所有者・グループは対象ユーザに。パーミッションは644になっているものを600にしておいた方がよいっぽい。
umaskが022になっているから644になっていたのであり、umaskの設定によっては自動生成されたファイルのパーミッションが644ではない可能性も大いにあります。
 svbinやsieveファイルを更新しただけではDovecotのサービス再起動は必要ありません。

ここまで出来たらsieveファイルを作ったユーザに条件に入れたメールアドレスからメールを送信してメール受信&携帯側にもメールが届いたら完了です。
まぁ、ケータイ側は受信設定や拒否設定などの確認もしてください。