プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

mailfilter を使ってサーバー側でのメール振り分け処理

こちらで書いた記事の続編です。

前回の作業から時間がたってしまいましたが、今回は、.mailfilter を書いて、サーバー側でのメールの振り分けを行おうと思います。 主にやりたいことは、条件に一致したら、特定のフォルダに移動させるというものになります。

From による振り分け

振り分けたいフォルダ名の 修正UTF-7 表記さえわかれば、Fromによる振り分けはさほど難しくありません。

if (/^From:(\s.*\r\n)*\s.*.+[@.]mori-soft\.com.*/:h)
{
  to "maildir/.&Yy8wilIGMFEwxjC5MMg-.company1/" # 振り分けテスト/company1
}

行の途中に # が出てくるとそれ以降はコメントになります。

この振り分けルールは、

xxx@mori-soft.com から来たメールを『振り分けテスト/company1』というフォルダに振り分ける

となります。

なお、メール振り分け時の正規表現(改行の扱い)は、下記サイトを参考にしました。

さくらインターネットで受信したメールをサーバサイドで.mailfilterを使ってフォルダへの仕分けに挑戦してみた - WebStudio

設置

これを ~/MailBox/メールアカウント名/.mailfilter の名前で保存し、パーミッションを 600 にしておきます。 設置が終わったら、テストします。

[user@wwwxxxx ~/MailBox/メールアカウント]$ maildrop -V 9 < /dev/null
maildrop: Changing to user's home
Message envelope sender=MAILER-DAEMON
Tokenized string: "SENDMAIL"
Tokenized =
Tokenized string: "/usr/local/libexec/sendmail-wrapper"
Tokenized ;
Tokenized eof
/etc/maildroprc(1): SENDMAIL="/usr/local/libexec/sendmail-wrapper"
maildrop: Attempting .mailfilter
[user@wwwxxxx ~/MailBox/メールアカウント]$ 

syntax error などと表示されなければOKです。

Subjectによる振り分け

日本語メールの Subject って確かいろいろと面倒なんだよな、ぐらいにしか知識がなかったので、せっかくなので、日本語メールについて改めて調べてみました。下記サイトなどがわかりやすかったです。

sendgrid.kke.co.jp

で、参考サイトに全部書いてありますが、せっかくなのでその結果わかったことも交えて書いていきます。

Subject に日本語が含まれている場合は、MIMEでエンコードされています。 なので、Subject で振り分けるには、一旦、デコードしてあげる必要があります。

Subject のMIMEエンコード方法は、

  • Base64
  • Quated-Printable

の2方式があります。

これを実際にデコードするには、 nkf を使うのが一番簡単なようです。

例えば、『日本語』というSubjectのメールがある場合、それぞれ Subject は

