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でテンプレートが指定されたときにはそこともグローバル変数を共有したほうが良いかも