SetMailTransmitDate関数が取得する日付とNo.05876
HarukA さん 08/06/20 00:17
 
いつも秀丸シリーズにはお世話になっております。
HarukAです。

GetMailTransmitDate関数を使って、表示範囲「最近の分」として表示されている数
字を求められるかどうか、教えていただけませんでしょうか。

ロジックとしては、「最近の分」で設定した日付の間に受信したメール数と、それに
該当しない未読メール数を足し合わせれば、「最近の分」として表示されている数字
と一致するのではないかと思ったのですが。。

上記『「最近の分」で設定した日付の間に受信したかどうか』の評価値としてGetMai
lTransmitDate関数で取得した日時を使用していますが、それが妥当かどうかという
ことがお伺いしたいことの趣旨です。

実際に上記ロジックでマクロを動かしてみると、大体は一致するのですが、一致しな
い場合もあります。(作成したロジックで求めた「最近の分」の方が、僅かに値が小
さくなります。)

経緯を以下に記します。

秀丸メールのマクロで、表示範囲が「最近の分」となっているメールを対象に、メー
リングリストの取得漏れをチェックするマクロを作成しようとしております。
特定のフォルダをSubjectで降順にソートし、SetMailIndex関数をwhile文でグルグル
と回してメーリングリスト番号の欠番を検出させるというものです。
(メーリングリスト番号はSubjectが[ml-name:00000]という形式であることが保証さ
れているので、数字部分が連番になっているかを確認することでチェックをします。)

そのwhile文のループ回数を「最近の分」のメール数だけ実行させたいので、何らか
の方法で現在開いているメールが「最近の分」に該当するか否かを判定する必要があ
ります。

マクロヘルプ内を検索しましたが、例えば"IsRecentMail"のような、期待する値を返
してくれそうな人は見当たりませんでした。

そこで、秀丸メールヘルプの「全般的な設定・メール一覧・表示範囲」を参考に、以
下のようなロジックで、開いているメールが「最近の分」に該当する場合は1を、し
ない場合は0を返却するサブルーチンを作成することにしました。

--------ロジック--------
●開いているメールが未読状態ならば、1を直ちに返却。
<既読の場合>
●CurrentDate関数で現在の日時を取得。(A)
●レジストリを開き、「最近の分」の設定日数を取得。(B)
●(A)と(B)を使い、「最近の分」リストを作成。(C)※1,2参照。
●GetMailTransmitDate関数で開いているメールの送受信日時を取得。(D)※1参照。
●(D)の日付が、リスト(C)内に含まれているかを検索。
  HITした場合は1、HITしなかった場合は0を返却。
------------------------
※1
リスト(C)、及び(D)の書式は"YYYY/MM/DD"形式に揃えて比較しています。
時刻部分は評価していません。
※2
リスト(C)は配列構造で、見た目は以下のようになっています。
レジストリから取得した(B)の値 = N

  (Index0)本日の日付
  (Index1)本日の日付 - 1
  (Index2)本日の日付 - 2
  (Index3)本日の日付 - 3
          ・
          ・
  (IndexN)本日の日付 - N

作成したサブルーチンを5000通(内、最近の分は500通程度)ほどのメールの束に対し
て走らせてみたところ、「最近の分」としてメール本体に表示されている数字と、サ
ブルーチン返却値の総和とが、一致する場合と不一致になる場合とがありました。
一致することの方が多いのですが、稀に「最近の分」の表示値に対して、サブルーチ
ン返却値の総和が-3程度小さくなります。

このことは作成したロジックが、本来「最近の分」と判断しなければならないところ
を「最近の分ではない」と誤判定したことを意味しますが、上記のようなロジックで
は最近の分か否かを正しく判定出来ないのでしょうか。

長文となり恐縮ですが、何か情報があればご教授いただけませんでしょうか。
よろしくお願いいたします。

[ ]
RE:05876 SetMailTransmitDate関数が取得No.05877
HarukA さん 08/06/20 00:24
 
すみません、補足です。

>while文のループ回数を「最近の分」のメール数だけ実行させたいので
ループの上限はGetFolderMailCount関数に"recent"を指定することによって取得でき
ますが、ループカウンタのカウントアップ条件を特定できない為に困っている次第で
す。

[ ]
RE:05877 SetMailTransmitDate関数が取得No.05878
秀まるお2 さん 08/06/20 15:54
 
 「最近の分」の対象になるかどうかをマクロで正確に求めるのは無理みたいで
す。というのは、基準となる時間が、秀丸メール起動時のある瞬間の時間になる
からです。

 秀丸メール起動時に設定関係をレジストリから読み込む処理があって、そのタ
イミングで基準となる境界時間を計算します。その時間は、その瞬間の時刻から
適当な日数分を差し引くって計算になります。

 なので、「最近の分」かどうか正確に判定するには、実際にメール一覧を「最
近の分」に切り替えてみて、それでメール数を"MailCount"関数で数えてもらう
しか無いです。

[ ]
RE:05878 SetMailTransmitDate関数が取得No.05879
HarukA さん 08/06/21 10:56
 
ご回答有難うございます。
HarukAです。

「最近の分」の境界時間は秀丸起動時の時刻に依存して決まり、且つその起動時刻を
マクロから参照することが出来ないから、境界時間の算出ロジックが分かったとして
もマクロで算出することは無理と理解しました。

「最近の分」が30日に設定された秀丸メールを1年間立ち上げっぱなしにしておくと、
「最近の分」のカウント対象メールは過去1年間と30日の間に送受信したメールになる
ということですね。。

分かりました。
別の方法を模索してみることにします。
どうも有難うございました。

[ ]