フォルダごとの削除方法のデフォルト設定No.28850
nishi さん 06/10/10 10:58
 
秀丸メールを便利に使わせてもらっております.ありがとうございます.

削除の仕方について,教えていただきたいことがあります.

迷惑メールフィルターに引っかかったものや,ダイレクトメールなどは特定のフォル
ダに振り分け,削除するときには,受信ログ/送信ログも含めて完全に削除するとい
う方法で削除しています.
このときの手順は,Shift押しながら削除(×アイコン)をクリックし,該当する削
除方法をチェックして,はいボタンをクリック,としています.

この手順を省略する方法がないか,ヘルプなどを探してみたのですが,
よくわかりませんでした.

やりたいことは,フォルダ毎に削除方法を指定し,迷惑メールフォルダやダイレクト
メールフォルダなどは,上記のような手順を踏まずに,ワンクリックで,受信ログ/
送信ログも含めて完全に削除するようにしたいと考えています.

方法はあるでしょうか?

[ ]
RE:28850 フォルダごとの削除方法のデフォNo.28851
秀まるお2 さん 06/10/10 11:18
 
 マクロを使えば実現出来ます。

 受信ログも含めて削除するには、tkinfo.dllのDelete関数の第2パラメータに
数値の2を指定すればいいです。なので、例えばですが、

   loaddll "tkinfo.dll";
   $account = dllfuncstr("CurrentAccount");
   $folder = dllfuncstr("CurrentFolder");
   #n = dllfunc("SelectFolder", "目的アカウント", "目的フォルダ");
   if( dllfunc("MailCount") != 0 ) {
       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   #n = dllfunc("SelectFolder", $account, $folder);

 みたいなマクロを作ってやればいいです。

 Delete関数の第2パラメータに数値の2を指定すると、確認メッセージも出ず
にメールを完全に削除してしまいます。間違って大事なメールを削除しても復旧
の手段は存在しないので、必ずquestion文で確認してから実行するような作りに
することをお勧めします。

 (マクロの作成ミスや何らかの偶発的なトラブルでメールが消えてしまうと危
険ですので)

[ ]
RE:28851 フォルダごとの削除方法のデフォNo.28853
nishi さん 06/10/10 12:43
 
ありがとうございます.
早速試してみようと思います.

[ ]
RE:28851 フォルダごとの削除方法のデフォNo.28854
nishi さん 06/10/10 13:58
 
マクロのヘルプを見ましたが,よくわからなかったので,上記マクロについてちょっ
と教えてください.

目的とするフォルダが,複数ある場合は,

>   #n = dllfunc("SelectFolder", "目的アカウント", "目的フォルダ");
>   if( dllfunc("MailCount") != 0 ) {
>       #n = dllfunc("SelectAllMail");
>       question
>           "現在選択しているメールを完全に削除してもいいですか?";
>       if( result == yes ) {
>           #n = dllfunc("Delete", 2);
>       }
>   }

の部分をフォルダの数だけ列記するということになりますか?
それとも,”目的フォルダ”のところで,複数の指定が可能でしょうか?
複数指定する方法があるかかどうか,ヘルプを見ましたが,よくわかりませんでし
た..

[ ]
RE:28851 フォルダごとの削除方法のデフォNo.28855
nishi さん 06/10/10 14:02
 
たびたびすみません.
上記マクロを,「メールを削除」実行時に,自動的に動作させるには,どのようにし
たら良いのでしょうか?

[ ]
RE:28854 フォルダごとの削除方法のデフォNo.28856
秀まるお2 さん 06/10/10 14:24
 
 複数のフォルダにまたがったメールを一発で削除することは出来ません。なの
で、マクロでやるとしたら、「フォルダを選択してメール削除」って処理を、処
理したい対象のフォルダの分だけ繰り返す、というか、同じような削除処理をい
っぱい書けばいいと思います。

   #n = dllfunc("SelectFolder", "目的アカウント1", "目的フォルダ1");
   if( dllfunc("MailCount") != 0 ) {
       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   #n = dllfunc("SelectFolder", "目的アカウント2", "目的フォルダ2");
   if( dllfunc("MailCount") != 0 ) {
       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   ・・・・

 ってな具合です。

[ ]
RE:28855 フォルダごとの削除方法のデフォNo.28857
秀まるお2 さん 06/10/10 14:26
 
 特定のコマンドを実行した時に、そのコマンドを実行しないで代わりにマクロ
を実行するってことも出来ません。

 例えばCtrl+Deleteキーでメールを削除していたのなら、そのCtrl+Deleteの
キー割り当てを変更して、そのキーに対してマクロを実行してやればいいんじゃ
ないかと思います。

[ ]
RE:28857 フォルダごとの削除方法のデフォNo.28858
nishi さん 06/10/10 16:44
 
サポートありがとうございます.
ツールバーに,マクロのボタンを表示させました.

ひとつ,修正をしたいのですが,
教えていただいたマクロと,複数のフォルダを順に記述する修正とをしましたが,幾
つか希望と異なる動作でした.

まず,フォルダ内のメールが全て選択されました.

希望は,選択したフォルダのメールを一気に完全削除するというより,
特定のフォルダでは,選択したメールを削除するときに,一つ一つ,完全削除できれ
ばよいと考えています.

私が「ワンクリックで」と書いたことが誤解の元だったかもしれません.すみません.
特定のフォルダでは,一つ一つのメールを「ワンクリック」で完全削除出来ればうれ
しい,という意味で書きました.

なので,
#n = dllfunc("SelectAllMail");
をコメントアウトしてみました.

すると次に,記述したフォルダの数だけ,連続して削除の処理が実行されるました.
分岐ではなく,シーケンス処理として記述したので当たり前だったのですが...

希望は,削除のマクロを事項するたび,「特定のフォルダであれば」「選択したメー
ルを」完全削除する,という動作です.

どのように修正したらよいでしょうか?


[ ]
RE:28858 フォルダごとの削除方法のデフォNo.28859
nishi さん 06/10/10 16:50
 
追記です.
上記で述べた修正後のマクロは以下です.

   loaddll "tkinfo.dll";
   $account = dllfuncstr("CurrentAccount");
   $folder = dllfuncstr("CurrentFolder");
   #n = dllfunc("SelectFolder", "", "フォルダ1");
   if( dllfunc("MailCount") != 0 ) {
//       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   #n = dllfunc("SelectFolder", "", "フォルダ2");
   if( dllfunc("MailCount") != 0 ) {
//       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   #n = dllfunc("SelectFolder", "", "フォルダ3");
   if( dllfunc("MailCount") != 0 ) {
//       #n = dllfunc("SelectAllMail");
       question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }
   #n = dllfunc("SelectFolder", $account, $folder);

この場合,特に,指定したフォルダでなくても,マクロを実行すると,そのフォルダ
で選択したメールが完全削除が実行されますね..

[ ]
RE:28859 フォルダごとの削除方法のデフォNo.28860
秀まるお2 さん 06/10/10 17:13
 
 どういう風にしたいのかがまだよく分かってませんが、基本的にこんな感じに
すればいいかなぁと思うのは…

   if( $folder == "フォルダ1" ) {
       #n = dlllfunc("Delete", 2);
   } else if( $folder == "フォルダ2" ) {
       #n = dllfunc("SelectAllMail");
       #n = dllfunc("Delete", 2);
   } else if( $folder == ... ) {
       ...
       ...
   } else {
       #n = dllfunc("Delete", 0);
   }

 ってな風に、現在選択してるフォルダに応じて処理を好きなように切り替えた
らいいんじゃないかと思いますけど…。

[ ]
RE:28860 フォルダごとの削除方法のデフォNo.28862
nishi さん 06/10/10 17:32
 
ありがとうございます.

   loaddll "tkinfo.dll";
   $account = dllfuncstr("CurrentAccount");
   $folder = dllfuncstr("CurrentFolder");
   
   if($folder == "User\folder1"){
    question
           "現在選択しているメールを完全に削除してもいいですか?";
       if( result == yes ) {
           #n = dllfunc("Delete", 2);
       }
   }else if($folder == "User\folder2"){
       #n = dllfunc("Delete", 2);
   }else if($folder == "User\folder3"){
       #n = dllfunc("Delete", 2);
   }else{
       #n = dllfunc("Delete", 0);
   }
   #n = dllfunc("SelectFolder", $account, $folder);

のようにしましたが,folder1,2,3のメールを選択したときも,引数0でDeleteが実行
されてしまいます.現在のフォルダの認識で失敗したようなのですが,どこでミスっ
ているでしょうか?

[ ]
RE:28862 フォルダごとの削除方法のデフォNo.28863
K'zawa さん 06/10/10 20:01
 
K'zawa/ユーザーです。
横から失礼します。

>   if($folder == "User\folder1"){
のところは、
   if($folder == "User\\folder1"){
のように書いてください。

で、それとは別に、ちょっとこんなマクロを作ってみました。
試してみてください(自己責任で)。

2つのマクロを同じ場所に置く。
まず特定のフォルダでA.macを実行してそのフォルダを登録。
あとはdelキーを押す代わりにB.macを実行する。
特定のフォルダではログも削除します。
特定のフォルダ以外ではdelキーと同じことをします。
とは言うものの、削除の部分はコメントアウトしていますので
とりあえずお知らせメッセージが出るだけです。

なお、マクロと同じ場所に、
マクロ1行目に書かれたファイルを勝手に作ります。
いらなくなったらそれも捨ててください。

--- A.mac:ここから --------------------------------------
    $inifile=currentmacrodirectory+"\\TestList.txt";

    loaddll "tkinfo.dll";
    if(!result){beep;endmacro;}
    if(!dllfunc("IsHidemaruMailMain")) goto ExitMacro;

    menu "リスト登録・削除","リストファイル";
    if(result==0) goto ExitMacro;
    else if(result==1) call Touroku;
    else message $inifile;

ExitMacro:
    freedll;
    endmacro;

Touroku:
    $Account=dllfuncstr("CurrentAccount");
    $folder=dllfuncstr("CurrentFolder");

    #n=getininum($inifile,$Account,$folder);
    if(#n){
        question "このフォルダはログごと削除リストに登録されています。\n"
            +"削除しますか?";
        if(result) writeinistr $inifile,$Account,$folder,0;
    }else{
        question "このフォルダをログごと削除リストに登録しますか?";
        if(result) writeininum $inifile,$Account,$folder,1;
    }
    return;
--- A.mac:ここまで --------------------------------------





--- B.mac:ここから ------------------------------
    $inifile=currentmacrodirectory+"\\TestList.txt";

    loaddll "tkinfo.dll";
    if(!result){beep;endmacro;}
    if(!dllfunc("IsHidemaruMailMain")) goto ExitMacro;

    openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
    #Confirm=getregnum("Confirm");
    closereg;
    if(!(#Confirm & 0x100)) #delmode=1;
    else goto DeleteMail;

    $Account=dllfuncstr("CurrentAccount");
    $folder=dllfuncstr("CurrentFolder");
    #dellog=getininum($inifile,$Account,$folder);

DeleteMail:
    #SMCnt=dllfunc("SelectedMailCount");
    if(#SMCnt){
        if(#dellog){
            question str(#SMCnt)
            +"通のメールを完全に削除してもいいですか?";
            if(result) #delmode=2;
            else goto ExitMacro;
        }
// -----↓テスト用-------------------------
        $s=str(dllfunc("SelectedMailCount"))+"通のメールを";
        if(#delmode==0)      $s=$s+"通常の確認付き削除";
        else if(#delmode==1) $s=$s+"通常の確認なし削除";
        else if(#delmode==2) $s=$s+"確認してログごと削除";
        message $s;
        message "とゆうのは嘘";
// -----↑テスト用-------------------------
// -----↓本番-----------------------------
//        #n=dllfunc("Delete",#delmode);
// -----↑本番-----------------------------
    }

ExitMacro:
    freedll;
--- B.mac:ここまで ------------------------------

[ ]
RE:28862 フォルダごとの削除方法のデフォNo.28867
秀まるお2 さん 06/10/11 09:26
 
 "User\XXX"の所を"User\\XXX"のようにすれば直ると思いますが、一般的に、
マクロの動作が期待通りでない時は、マクロの中にmessage文を入れまくって調
べるのがいいです。

 例えば、$folderの値が期待した値になってるかどうかは、

    $folder = dllfuncstr("CurrentFolder");

 の直後に

    message "$folder = " + $folder;

 とやればいいです。さらには、

    message $folder + "\n" + ""User\folder2";

 みたいにすれば、画面上で文字列が一致してるかどうか確認出来ると思います。

[ ]
RE:28863 フォルダごとの削除方法のデフォNo.28868
nishi さん 06/10/11 09:37
 
>>   if($folder == "User\folder1"){
>のところは、
>   if($folder == "User\\folder1"){
>のように書いてください。

ありがとうございます.
早速試してみたところ,うまくいきました.
ありがとうございます.

>で、それとは別に、ちょっとこんなマクロを作ってみました。
>試してみてください(自己責任で)。

ありがとうございます.
こちらも試してみようと思います.

[ ]
RE:28867 フォルダごとの削除方法のデフォNo.28869
nishi さん 06/10/11 09:38
 
> "User\XXX"の所を"User\\XXX"のようにすれば直ると思いますが、一般的に、
>マクロの動作が期待通りでない時は、マクロの中にmessage文を入れまくって調
>べるのがいいです。

ありがとうございました."User\\XXX"のように記述してうまくいきました.お手数
をおかけしました.

[ ]
RE:28863 フォルダごとの削除方法のデフォNo.28894
K'zawa さん 06/10/14 10:06
 
いまさらですが、私のマクロで間違いが見つかりました。
頭の中で"削除"のくくりに"ゴミ箱に捨てる"が入り込んで
おかしなことをしていました。
やろうとしたことは、
・任意のフォルダでDeleteのパラメータを登録しておき、
 それにしたがって削除する。
・登録してないフォルダではゴミ箱に捨てる。
・ただし、ゴミ箱&*信ログフォルダでは
 秀丸メール標準の削除動作とする。
とゆうものでした。
なので、先のマクロは使用しないでください。

マクロは直しましたが、長くなるので省略します。
(必要な方がいれば出しますが)

[ ]