2004-08-11 [長年日記]

[Q3] 振り分け関係色々

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カウント順が異なることがあるためです。仕方がないので、そのフォルダのメッセージをすべて選択してから、選択したメッセージだけ振り分けてみました。この方法だとリストビューに並んでいる順番に処理されるのでうまくいきます。

考えてみると、現在の、振り分けをフォルダを対象におこなうというのはユーザの予想と異なる可能性がありそうです。たとえば、フィルタを設定している場合に振り分けた場合、通常はフィルタリングされたメッセージだけが振り分け対象になると予想すると思いますが、実はフィルタリングは無視されてフォルダのすべてのメッセージが振り分け対象になります。

などと考えると以下のような修正がいりそうです。

  • applyタグで指定するマクロは振り分けごとにグローバル変数を共有したほうが良い(matchを処理するときともグローバル変数を共有しても良いかも)*1
  • 振り分け対象は、リストビュー上に見えているメッセージだけの方が良い(さらに、リストビュー上に見えている順番で処理した方が良い)
  • @Minusってなんだ?(@Subtractだろう)

*1  moveやcopyでテンプレートが指定されたときにはそこともグローバル変数を共有したほうが良いかも

[]