スレッドを連結するマクロNo.40429
styth さん 11/05/06 18:41
 
 携帯メール(ドコモ)とメールのやりとりをすると、ドコモからのメールでス
レッドが切れてしまいます。
 Subject名を元に、スレッドを連結するマクロを作成したいのですが、方法が
皆目見当が付きません。
 何か、手掛かりを教えて下さい。(欲を言えば、サンプルマクロを提示して頂
けるとうれしいです。)
 よろしくお願いします。

[ ]
RE:40429 スレッドを連結するマクロNo.40430
Iranoan さん 11/05/06 21:49
 
 styth さん今日は、一ユーザの Iranoan です。
>  Subject名を元に、スレッドを連結するマクロを作成したいのですが、方法が
> 皆目見当が付きません。
1.現在のメールの Subject を取得
2.1 で取得した文字列で検索
3.ヒットしたメールの Message-ID を取得
  複数ヒットした場合、最新のメールに絞り込むと良いかも
4.1 を実行したメールに In-Reply-To に 3 で取得した文字列を設定

[ ]
RE:40429 スレッドを連結するマクロNo.40432
秀まるお2 さん 11/05/06 22:12
 
 スレッドの連結は、スレッド表示のウィンドウ上でメールをドラッグ&ドロッ
プするやり方で実現出来ますが、それではダメでしょうか。

 例えばAとBのメールがあって、

 ---   A
   +--- B

 のようにスレッドをつなげたい場合は、BのメールをドラッグしてAのメールの
上にドロップすればいいです。

 それでどうでしょ?

 マクロでやるとしたら、BのメールのIn-Reply-To:ヘッダにAメールの
Message-Id:ヘッダ内容を書き込んでやる作戦になりますけども、AメールとB
メールの2つをどうやって指定してやるのか、ユーザーインタフェース的な所の
設計が難しいと思います。

[ ]
RE:40430 スレッドを連結するマクロNo.40434
styth さん 11/05/06 22:46
 
>1.現在のメールの Subject を取得
>2.1 で取得した文字列で検索
>3.ヒットしたメールの Message-ID を取得
>  複数ヒットした場合、最新のメールに絞り込むと良いかも
>4.1 を実行したメールに In-Reply-To に 3 で取得した文字列を設定
 この方法で、やってみます。
 また、何かわからないことがあったら、アドバイス御願い致します。

[ ]
RE:40432 スレッドを連結するマクロNo.40435
styth さん 11/05/06 22:49
 
> スレッドの連結は、スレッド表示のウィンドウ上でメールをドラッグ&ドロッ
>プするやり方で実現出来ますが、それではダメでしょうか。
 これは、今現在、やっていますが、目でSubjectを確認しながら連結するのに難儀
しております。

> マクロでやるとしたら、BのメールのIn-Reply-To:ヘッダにAメールの
>Message-Id:ヘッダ内容を書き込んでやる作戦になりますけども、AメールとB
>メールの2つをどうやって指定してやるのか、ユーザーインタフェース的な所の
>設計が難しいと思います。
 やってみます。何かあれば、助言して下さい。

[ ]
RE:40435 スレッドを連結するマクロNo.40436
K'zawa さん 11/05/07 05:57
 
stythさん、こんにちは。
K'zawa/ユーザーです。

ライブラリの登録マクロにあるものが参考になるかも知れません。

http://hide.maruo.co.jp/lib/tkmacro/tkjointhread.html
http://hide.maruo.co.jp/lib/tkmacro/threadconnection001.html


[ ]
RE:40430 スレッドを連結するマクロNo.40439
styth さん 11/05/08 14:07
 
>4. 1 を実行したメールに In-Reply-To に 3 で取得した文字列を設定
 1 を実行したメールに戻るには、マクロでどう書けば良いんでしょうか?
 よろしくお願いします。

[ ]
RE:40439 スレッドを連結するマクロNo.40440
Iranoan さん 11/05/08 14:18
 
 styth さん今日は、一ユーザの Iranoan です。
