返信済フラグを付けるマクロNo.13268
しんめ さん 25/02/03 20:18
 
初心者なものですからマクロを作成する力がありませんので、ご教授をお願いします。
外出中はスマホのメーラーで受信したメールに返信をしていまして、帰宅後、秀丸
メールで受信しなおしますが、その時に返信済のメールに返信済のフラグが付いてい
ませんので、マクロで返信済のフラグを付けたいのです。
メールサーバーはIMAPで運用しています。
よろしくお願いいたします。

[ ]
RE:13268 返信済フラグを付けるマクロNo.13271
秀まるお2 さん 25/02/04 08:54
 
「返信済み」のフラグをON/OFF切り替えするマクロは以下のようになります。

    loaddll "tkinfo.dll";
    #reply = dllfunc("GetMailFlag", "reply");
    if( #reply == 0 ) {
        //OFFならONにする
        #n = dllfunc("SetMailFlag", "reply", 1);
    } else {
        //ONならOFFにする
        #n = dllfunc("SetMailFlag", "reply", 0);
    }

単純にONするだけなら、

    loaddll "tkinfo.dll";
    #n = dllfunc("SetMailFlag", "reply", 1);

の2行だけでもいいです。

返信済みをONにしてさらに既読にするなら

    loaddll "tkinfo.dll";
    #n = dllfunc("SetMailFlag", "reply", 1);
    #n = dllfunc("SetMailFlag", "unread", 0);

みたいなマクロになります。

[ ]
RE:13271 返信済フラグを付けるマクロNo.13274
しんめ さん 25/02/05 09:29
 
私の言葉が足りなくて申し訳ありません。
出先で返信したメールと返信していないメールがあり、帰宅後に一個一個のメールを
確認してフラグを付けるのが大変なので、秀丸メールでsentフォルダーにあるメール
の元の受信メールに一括で返信済みフラグを付けるマクロがあると助かるのですが。
よろしくお願いいたします。

[ ]
RE:13274 返信済フラグを付けるマクロNo.13275
秀まるお2 さん 25/02/05 12:33
 
マクロを作るのは可能だとは思うんですが、かなり面倒な処理を作らないといけなさ
そうな気がします。

1つ不明な点があります。「sentフォルダ」があるとのことですが、これは秀丸メー
ルにある「送信済み」フォルダじゃなくて、IMAPの同期によって作成されたフォルダ
でしょうか。例えばGmailの場合だと、アカウントの直下に

    [Gmail]
       + 送信済みメール

ってフォルダがあるんですが、そういうフォルダだったりしますでしょうか。だとし
たら、もっと具体的なフォルダ名を教えて欲しいです。Gmailだと上記のような名前
になりますが、Outlook.comだとアカウント直下に「Outbox」って名前になるようで
す。Yahoo!メールだとアカウント直下に「Sent」って名前のフォルダになります。

そこにあるメールを1通ずつ調べて、それの返信元メールを探してフラグを書き換え
る、ということなら出来るかなぁとは思いますけども。

[ ]
RE:13275 返信済フラグを付けるマクロNo.13276
しんめ さん 25/02/05 13:40
 
>1つ不明な点があります。「sentフォルダ」があるとのことですが、これは秀丸
>メールにある「送信済み」フォルダじゃなくて、IMAPの同期によって作成されたフ
>ォルダでしょうか。

その通りです。@Niftyを使っていまして、アカウント直下に「Sent」フォルダです。

Gmailも使っていまして、アカウント直下に[Gmail] + 送信済みメールというフォル
ダです。

よろしくお願いいたします。


[ ]
RE:13276 返信済フラグを付けるマクロNo.13277
秀まるお2 さん 25/02/05 14:14
 
マクロ作ってみました。Sendフォルダを選択してから実行してもらうマクロにしまし
た。
(なのでフォルダ名が何かは聞かなくても大丈夫でした。失礼しました)

マクロの動作を説明させていただきますと・・・・選択したフォルダの中のメール全
部を対象にすると時間がとんでもなくかかると思うので、とりあえず「範囲」を「最
近の分」とした時に出てくるメールのみを対象にしました。それで出てくるメールの
一番下にあるメールから順番に処理するようにしました。その辺は要望があれば簡単
に直せます。