エンコード方式 UTF-8 ISO-2022-JP
B (Base64) =?UTF-8?B?5pel5pys6Kqe?= =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=
Q (quoted-printable =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E?= =?ISO-2022-JP?q?=1B=24BF=7CK=5C8l=1B=28B?=

となります。

これをデコードするためには、

nkf -m -w

(出力は UTF-8 を想定) をかけてあげればOKです。

まずはコンソールでテストします。

[user@wwwxxxx ~]$ echo =?UTF-8?B?5pel5pys6Kqe?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ echo =?ISO-2022-JP?q?=1B=24BF=7CK=5C8l=1B=28B?= | nkf -m -w
日本語
[user@wwwxxxx ~]$ 

とどれも正しくデコードされているのがわかりますね。

(参考) * 時代工房の部活動 - さくらインターネットなどで .mailfilter(maildrop) をいじれるときのスパム受信を減らす設定 * https://hogem.hatenablog.com/entry/20100122/1264169093 * http://www.kipwmi.com/fm/tips/base64.htm

改行への対応

もう一つ確かめておきます。 Fromの際に参考にしたサイトにもありましたが、メールのヘッダは78文字で改行されるそうです。

tmtms.hatenablog.com

幸いSubjectをデコードする場合は、文字区切りまで意識しないでいいのですが、Subjectが複数行になった場合でもデコードできるか確認しておきます。

適当な長いSubjectのメールを実際に出してみて、エンコードされた結果をテキストファイルに貼り付けます。例えば、こんな感じですね。

非常に長いメールのサブジェクトをテストしてみるためのメールを一生懸命書いているけど、これって本当に意味あるだろうか?って思いながらもやっぱりテストは大事なので、頑張って長文を書いていますけど、さて何文字になったでしょうかね?

エンコード結果(メールの送受信は Becky! 2.74.01 でやりました)

[user@wwwxxxx ~]$ cat mail_long_subject 
Subject: =?ISO-2022-JP?B?GyRCSHM+byRLRDkkJCVhITwlayROJTUlVhsoQg==?=
 =?ISO-2022-JP?B?GyRCJTglJyUvJUgkciVGJTklSCQ3JEYkXxsoQg==?=
 =?ISO-2022-JP?B?GyRCJGskPyRhJE4lYSE8JWskcjBsQDg3fBsoQg==?=
 =?ISO-2022-JP?B?GyRCTD89cSQkJEYkJCRrJDEkSSEiJDMkbBsoQg==?=
 =?ISO-2022-JP?B?GyRCJEMkRktcRXYkSzBVTCMkIiRrJEAkbRsoQg==?=
 =?ISO-2022-JP?B?GyRCJCYkKyEpJEMkRjtXJCQkSiQsJGkkYhsoQg==?=
 =?ISO-2022-JP?B?GyRCJGQkQyRRJGolRiU5JUgkT0JnO3YkShsoQg==?=
 =?ISO-2022-JP?B?GyRCJE4kRyEiNGhEJSRDJEZEOUo4JHI9cRsoQg==?=
 =?ISO-2022-JP?B?GyRCJCQkRiQkJF4kOSQxJEkhIiQ1JEYyPxsoQg==?=
 =?ISO-2022-JP?B?GyRCSjg7eiRLJEokQyQ/JEckNyRnJCYkKxsoQg==?=
 =?ISO-2022-JP?B?GyRCJE0hKRsoQg==?=
[user@wwwxxxx ~]$ 

これをさきほどと同様にデコードしてみると

[user@wwwxxxx ~]$ nkf -m -w mail_long_subject 
Subject: 非常に長いメールのサブジェクトをテストしてみるためのメールを一生懸命書いているけど、これって本当に意味あるだろうか?って思いながらもやっぱりテストは大事なので、頑張って長文を書いていますけど、さて何文字になったでしょうかね?
[user@wwwxxxx ~]$ 

途中で改行が混ざることもなく、スペースが入ることもなく、問題なく元に戻っています。 これで、Subject のデコードも大丈夫そうですね。

振り分け

上記で調べたことを元に、振り分け処理を書いてみます。

[user@wwwxxxx ~]$ cat mailfilter.subject.sample 
SUBJECT=`cat | nkf -m -w | grep Subject`
if ( $SUBJECT =~ /.*振り分けテスト.*/ )
{
  to "maildir/.&Yy8wilIGMFEwxjC5MMg-.&Txp5Pv8S-/" # 振り分けテスト/会社2
}

[user@wwwxxxx ~]$ 

このルールの場合、

Subject に 『振り分けテスト』があれば、『振り分けテスト/会社2』のフォルダに移動する

となります。

これを .mailfilter として配置して、テストしてみます。
サンプルのメールを送ると正しく振り分けができていました。

f:id:junichim:20191004151734p:plain

参考

.mailfilter の資料

.mailfilter 自体の振り分けではもっといろいろなことができますので、下記の参考サイトなどを 参考に必要に応じて調べてみてください。

8bit MIME

メールの日本語対応の話を調べていたら、 Content-Transfer-Encoding に 8bit という指定があることがわかりました(8bit MIME)。 でも、メールは7bit とよくいうのに、なんでそんな規格で通せるのか?というのが下記のサイトで説明してありました。

しらないことだらけですね。

vim でのエンコードの指定方法

さくらインターネットはデフォルトの文字コードが ECU です。 でも、 vim を使えば、UTF-8のファイルも編集できます。その際の、vim でのエンコードの指定方法です。