>  1 を実行したメールに戻るには、マクロでどう書けば良いんでしょうか?
 「戻る」に当たるコマンドを使ったり、Message-ID を記録しておいて検索す
るなどやり方はいろいろあるかと。

[ ]
RE:40440 スレッドを連結するマクロNo.40442
styth さん 11/05/08 20:57
 
> 「戻る」に当たるコマンドを使ったり、Message-ID を記録しておいて検索す
>るなどやり方はいろいろあるかと。
「戻る」に当たるコマンド、がわかりません。
 教えて頂けないでしょうか?
 後者のIDで検索はできました。

[ ]
RE:40442 スレッドを連結するマクロNo.40443
Iranoan さん 11/05/08 21:30
 
 styth さん今日は、一ユーザの Iranoan です。
> 「戻る」に当たるコマンド、がわかりません。
 そういえば、コマンドはありませんね。
 割り当てられているショートカット・キーで代用するしかないですね。更に、
マクロからキーをエミュレートする場合、メール一覧枠を選んだ状況でないと、
無効なようなので、次のように 2 段階で行えばよいようです。
//------------------------------------------------------------
#n = dllfunc( "SelectPane", 1);
#tmp = dllfunc( "SimulateKeyStroke", 0x25, 0, 0, 1 );

[ ]
RE:40432 スレッドを連結するマクロNo.40444
styth さん 11/05/08 23:45
 
> マクロでやるとしたら、BのメールのIn-Reply-To:ヘッダにAメールの
>Message-Id:ヘッダ内容を書き込んでやる作戦になりますけども、AメールとB
>メールの2つをどうやって指定してやるのか、ユーザーインタフェース的な所の
>設計が難しいと思います。
 スレッド表示でマクロ実行後、メールの一覧表示→再度、スレッド表示としな
いと、スレッドが連結されているのが確認できません。
 マクロの最後に、上記の手順を書かないと駄目なんでしょうか?
 IEの更新みたいに、画面を更新(リフレッシュ?)する方法はないんでしょう
か?
 よろしくお願いします。

[ ]
RE:40443 スレッドを連結するマクロNo.40445
styth さん 11/05/08 23:45
 
>#n = dllfunc( "SelectPane", 1);
>#tmp = dllfunc( "SimulateKeyStroke", 0x25, 0, 0, 1 );
 わかりました。ありがとうございます。

[ ]
RE:40444 スレッドを連結するマクロNo.40451
styth さん 11/05/09 18:51
 
> IEの更新みたいに、画面を更新(リフレッシュ?)する方法はないんでしょう
>か?
 #n = dllfunc("RefreshMailList");

 これを実行したら、うまくできました。
 お願いなんですが、RefreshMailListのヘルプに、「スレッド表示」でも更新
される旨のことを書いて頂きたいのですが、よろしくお願いします。

[ ]
RE:40451 スレッドを連結するマクロNo.40458
秀まるお2 さん 11/05/10 09:57
 
 ヘルプには「メール一覧の作成し直し」を実行するということが書いてあるの
ですけども、それはそれで、特にスレッド表示だと効かないような意味のことは
書いてないし、ヘルプ上は問題ないと思います。

 「メール一覧の作成し直し」というコマンドの意味が、「一覧表示の時は作成
しなおすけどもスレッド表示の時は何もしない」という風に解釈されるかもしれ
ないとしたら、それはたしかにそういう気がするので、その辺は修正させていた
だきます。

 秀丸メールのコマンド1つ1つは、すべて、実はsendmessage文を使って実行
可能でして、そのコマンドのコードは僕の方でお返事することは出来ます。ちょ
っと古いですけども、コマンドコードの一覧がアップロードしてあります。

http://www.maruo.co.jp/software/bin/HmmMenuResource.txt

 もしよかったらそちらも参照ください。

[ ]
RE:40458 スレッドを連結するマクロNo.40461
styth さん 11/05/10 18:08
 
> 「メール一覧の作成し直し」というコマンドの意味が、「一覧表示の時は作成
>しなおすけどもスレッド表示の時は何もしない」という風に解釈されるかもしれ
>ないとしたら、それはたしかにそういう気がするので、その辺は修正させていた
>だきます。
 よろしくお願いします。

