こちらで書いた記事の続編です。
前回の作業から時間がたってしまいましたが、今回は、.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 って確かいろいろと面倒なんだよな、ぐらいにしか知識がなかったので、せっかくなので、日本語メールについて改めて調べてみました。下記サイトなどがわかりやすかったです。
で、参考サイトに全部書いてありますが、せっかくなのでその結果わかったことも交えて書いていきます。
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文字で改行されるそうです。
幸い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 として配置して、テストしてみます。
サンプルのメールを送ると正しく振り分けができていました。
参考
.mailfilter の資料
.mailfilter 自体の振り分けではもっといろいろなことができますので、下記の参考サイトなどを 参考に必要に応じて調べてみてください。
- https://aka-tsuki.net/debian/maildrop.html
- maildropfilter
- https://faq.sakuratan.com/wiki/%A5%E1%A1%BC%A5%EB
8bit MIME
メールの日本語対応の話を調べていたら、 Content-Transfer-Encoding に 8bit という指定があることがわかりました(8bit MIME)。 でも、メールは7bit とよくいうのに、なんでそんな規格で通せるのか?というのが下記のサイトで説明してありました。
しらないことだらけですね。
vim でのエンコードの指定方法
さくらインターネットはデフォルトの文字コードが ECU です。 でも、 vim を使えば、UTF-8のファイルも編集できます。その際の、vim でのエンコードの指定方法です。