BBAB さんが書きました:
ある条件でフォルダに移動させているのですが、フィルタの条件が被ってしまうメールがあり、
フィルタリング時に2つのフォルダを行ったり来たりします。
>フィルタA 件名が「aaa」で始まるメッセージを「AAA」フォルダに移動
>フィルタB 差出人に「bbb.ccc.jp」を含むメッセージを「BBB」フォルダに移動
この条件で、(メールX) 「bbb.ccc.jp」から件名「aaa」から始まるメール、が届くと「AAA」と「BBB」フォルダ間を行ったり来たりします。
(メールX)は、説明の都合上、私がつけたものです。
説明だけでは、手動でフィルターを適用した時の話なのか、新規メッセージに自動でフィルターが適用された時の話なのか、不明だし、
実際に何が行われて何が起こっているのかも不明なので、
両方のケースについて、私が知っている、そのフィルタールールだけで起こり得るかもしれない「メッセージフィルターによってフォルダ間を行ったり来たり」のケースについて書いておきます。
[手動でフィルターを適用した場合で、バグが関係する場合]
(A) 「AAA」フォルダでフィルタを適用
「AAA」フォルダに(メールX)がある時は、(メールX)が、先にフィルタAにヒットして「AAA」フォルダに移動、になるはずだが、
既に「AAA」フォルダにあるから「移動ではない」になってしまうようで、ここでは終わってくれず、
下のフィルタBが適用され、ヒットして「BBB」フォルダに移動される。
(B) 「BBB」フォルダでフィルタを適用
「BBB」フォルダに(メールX)がある時は、定義通りに、(メールX)が、先にフィルタAにヒットして「AAA」フォルダに移動される。
という風になります。
(B)の方は、フィルターの定義がそうなっているんだから、当然です。
しかし、(A)の方は、順番通りにルールが適用されていないように見えて、ちょっといやらしいですね。
バグなんですが、既に解決していたかもしれません。
[IMAPで、Namespaceが使用されていなくて、新規メッセージに自動でフィルターが適用される場合]
(A)新規メッセージの自動的なチェックを行っている。
(Bー1)Inbox/AAA、Inbox/BBBのフォルダープロパティーで、新規メールチェックの時にこのフォルダーを含む、の設定をしている、
(B-2)あるいは、サーバー設定でIDLEコマンドの使用を許可し、サーバーがIDLEコマンドをサポートしていて、
フィルターがInbox/AAA、Inbox/BBBにメールを移動したあと、
Cached Connectionsに余裕があるので、Inbox/AAA、Inbox/BBBを開かれたままの状態にできる。
(C)Inbox以外でも新規メッセージに対する自動的なメッセージフィルターを行わせる、特別な設定を行っている。
メッセージフィルターでのメールの移動の無限ループが起こり得るので、この設定は、デフォールトではオフ。
これを行っていると、
(1) (メールX)が、フィルターにより、Inbox⇒Inbox/AAAに移動される
(2) Inbox/AAAで、(メールX)が新規メッセージとして検知され、フィルターが適用される。
その時に、上記の(A)の問題が起こると、(メールX)がInbox/BBBに移動される。
(3) Inbox/BBBで、(メールX)が新規メッセージとして検知され、フィルターが適用される。
その時に、フィルターがそのように定義してあるから、(メールX)はInbox/AAAに移動される。
(4) Inbox/AAAに於いて(メールX)は新規メッセージだから、(2)が起こり、(2)/(3)が繰り返される。
ということが起こり得ます。
Namespace=INBOX/(or INBOX.)の時は、
(D)Inboxの子供の場合、(B-1)の設定をしなくても、(B-1)の設定がされている時と同様に新規メールのチェックに行く、
ということが、起こったかもしれません。
Namespaceに関係なく、IMAPでInboxの子供の時は必ず、だったかもしれませんけど。
理由は、そういった要求があったからなのか、特殊な条件の時の問題回避のためかは知りませんが、Inboxの子供はInboxと同じように扱う、というようなコードは、読んだことがあります。
IMAPでTrashとInbox/Trashの両方があるとどちらもごみ箱フォルダになる、というケースの時だったかもしれませんが。
でも、
(E)Inboxの子供の場合、(C)の設定をしなくても、(C)の設定がされている時と同様に自動的にフィルターを適用する、
というような問題は、記憶にありません。
IMAPで(C)を行っていて自動でフィルターが適用される場合の話ならば、(C)を止めれば済む話になりますが、
手動であれ自動であれ、こういった問題で、どうにも避けようがない場合には、
一回しかフィルタールールが適用されないように、タグなどを活用するといいかもしれません。
フィルタA:タグがTagAを含まない&&件名が「aaa」で始まる => TagA/TagBをつけて、「AAA」フォルダに移動
フィルタB:タグがTagBを含まない&&差出人に「bbb.ccc.jp」を含む => TagA/TagBをつけて、「BBB」フォルダに移動
一度TagA/TagBをつけておけば、タグがつけられないというようなバグに遭遇しない限り、次回からは条件にヒットしません。
AlreadyFilteredというような共有のタグやスターでも構いませんし、未読の条件・既読に変える、のセットでも構いません。
IMAPの場合は、以下のような回避策も考えられます。
ー 新規メッセージはUnread(未読)メールだけ、ということを利用して、フィルターで既読に変えて置き、必要ならタグやスターをつけておく。
こうすれば、フィルターで移動したメールに対しては、新規メッセージに対する自動的なフィルターは適用されないはず。
ー サーバー側のフィルターを活用して、メーラー側でのフィルターは止める。
ー メールの移動先を、他の全部Inboxの下ではないIMAPサーバーのフォルダー(たとえばGmail IMAP)や、
ローカルのフォルダー(ローカルフォルダ、ダミーのPOP3サーバー)ーに変える。
ご参考までに。
[追記]
定義の順番に依存しない、曖昧さのないフィルターの定義、というのも、こういった問題に対しては有効です。
If From doesn't contain a@a.a.a && Subject contains AAA, Move to AAA
If From doesn't contain a@a.a.a && Subject doesn't contain AAA, Move to CCC
If From contains a@a.a.a && Subject contains AAA, Move to BBB
If From contains a@a.a.a && Subject doesn't contain AAA, Move to BBB
たとえ、バグのせいで、メールがAAAフォルダにあるとMove to AAAが無視されたとしても、
他のフィルタールールによってそのメールが他のフォルダーに移動されることは、どういう順番で定義したとしても、起こらないから、
たとえバグがあったとしても、AAAフォルダに留まることになり、一件落着。
仕様的には、先に定義してある ... Move to AAAのところで、Move to AAA、Stop further filter execution、と、書く必要がないStop further filter executionをいれておけば、バグの回避策になるはずだけれど、
Stop further filter executionを指定した時のバグはまだ完全には解決していなかった気がするし、
Move to AAAを無視する時はその後のアクションも無視するかもしれないので、非常にリスキーです。
ご注意を。
[追記おわり]