> 秀丸メールのコマンド1つ1つは、すべて、実はsendmessage文を使って実行
>可能でして、そのコマンドのコードは僕の方でお返事することは出来ます。ちょ
>っと古いですけども、コマンドコードの一覧がアップロードしてあります。
>http://www.maruo.co.jp/software/bin/HmmMenuResource.txt
> もしよかったらそちらも参照ください。
 例えば、
 MENUITEM "履歴戻り(&B)",                IDM_HISTORY_BACK
 というのが、ありますが、これなら、どう書けば良いんでしょうか?
 #n = sendmessage( hidemaruhandle(0), 0x0111, 40008, 0);
 というサンプルが載っていますが、40008の部分を変えるということでしょう
か?
 数値ではなく、IDM_HISTORY_BACKを使って、コードを記述できると便利なので
すが、よろしくお願いします。

[ ]
RE:40461 スレッドを連結するマクロNo.40462
秀まるお2 さん 11/05/10 18:31
 
 HmmMenuResource.txtの内容は非常にマニアックなのでここで簡単に説明させ
ていただきますと…

 まず、MENUITEMとか書いてある所は、いわゆるWindowsでのリソースファイル
の記述そのまんまでして、だいた見た感じでどのメニューにどのコマンドが割り
当てられてるかが感じ取っていただけるかなぁという所です。

 で、その実際のコマンドの値(数値)は、

#define IDM_HISTORY_BACK                40206

 のようになってる所の数値を見ていただく形になります。

 例えば「履歴戻り」コマンドを実行させるなら、

 #n = sendmessage( hidemaruhandle(0), 0x111, 40206, 0 );

 ってな具合になります。

 ちなみに0x111というのはWM_COMMANDってメッセージになります。

 こういうやり方でほとんどのコマンドは実行可能だとは思いますが、一部うま
く実行出来ないコマンドもある可能性はあります。その辺は実際にsendmessage
して確認していただかないといけなかったりします。

>  数値ではなく、IDM_HISTORY_BACKを使って、コードを記述できると便利なので
> すが、よろしくお願いします。

 しいてやるとしたら、例えば

    #IDM_HISTORY_BACK = 40206;

 みたいな文をマクロの先頭に入れておくとかすれば、

 #n = sendmessage( hidemaruhandle(0), 0x111, #IDM_HISTORY_BACK, 0 );

 のように書くことが出来るようにはなります。

 そういうやり方でやっていただくしか無いです。

[ ]
RE:40462 スレッドを連結するマクロNo.40464
styth さん 11/05/10 18:50
 
>#define IDM_HISTORY_BACK                40206
> のようになってる所の数値を見ていただく形になります。
 後ろの方に書いてあったんですね。

> 例えば「履歴戻り」コマンドを実行させるなら、
> #n = sendmessage( hidemaruhandle(0), 0x111, 40206, 0 );
> ってな具合になります。
 よくわかりました。ありがとうございます。

[ ]
RE:40443 スレッドを連結するマクロNo.40471
styth さん 11/05/10 22:04
 
>> 「戻る」に当たるコマンド、がわかりません。
> そういえば、コマンドはありませんね。
> 割り当てられているショートカット・キーで代用するしかないですね。更に、
>マクロからキーをエミュレートする場合、メール一覧枠を選んだ状況でないと、
>無効なようなので、次のように 2 段階で行えばよいようです。
>//------------------------------------------------------------
>#n = dllfunc( "SelectPane", 1);
>#tmp = dllfunc( "SimulateKeyStroke", 0x25, 0, 0, 1 );
 実際に使ってみました。
 これは、「履歴戻り」に当たるコマンドということだと、思うのですが、
 #n = sendmessage( hidemaruhandle(0), 0x111, 40206, 0 );// 「履歴戻り」
 とは、違う動きをします。
 何か勘違いをしているんでしょうか?

[ ]
RE:40471 スレッドを連結するマクロNo.40477
秀まるお2 さん 11/05/10 22:50
 
 こちらで超簡単に、例えば

