メール一覧枠のマクロでのヘッダ取得につNo.12756
ラフ さん 24/08/25 07:19
 
本フォーラムのメール配信のような投稿番号付きのSubjectを持つメールにおいて、
偶に受信漏れがあるので、抜け番のチェックをするマクロを組みました。
で、SetMailIndexとCurrentHeaderの組み合わせでループを回しているのですが、
メール内容表示枠に1件ずつ表示されてしまうためか処理が遅くなっています。
今は開始位置と終了位置のインデックスを入力する事で範囲を狭めて処理させてます
が、
内容表示をさせずに指定したメールのヘッダー内容を取り出すことは出来ないでしょ
うか?
内容表示が無ければもう少し速く処理できると思うんですが、
例えば 0番目のメールのSubjectヘッダだと
#idx = 0;
$subject = dllfuncstr( "GetHeader", #idx, "Subject" );
みたいな感じ
もしくは裏技のような物はないでしょうか?

[ ]
RE:12756 メール一覧枠のマクロでのヘッダNo.12757
秀まるお2 さん 24/08/25 15:38
 
tkinfo.dllに隠し関数があるかと思ったりしたんですが、無いです。ただ、技術的に
はSubject:ヘッダの内容というか、メール一覧に表示する用の情報なら取得できるよ
うに関数追加は可能です。Subject:ヘッダの内容は長さが250バイト程度にカットさ
れてメモリ上に持ってるので、それを返す関数なら追加できます。

SetMailIndexおよびMailIndex関数と同じでスレッド表示の場合は不可ってことなら
対応できます。

他のヘッダ内容も知りたいとしたら、index指定でヘッダを読み込んだりする関数追
加なら可能かもしれませんが、その後ヘッダの内容を解釈する用の別関数も必要にな
るかもしれないし、ちょっとやりたくないです。

[ ]
RE:12757 メール一覧枠のマクロでのヘッダNo.12761
ラフ さん 24/08/26 11:13
 
>SetMailIndexおよびMailIndex関数と同じでスレッド表示の場合は不可ってことなら
>対応できます。
マクロ側としてもスレッド表示だと処理困難ですので一覧表示のみでOKです。
今も強制的に一覧表示に変えてSubjectで降順ソートしてますので。

>他のヘッダ内容も知りたいとしたら、index指定でヘッダを読み込んだりする関数追
>加なら可能かもしれませんが、その後ヘッダの内容を解釈する用の別関数も必要に
>なるかもしれないし、ちょっとやりたくないです。
ヘッダ内容はマクロ作成者が解析すべきものだと思うのでメーラー側での解析は不要
かと思います。CurrentHeaderで取得できるものと同じでいいです。
今思ったんですが、CurrentHeaderで取得できればいいので、SetMailIndexの内容枠
非表示モード(一覧内の移動も無し)でもいいです。
SetMailIndex2みたいな感じで別関数にするか、SetMailIndexの引数追加でもいいの
で機能追加して頂けると助かります。
希望順位
1. インデックス指定でヘッダ取得(一覧画面が変化しないと思うので)
2. 上記SetMailIndex対応
機能追加が簡単な方でいいです(^^)

[ ]
RE:12761 メール一覧枠のマクロでのヘッダNo.12762
秀まるお2 さん 24/08/26 11:58
 
メール一覧表示用のキャッシュの情報を取得できるようにするだけでしたら対応簡単
で非常に高速動作します。それで、実はこれは簡単なので、今日アップロードしたVe
rsion 7.33正式版に隠し関数として追加してしまった所でした。GetMailListCacheっ
て関数追加してしまいました。

パラメータ1は、メール一覧上でのインデックスの値、
パラメータ2は、取得したい情報の種類で、とりあえず、
    0番 = Subject:ヘッダ内容
    1番 = To/From列のメールアドレス

って風にした所でした。

    loaddll "tkinfo.dll";
    #index = 100;
    $s = dllfuncstr("GetMailListCache", #index, 0);
    message "Subject = " + $s;
    $s = dllfuncstr("GetMailListCache", #index, 1);
    message "email = " + $s;

みたいなサンプルで確認できます。良かったらこれ使ってみてほしいですが・・・

> 今思ったんですが、CurrentHeaderで取得できればいいので、SetMailIndexの内容
>枠非表示モード(一覧内の移動も無し)でもいいです。

DisableDraw関数を使って画面描画させないようにしてループさせても実質同じじゃ
ないかと思いますが、それではダメでしょうか。

テストで、僕の受信フォルダにて以下のマクロを実行したら、350ミリ秒程度でした。

    loaddll "tkinfo.dll";
    #tick = tickcount;
    #n = dllfunc("DisableDraw", 0);
    #index_original = dllfunc("MailIndex");
    #index = 0;
    while( #index < 100 ) {
        #n = dllfunc("SetMailIndex", #index);
        #index = #index + 1;
    }
    #n = dllfunc("SetMailIndex", #index_original);
    #n = dllfunc("EnableDraw");
    #tick = tickcount - #tick;
    message str(#tick) + "ミリ秒";

DisabelDraw/EnableDrawをコメントアウトしたら、おおよそ3秒程度になりました。1
0倍とまではいかないですがそれなりに高速にはなってるし、仮にご希望の動作(Set
MailIndexだけど画面上変化なし)にしても、さらに10倍速くなるとかってことは無
いと思います。

速度的に最速でってことを考えるなら、例えばLoadMailByIndexみたいな関数でメー
ルをファイルからロードしてそれを文字列データに格納できて、その後、その文字列
からヘッダの中身を取り出せる、CurrentHeader相当の関数を別途追加してヘッダを
取得できるようにするとか、そういう風にすれば、純粋にファイル読み込み+マクロ
の処理のみの速度にはなるかとは思います。

まとめると・・・・

1.可能なら、最速になるはずのGetMailListCache関数を試してみてほしい。
2.DisableDraw/EnableDraw作戦も、もしまだ試して無い場合は試してみてほしい。
3.それでもダメならLoadMailByIndex関数追加みたいな作戦を考えてもいい。

です。

[ ]
RE:12762 メール一覧枠のマクロでのヘッダNo.12763
ラフ さん 24/08/26 16:11
 
ありがとうございます。両方とも試してみました
計測はSubtractDateのsecond指定で行いました。

通常モードで2000件に36秒かかりました
DisableDraw使用で2000件に8秒かかりました
GetMailListCache使用で2000件に1秒かかりました
ついでに全件試しました
GetMailListCache使用で8070件に2秒かかりました

さすがにキャッシュは劇的に速いですね。
1000件くらいだと0秒表示で一瞬で終わります(^^;

[ ]
RE:12763 メール一覧枠のマクロでのヘッダNo.12764
秀まるお2 さん 24/08/26 18:01
 
とりあえず今ちゃんと動いてるマクロがあって、DisableDraw/EnableDrawを使わずに
実行して遅かったってことでしたら、DisableDraw/EnableDrawを入れて実用になるか
どうか試してみてほしいです。それで実用的な速度になるならそれでOKじゃないかと
思います。

それでダメってことでしたら、とりあえず現状のGetMailListCache関数を使う形にマ
クロを改造可能かどうか、改造不可なら、インデックス指定でメールを読み込んで中
身を返す、またはその返す文字列の中から特定ヘッダの内容だけ取り出す関数追加っ
てことでの対応も可能なので、その時また連絡ください。

[ ]
RE:12764 メール一覧枠のマクロでのヘッダNo.12765
ラフ さん 24/08/26 18:49
 
12763の投稿の計測は実際のマクロに組み込んで測定した結果です。
ついでなんで本フォーラムの手元にある全件(約8070)でD全モードで計測してみました。

通常モードで8070件に161秒かかりました
DisableDraw使用で8070件に31秒かかりました
GetMailListCache使用で8070件に1秒かかりました

DisableDraw使わない161秒はちょっと待ってられないですね。
DisableDrawモードは処理件数がここまで多くならなければ実用的だと思いますが、
これ以上多くなるとGetMailListCacheしか選択肢がなさそうです。
ということでGetMailListCacheモードで運用しようと思います。

[ ]