QsMLが時々配信されないことがあって、しかも気づかないままになっていたことがあったので、振り分けルールを使って、抜けがないかどうか簡単にチェックできないかと考えてみました。とりあえず作ってみたのはこんな感じ。
<ruleSet account="test"> <rule match="@True()"> <apply macro=" @Progn(@Defun('GetID', X-Mail-Count), @Set('id', @GetID()), @If(@Equal($prev, ''), @Set('prev', $id, @True()), @Progn(@If(@Not(@Equal($prev, @Minus($id, 1))), @MessageBox($id), @True()), @Set('prev', $id, @True())))) "/> </rule> </ruleSet>
一つ前のMLカウントを覚えておいて、現在のMLカウントが一つ前のMLカウント+1になっていなかったらメッセージボックスをだします。
しかしうまくいきません。なぜかと思って調べてみると、applyタグでマクロを実行した場合には各実行ごとでグローバル変数が共有されていないからでした。仕方がないので、matchでマクロを実行してしまうことにします。
<ruleSet account="test"> <rule match=" @Progn(@Defun('GetID', X-Mail-Count), @Set('id', @GetID()), @If(@Equal($prev, ''), @Set('prev', $id, @True()), @Progn(@If(@Not(@Equal($prev, @Minus($id, 1))), @MessageBox($id), @True()), @Set('prev', $id, @True()))), @True()) "/> </ruleSet>
そこそこうまくいくようになったものの、問題ないところでもメッセージボックスが出ます。これは、フォルダに対して振り分けルールを適用すると、ID順に処理されるため、ID順とMLカウント順が異なることがあるためです。仕方がないので、そのフォルダのメッセージをすべて選択してから、選択したメッセージだけ振り分けてみました。この方法だとリストビューに並んでいる順番に処理されるのでうまくいきます。
考えてみると、現在の、振り分けをフォルダを対象におこなうというのはユーザの予想と異なる可能性がありそうです。たとえば、フィルタを設定している場合に振り分けた場合、通常はフィルタリングされたメッセージだけが振り分け対象になると予想すると思いますが、実はフィルタリングは無視されてフォルダのすべてのメッセージが振り分け対象になります。
などと考えると以下のような修正がいりそうです。
*1 moveやcopyでテンプレートが指定されたときにはそこともグローバル変数を共有したほうが良いかも