#n = sendmessage( hidemaruhandle(0), 0x111, 40206, 0 );// 「履歴戻り」

 ってだけのマクロを実行すると、たしかに「履歴戻り」を実行したのとまった
く同じ動作になります。

 sendmessageする前に例えば何かメールを選択するような処理とか改変するよ
うな処理とか、あるいはメール一覧の作成し直しとか、何かアクションがあるの
だとしたら、それによって「履歴戻り」コマンドの動作が変わったりうまく動か
なかったりということはありえると思いますけども…

 例えばマクロのそのsendmessageしてる処理の所を、

    message "履歴戻りコマンドを今から実行してください";
    endmacro;

 のようにしてみて、それでマクロを終了させた状態で「履歴戻り」を手で実行
してみて、それで期待通りになるかどうか確認してみるとかって作戦はどうでし
ょ?

[ ]
RE:40477 スレッドを連結するマクロNo.40481
styth さん 11/05/10 23:11
 
 具体的には、別のスレッドで掲げたんですが、

    loaddll "TKinfo.dll";
    //1.
    $Subject = dllfuncstr("CurrentHeader", "Subject");
    $MessageID0 = dllfuncstr("CurrentHeader", "Message-ID:");
    //2.
    $Subject =  midstr($Subject, strrstr($Subject, ":")+1);//末尾から検索し
てRe:以降を取得
    $Subject = dllfuncstr("YenEncode", $Subject);
    #n = dllfunc("SetFindPack", "(\""+$Subject+"\",target=subject), hilight=
0");//検索文字列を強調ON=1
    if ( ! dllfunc("FindUp") ) message "Subjectが見つかりません。";
    //3.
    $MessageID = dllfuncstr("CurrentHeader", "Message-ID:");

    //4.前半
    $MessageID0 = dllfuncstr("YenEncode", $MessageID0);
    #n = dllfunc("SetFindPack", "(\""+$MessageID0+"\", target=header), messa
geidtarget=messageid");
    #n = dllfunc("FindDown");
endmacro;

 //4.前半、以下のマクロを履歴戻りで代用させようとしています。
 //3.直前のFindUpでヒットしたメールは、履歴には載ってこないんでしょう
か?
 メールの履歴を消去して、上記マクロを実行しても、3.直前のFindUpでヒット
したメールは、履歴にはありませんでした。
 よろしくお願いします。

[ ]
RE:40481 スレッドを連結するマクロNo.40488
秀まるお2 さん 11/05/11 11:32
 
 これまたヘルプにもどこにも書いてないと思いますが、マクロを実行している
最中に選択したメールは履歴には記録されない仕組みになってまして、結果とし
て「履歴戻り」を使って以前選択してたメールに戻る作戦は使えないです。

 僕の方でマクロを書き換えてみたのでそれでどうでしょうか。こちらでテスト