「最近の分」にした一番下のメールから順番に選択して、そのメールの返信元をMess
age-Id検索で探して、1通だけ見つかったら、そのメールが既に返信済みフラグONか
どうか見て、OFFならONにします。それを繰り返します。0通の場合は何もせず、2通
以上あったらマクロを中断します。


----------------------------------------------------------------------------
-----------------------
    loaddll "tkinfo.dll";
    if( dllfunc("IsThreadView") ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #viewarea = dllfunc("ViewArea");
    if( #viewarea != 1 ) {
        #n = dllfunc("SetViewArea", 1);     //最近の分のみ対象にする。
    }
    #i = dllfunc("MailCount") - 1;
    if( #i < 0 ) {
        //メールなし
    } else {
        #mailcount_notreply = 0;        //返信メールじゃないメール数
        #mailcount_reply = 0;           //返信メールのトータル数
        #mailcount_rootfound = 0;       //返信元が見つかったメール数
        #maiilcount_rootupdated = 0;    //返信元メールのフラグを書き換えた数

        while( #i >= 0 ) {
            #n = dllfunc("SetMailIndex", #i);
            call SetRootMailReply;
            #i = #i - 1;
        }
        if( #maiilcount_rootupdated != 0 ) {
            message str(#maiilcount_rootupdated) + " 通のメールを返信済みに
書き換えました。";
        } else if( #mailcount_rootfound != 0 ) {
            message str(#mailcount_rootfound) + " 通の返信元メールを見つけま
したが、すべて返信済みフラグがONになっていました。";
        }
    }
    if( #viewarea != 1 ) {
        #n = dllfunc("SetViewArea", #viewarea);     //範囲を元に戻す。
    }
    endmacro;

SetRootMailReply:
    $$id = dllfuncstr("CurrentHeader", "In-Reply-To");
    if( $$id == "" ) {
        $$id = dllfuncstr("CurrentHeader", "References");
    }
    if( $$id == "" ) {
        #mailcount_notreply = #mailcount_notreply + 1;      //返信メールじゃ
ない
        return;
    }
    #mailcount_reply = #mailcount_reply + 1;        //返信メールを見つけた。
    if( leftstr( $$id, 1 ) == "<" ) {
        $$id = midstr( $$id, 1 );
        ##x = strstr( $$id, ">" );
        if( ##x > 0 ) {
            $$id = leftstr( $$id, ##x );
        }
    }
    $$id = dllfuncstr("YenEncode", $$id);
    #n = dllfunc("AutoRestoreFindPack");
    #n = dllfunc("SetFindPack", "(\"" + $$id + "\",target=person),flag=!send,
subfolder=1,inmail=2,messageidtarget=messageid");
    #n = dllfunc("DoGrep", "\\CurrentAccount","受信+送信済み+ユーザー");
    #n = dllfunc("SetGrepWndTop");
    ##count = dllfunc("MailCount");
    if( ##count == 1 ) {
        #mailcount_rootfound = #mailcount_rootfound + 1;
        if( dllfunc("GetMailFlag", "reply") == 0 ) {
            #n = dllfunc("SetMailFlag", "reply", 1);
            #maiilcount_rootupdated = #maiilcount_rootupdated + 1;
        }
    } else if( ##count > 1 ) {
        #mailcount_rootfound = #mailcount_rootfound + 1;
        question "返信元メールが複数見つかりました。処理を中断しますか?";
        if( result == yes ) {
            endmacro;
        }
    } else {
        //message "返信元メールは見つかりませんでした。";
    }
    #n = dllfunc("SetMainWndTop");
    #n = dllfunc("CloseGrepWnd");
    return;


[ ]
RE:13277 返信済フラグを付けるマクロNo.13280
しんめ さん 25/02/06 09:03
 
ありがとうございました。
「範囲」ですが、「最近の分」ではなく、「Sent]フォルダで自分が選択したメール
以降の分を処理してくれるようになれば良いと思いました。

よろしくお願いいたします。


[ ]
RE:13280 返信済フラグを付けるマクロNo.13281
秀まるお2 さん 25/02/06 09:53
 
現在選択してるメールから新しいメールの方向にスキャンしていくようにしてみまし
た。

------------------------------------------------------------------------------
    loaddll "tkinfo.dll";
    #mailcount = dllfunc("MailCount");
    if( #mailcount == 0 ) {
        message "Sentフォルダの何かのメールを選択してから実行してください。";
        endmacro;
    }
    if( dllfunc("IsThreadView") ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #sortmethod = dllfunc("SortMethod");
    if( #sortmethod <= 11
     || (#sortmethod >= 140 && #sortmethod <= 144) ) {
        //古いのが一番上で新しいのが一番下
        #downloop = 1;
    }
    #i = dllfunc("MailIndex");
    #i_start = #i;
    #mailcount_notreply = 0;        //返信メールじゃないメール数
    #mailcount_reply = 0;           //返信メールのトータル数
    #mailcount_rootfound = 0;       //返信元が見つかったメール数
    #maiilcount_rootupdated = 0;    //返信元メールのフラグを書き換えた数

    while(1) {
        #n = dllfunc("SetMailIndex", #i);
        call SetRootMailReply;
        if( #downloop ) {
            #i = #i + 1;
            if( #i >= #mailcount ) {
                break;
            }
        } else {
            #i = #i - 1;
            if( #i < 0 ) {
                break;
            }
        }
    }
    #n = dllfunc("SetMailIndex", #i_start);
    if( #maiilcount_rootupdated != 0 ) {
        message str(#maiilcount_rootupdated) + " 通のメールを返信済みに書き
換えました。";
    } else if( #mailcount_rootfound != 0 ) {
        message str(#mailcount_rootfound) + " 通の返信元メールを見つけました
が、すべて返信済みフラグがONになっていました。";
    }
    endmacro;

SetRootMailReply:
    $$id = dllfuncstr("CurrentHeader", "In-Reply-To");
    if( $$id == "" ) {
        $$id = dllfuncstr("CurrentHeader", "References");
    }
    if( $$id == "" ) {
        #mailcount_notreply = #mailcount_notreply + 1;      //返信メールじゃ
ない
        return;
    }
    #mailcount_reply = #mailcount_reply + 1;        //返信メールを見つけた。
    if( leftstr( $$id, 1 ) == "<" ) {
        $$id = midstr( $$id, 1 );
        ##x = strstr( $$id, ">" );
        if( ##x > 0 ) {
            $$id = leftstr( $$id, ##x );
        }
    }
    $$id = dllfuncstr("YenEncode", $$id);
    #n = dllfunc("AutoRestoreFindPack");
    #n = dllfunc("SetFindPack", "(\"" + $$id + "\",target=person),flag=!send,
subfolder=1,inmail=2,messageidtarget=messageid");
    #n = dllfunc("DoGrep", "\\CurrentAccount","受信+送信済み+ユーザー");
    #n = dllfunc("SetGrepWndTop");
    ##count = dllfunc("MailCount");
    if( ##count == 1 ) {
        #mailcount_rootfound = #mailcount_rootfound + 1;
        if( dllfunc("GetMailFlag", "reply") == 0 ) {
            #n = dllfunc("SetMailFlag", "reply", 1);
            #maiilcount_rootupdated = #maiilcount_rootupdated + 1;
        }
    } else if( ##count > 1 ) {
        #mailcount_rootfound = #mailcount_rootfound + 1;
        question "返信元メールが複数見つかりました。処理を中断しますか?";
        if( result == yes ) {
            endmacro;
        }
    } else {
        //message "返信元メールは見つかりませんでした。";
    }
    #n = dllfunc("SetMainWndTop");
    #n = dllfunc("CloseGrepWnd");
    return;


[ ]
RE:13281 返信済フラグを付けるマクロNo.13282
しんめ さん 25/02/06 11:17
 
メール件数が多いものですから、返信済みかどうか確認するのが大変でしたが本当に
助かりました。

ありがとうございました!

[ ]