前回は、簡単なメインコードを書いてみました。
今回は、さらに実用的なコードを書いてきます。
[asin:B07ZWCDYZG:detail] evernote.com trello.com
From: で処理をわける
それでは、一連のテーマであったPDFドキュメントを流し込む設定についてコードを書いてみましょう。動きについての詳細をある程度煮詰めていきます。
未知のPDFをいきなりKindleに送り込むことはありませんので、例えば送り主は exmaple.com からPDFを添付した状態で送ってくるものとします。
- PDFをKindleへ送り込まない自分宛てメールについては「TrelloのContactボード上でカードを自動で新規作成すること」という動きとします
するとコードは次のように*1なります。
# test9-1 require ["include", "variables"]; global "subject"; # 元メールのSubject:を保存 if header :matches "Subject" "*" { set "subject" "${1}"; } include "docsend_init"; if anyof ( address ["To", "Cc"] "example@example1.jp", address "From" "example@example1.jp", address ["To", "Cc"] "example@example2.jp", address "From" "example@example2.jp" ) { if anyof ( address :domain "From" "exmaple.com", ) { include "docsend_config_kindle"; include "trash"; } else { include "docsend_config_trello_contact"; keep; } } else { redirect "read_later@exapmle.jp"; } include "docsend_run"; discard;
処理用アカウント
一部のメールアカウントが Sieve に対応してない
お使いのメールサーバーが Pigeonhole Sieve をサポートしていれば先ほどのコードで問題ないのですが、ご自身で管理されてるメールアカウントの全てがSieveに対応しているとは限りません。
そうした場合でも、お持ちのアカウントの一つが Pigeonhole Sieve をサポートしていれば、かなりのことが実現可能です。
具体的には、メールクライアントから Sieve対応のメールアドレスへ転送して使う事を考えるわけです。
ただ、ほとんどのメールクライアントソフトで転送設定を施すと、メールクライアントに設定したアカウントを新たな From: として用いる事が多いようです。その場合、From: が自分自身のアドレスになるので、先ほどのコードのように From: では判別できなくなります。
そこで、新たな手法を考えます。
拡張アドレスを使う
拡張アドレスという聞き慣れない言葉が出てきましたが、簡単に説明すると一つのアカウントで複数のアドレスを持つことが出来るようにする仕組みです。日本語では*2「拡張メールアドレス」「拡張アドレス」「サブアドレス」「エイリアス*3」等の呼ばれかたがあるようです。
仕組み的には、emailのローカルパート部分*4を特定の文字(列)で分けて使えるようにしよう、という感じになります。
メールサーバー上の設定である程度任意の文字に設定することが可能ですが、ここでは、その特定の文字を一般的に広く使われている '+' だとして話を進めていきます。
拡張アドレスを使ってコードを整理
それでは拡張アドレス使ったコードに書き換えてみましょう。
例として、複数のアカウント example@example1.jp と example@example2.jp を管理しているとして、さらに Sieveが使える example@example3.jp へ転送して使うことを考えます。
メールクライアント側では、
example@exmaple1.jp 宛のメールを example+example1@example3.jp へ転送
example@exmaple2.jp 宛のメールを example+example2@example3.jp へ転送
という設定にした場合、次のようなコードを記述することができます。
#test9-2 require ["include", "variables", "envelope", "subaddress"]; global "subject"; # 元メールのSubject:を保存 if header :matches "Subject" "*" { set "subject" "${1}"; } include "docsend_init"; if envelope :detail "to" "example1" { if anyof ( address ["To", "Cc"] "example@example1.jp", address "From" "example@example1.jp" ) { if anyof ( address :domain "From" "exmaple.com" ) { include "docsend_config_kindle"; include "trash"; } else { include "docsend_config_trello_contact"; keep; } } else { redirect "read_later@exapmle.jp"; } } elsif envelope :detail "to" "example2" { if anyof ( address ["To", "Cc"] "example@example2.jp", address "From" "example@example2.jp" ) { include "docsend_config_trello_contact"; keep; } else { redirect "read_later@exapmle.jp"; } } else { keep; } include "docsend_run"; discard;
拡張アドレスを使うことによって同じように見える To: From: であっても違う処理を実行するのが可能なのが確認できます。
送り先がエラーの時
送り先がエラーの時の対処
自分で管理しているメールアドレスから送ったメールをredirect命令で転送処理する場合は問題ないのですが、第三者から送られてきたメールを今までの設定で転送する場合、何らかの原因で転送先がエラーになってしまった場合に、エラーメールが送信元(今回のケースでは第三者側)に返ってしまうことになります。
メールを送信した第三者の立場からすると、いきなり分けのわからないメールアドレスからのエラーメールが届く、ということになりますし、自分のところにはエラーメールが届かないので、そもそもエラーが起きてることすら分からない、つまり修正されることなくエラーメールを送り続ける、といった悲惨な状況になってしまいます。
ですので、今回のように転送を多用する場合には、自分が管理するアドレス宛にエラーメールが返ってくるのが好ましい挙動だといえるでしょう。
エラーメールの挙動は、サーバー側の設定で変更することになりますので、テストしてみてエラーメールが返ってこなかったり第三者からクレームが入るような場合は、サーバー管理者にお願いして、自分のところにエラーメールが返ってくるように設定変更をお願いしましょう。
まとめ
このように Pigeonhole Sieveを用いた場合、サーバー側で記述通りに処理しますので、「フィルターが書かれているメールクライアントを立ち上げ続けなくても良い」というのがメリットです。特に複数のメールクライアントから同じスプールを利用する場合、サーバー側で決められた通りの処理を実行してくれることは、運用上の手間をかなり省略することができます。
一方デメリットとしては、サーバー側が Sieveに対応していないと使えないことや、Sieve言語のお作法を多少覚えないといけない、といった事が挙げられます。が、先ほどのコード例のように、比較的シンプルなコードでかなりのことが実現可能ですので、ここまでお読みになられた読者の方なら十分使いこなすことができるるでしょう。
[asin:B07ZWCDYZG:detail]
evernote.com
trello.com
前回までの記事はこちらです。
tsh.hatenablog.jp tsh.hatenablog.jp tsh.hatenablog.jp tsh.hatenablog.jp tsh.hatenablog.jp tsh.hatenablog.jp