した限りはうまく動きました。


    loaddll "TKinfo.dll";
    #threadview = dllfunc("IsThreadView");
    if( #threadview ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #index = dllfunc("MailIndex");
    if( #index < 0 ) {
        message "MailIndexがエラーでした。";
        endmacro;
    }
    //1.
    $Subject = dllfuncstr("CurrentHeader", "Subject");
    $MessageID0 = dllfuncstr("CurrentHeader", "Message-ID:");
    //2.
    $Subject =  midstr($Subject, strrstr($Subject, ":")+1);
    while( leftstr( $Subject, 1 ) == " " ) {
        $Subject = midstr( $Subject, 1 );
    }
    $Subject = dllfuncstr("YenEncode", $Subject);
    $pack = "(\""+$Subject+"\",target=subject), hilight=0, inmail=0";
    #n = dllfunc("SetFindPack", $pack);//検索文字列を強調ON=1
    if ( ! dllfunc("FindUp") ) message "Subjectが見つかりません。";
    //3.
    $MessageID = dllfuncstr("CurrentHeader", "Message-ID:");
    #n = dllfunc("SetMailIndex", #index );
    #n = dllfunc("BeginEditMail");
    #n = dllfunc("SetHeader", "In-Reply-To", $MessageID );
    #n = dllfunc("DeleteHeader", "References" );
    #n = dllfunc("SaveEditMail", 0, 0 );
    if( #threadview ) {
        #n = dllfunc("SetThreadView", 1);
    }
endmacro;

[ ]
RE:40488 スレッドを連結するマクロNo.40492
Iranoan さん 11/05/11 16:37
 
 今日は、Iranoan です。
> マクロを実行している
> 最中に選択したメールは履歴には記録されない仕組みになってまして
 そうだったんですね(^^;。
 適当なことを書いてすいません。→styth さん

[ ]
RE:40492 スレッドを連結するマクロNo.40493
styth さん 11/05/11 18:05
 
>> マクロを実行している
>> 最中に選択したメールは履歴には記録されない仕組みになってまして
> そうだったんですね(^^;。
> 適当なことを書いてすいません。→styth さん
 とんでも、ありません。

[ ]
RE:40458 スレッドを連結するマクロNo.40497
styth さん 11/05/11 22:33
 
> 「メール一覧の作成し直し」というコマンドの意味が、「一覧表示の時は作成
>しなおすけどもスレッド表示の時は何もしない」という風に解釈されるかもしれ
>ないとしたら、それはたしかにそういう気がするので、その辺は修正させていた
>だきます。
 ヘルプを見ていて、思ったんですが、ヘルプを修正される時に、もし、良けれ
ば、

 例として、#n = dllfunc( "RefreshMailList");
 が、掲載されていますが、パラメータ1を省略した時は、0なのか1なのか、わ
かりません。(多分、0だと思いますが。)
 ので、その辺も明記されることを要望します。
 よろしくお願いします。

[ ]
RE:40497 スレッドを連結するマクロNo.40504
秀まるお2 さん 11/05/12 17:33
 
 dllfunc関数でのパラメータを省略した場合は、ご想像の通り、0を指定したの
と同じ扱いになります。

 省略した場合はどうなるかの説明は、書いてる所もあるんですが、書いてない
所も多々あるようで…。そもそも数値の0を指定するとなってる所は省略するこ
とが可能であるんですが、省略可能ということが書いてない所が非常に多いよう
です。

 この辺全部「省略した場合は××」ってことを全部書くのは大変なので、とり
あえず目立った所だけ追加修正させていただきます。

[ ]
RE:40504 スレッドを連結するマクロNo.40505
styth さん 11/05/12 17:44
 
> dllfunc関数でのパラメータを省略した場合は、ご想像の通り、0を指定したの
>と同じ扱いになります。
 dllfunc関数でのパラメータを省略した場合は、0を指定したのと同じ扱いになりま
す。
 ということを、ヘルプに明記して頂ければ、良いのではないかと思います。

> この辺全部「省略した場合は××」ってことを全部書くのは大変なので、とり
>あえず目立った所だけ追加修正させていただきます。
 上記をして頂いた上で、よろしくお願いします。
 (厚かましいようで、すみません。)

[ ]
RE:40504 スレッドを連結するマクロNo.40506
秀まるお2 さん 11/05/12 17:46
 
 ついでに、「マクロ作成のヒント・パラメータの省略について」のヘルプペー
ジ追加をさせていただきます。

[ ]
RE:40488 スレッドを連結するマクロNo.40509
styth さん 11/05/12 21:44
 
 #n = dllfunc("DeleteHeader", "References" );
 この文はなくても、スレッドは繋がると思うのですが、ないとい
けないんでしょうか?

[ ]
RE:40509 スレッドを連結するマクロNo.40513
秀まるお2 さん 11/05/13 10:35
 
 In-Reply-To:ヘッダとReferences:ヘッダの両方があって、その内容が不一致
だと、スレッドが思ったようにつながらないことがありまして、念のため
References:ヘッダを削除するようにしてみました。

 元々スレッドがつながらないメールということはReferences:ヘッダは最初か
ら無いはずなので、しいてDeleteHeaderする必要も無い、ということでもいいと
思います。

[ ]