[ 新規に投稿する ]

マクロファイルの動きNo.00566
officenoji さん 20/12/09 15:01 [ コメントを投稿する ]
  添付ファイル圧縮-7zip-パスワード別便通知.mac を利用させていただいておりますが、本日急に7zipフォルダ内にzipファイルができず、添付することができません。特にマクロファイルを変更等はしておりません。7zipファイルは最新版に入れ替えなど行ったのですが改善しません。
とても使い勝手のよいマクロなので何とか解決したく思います。
よろしくお願いいたします。
[ ]
RE:00566 マクロファイルの動きNo.00567
秀まるお さん 20/12/09 16:13 [ コメントを投稿する ]
   今ちょっとこちらで簡単にテストした限りはうまく動いたようです。

 マクロを実行すると、

 1.「圧縮して作成するファイル名は?」の問い合わせが出る。
 2.乱数を生成するための問い合わせが何回か出る。
 3.その後、添付ファイルがzipファイルに置き換わりつつ、別便メールも
   作成される。

 の手順になりますが、「2」までは正常だけども「3」のタイミングでうまくいかないってことですよね。

 何かエラーメッセージが出てませんでしょうか。出るとしたら、

    7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗しています。
    ファイル名 = XXXXXXXXXXX

 みたいなのが出てるんじゃないかと思いますが、そういうのは出てませんでしょうか。

 あと他に確認するとしたら、圧縮用のフォルダがちゃんとあるかどうか確認してみる手はあります。圧縮用のフォルダは、ご自身の「ドキュメント」フォルダ配下に「ZipTemp」って名前で作成されます。そのフォルダがあるかどうか一回見てみて欲しいです。
[ ]
RE:00567 マクロファイルの動きNo.00568
officenoji さん 20/12/09 16:24 [ コメントを投稿する ]
  お世話になっております。
早速のご回答ありがとうございます。


>    7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗しています。
>    ファイル名 = XXXXXXXXXXX
>
> みたいなのが出てるんじゃないかと思いますが、そういうのは出てませんでしょう
>か。
上記の表示が出ます。
>
> あと他に確認するとしたら、圧縮用のフォルダがちゃんとあるかどうか確認してみ
>る手はあります。圧縮用のフォルダは、ご自身の「ドキュメント」フォルダ配下に
>「ZipTemp」って名前で作成されます。そのフォルダがあるかどうか一回見てみて欲し
>いです。
「ZipTemp」フォルダには何も入っていません。
昨日まで問題なく動いていたのに不思議です。
よろしくお願いいたします。
[ ]
RE:00568 マクロファイルの動きNo.00569
秀まるお さん 20/12/09 17:08 [ コメントを投稿する ]
   たぶん7Zipがうまく動いてないんだろうと思うので、以下のテストマクロを動かしてみて欲しいです。

 実行すると、新規メールが1つ出てきてそこにコマンドラインと7Zipからの応答が出てきて、「中断しますか?」の問い合わせが出てくると思います。それで中断して中身を教えていただければ、何か分かると思います。

----------------------------------------------------------------------------------------
// 添付ファイル圧縮-7zip-パスワード別便通知.mac by 斉藤秀夫
// 2019.02.24
// 7-zipのダウンロード先:  http://sevenzip.sourceforge.jp/
//
// 2019.03.08 Version 1.1 署名も付けるようにした。乱数発生用のメッセージ表示回数を少し減らした。
// 2020.12.09 テスト版

    //パスワード付きにする場合はここにパスワードを設定しておく。
    //パスワード無しにするなら""を代入する。
    //パスワードを毎回入力したい場合は $password = "*"としておく。
    //パスワードの中には空白は入れないでください。
    //受信したメールの添付ファイルを圧縮する場合についてはパスワードの指定は効きません。常にパスワード無しで圧縮されます。
    //
    // 例:
    //  $password = "";         ... パスワード無し
    //  $password = "pass";     ... パスワードを"pass"にする。
    //  $password = "*";        ... パスワードを毎回入力する。
    //  #passwordlength = 10;   ... パスワードを自動生成。長さ指定。
    #passwordlength = 6;

    loaddll "tkinfo.dll";
    $7zip = "C:\\Program files\\7-Zip\\7z.exe";
    if( ! existfile( $7zip ) ) {
        $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            message "7-Zipのプログラム用ファイルが見つかりません。7-Zipをインストールしてください。\n\n" +
                    "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program files (x86)\\7-Zip にインストールされてる必要があります。";
            endmacro;
        }
    }
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    $home = getregstr( "HomeDir" );
    closereg;
    $account = dllfuncstr("CurrentAccount");
    if( dllfunc("IsTuruKameMain") ) {
        message "このマクロは送信するメール専用です。";
        endmacro;
    }

    if( dllfunc("MailType") == 3 || readonly ) {
        message "受信したメールの添付ファイル・圧縮は、このマクロでは出来ません。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "To" ) == "" ) {
        message "宛先がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "Subject" ) == "" ) {
        message "件名がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    #cAttach = 0;
    while(1) {
        $aAttach[#cAttach] = dllfuncstr("CurrentHeader2", "X-Attach"
                                       , #cAttach );
        if( $aAttach[#cAttach] == "" ) break;
        #cAttach = #cAttach + 1;
    }
    if( #cAttach == 0 ) {
        message "添付ファイルは1つもありません。";
        endmacro;
    }
    if( #cAttach == 1 ) {
        if( rightstr( $aAttach[0], 4 ) == ".zip" ) {
            message "添付ファイルは既に圧縮されてます。";
            endmacro;
        }
        $dest = $aAttach[0] + ".zip";
    } else {
        $dest = $aAttach[0] + "など.zip";
    }
    while(1) {
        #n = strstr( $dest, "\\" );
        if( #n < 0 ) {
            break;
        }
        $dest = midstr( $dest, #n + 1, 256 );
    }
    $dest = input( "圧縮して作成するファイル名は?", $dest );
    if( $dest == "" ) {
        endmacro;
    }
    if( #passwordlength != 0 ) {
        #i = 0;
        $password = "";
        #rand_init = tickcount + #i + val(second) + val(minute);
        while( #i < #passwordlength ) {
            if( #i == 0 ) {
                #rand = #rand_init / (10 + 26 + 26) % (10 + 26 + 26);
            } else if( #i == 1 ) {
                #rand = #rand_init % (10 + 26 + 26);
            } else {
                message "乱数を生成する用に、何かキーを押してください。(あと" + str( #passwordlength - #i ) + "回)";
                refreshdatetime;
                #rand = (tickcount + #i + val(second) + val(minute)) % (10 + 26 + 26);
            }
            if( #rand < 10 ) {
                $rand = char( '0' + #rand );
            } else if( #rand < 10 + 26 ) {
                $rand = char( 'a' + #rand - 10 );
            } else {
                $rand = char( 'A' + #rand - 10 - 26 );
            }
            $password = $password + $rand;
            #i = #i + 1;
        }
    } else {
        if( $password == "*" ) {
            $password = input( "パスワードは?" );
            if( $password == "" ) {
                question "パスワード無しにしますか?";
                if( result != yes ) {
                    endmacro;
                }
            }
        }
    }

    //「ドキュメント」フォルダ配下に生成する?
    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\ZipTemp";
    runsync2 "cmd.exe /c rmdir /s /q \"" + $outfolder + "\"";       //古いファイルのゴミを削除
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    $destbase = $dest;
    $dest = $outfolder + "\\" + $dest;
    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
    #n = dllfunc("Bypass_DeleteFile", $dest);
    //添付ファイル圧縮-7zip.macで修正。
    //$cmd = "-j \"" + $dest + "\"";
    $cmd = "a \"" + $dest + "\"";
    #i = 0;
    while( #i < #cAttach ) {
        $cmd = $cmd + " \"" + $home + $account + "\\" + $aAttach[#i] + "\"";
        #i = #i + 1;
    }
    //添付ファイル圧縮-7zip.macで修正。
    //#n = dllfunc("Zip", hidemaruhandle(0), $cmd);

    if( $password != "" ) {
        $cmd = "-p" + $password + " " + $cmd;
    }
    $cmdline = "\"" + $7zip + "\" " + $cmd;

    //テスト
    //runsync2 $cmdline;
    #handle = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    gofiletop;
    beginsel;
    gofileend;
    delete;
    insert "コマンドラインは以下の1行です。\n" + $cmdline + "\n\n";
    runex $cmdline, 1, 0, "", 5, "", 5, "", 0;
    question "中断しますか?";
    if( result == yes ) {
        endmacro;
    }
    #handle2 = hidemaruhandle(0);
    setactivehidemaru #handle;
    closehidemaruforced #handle2;



    if( !result ) {
        message "7zipの実行に失敗しました。";
        endmacro;
    }
    if( ! existfile( $dest ) ) {
        message "7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗しています。\nファイル名 = " + $dest;
        endmacro;
    }
    #n = dllfunc("AddAttach", $dest);

    //テスト
    if( #n != 0 ) {
        message "AddAttachに失敗してます。";
        endmacro;
    }

    // ファイルの削除
    #n = dllfunc("Bypass_DeleteFile", $dest);
    #i = 0;
    while( #i < #cAttach ) {
        #n = dllfunc("UndoAttach", $aAttach[#i]);
        #i = #i + 1;
    }
    if( $password != "" ) {
        $to = dllfuncstr("CurrentHeader", "To");
        $toname = dllfuncstr("SetNameOnly", $to);
        if( $toname == "" ) {
            $toname = $to;
        }
        $subject = dllfuncstr("CurrentHeader", "Subject");
        $sign = dllfuncstr("CurrentSignName");
        #attachhidemaru = hidemaruhandle(0);
        #n = dllfunc("NewMail");
        #n = dllfunc("SwitchSign", "");         //署名無しに一回切り替え
        #n = dllfunc("SetHeader", "To", $to );
        #n = dllfunc("SetHeader", "Subject", "パスワードの通知 - " + $subject );
        gofiletop;
        beginsel;
        gofileend;
        delete;
        insert $toname + " 様\n\n暗号化したファイルを別メールで送信しましたので、\nパスワードをお知らせします。\n\n" +
                "件名 : " + $subject + "\n" +
                "\n" +
                "添付ファイル名: " + $destbase + "\n" +
                "解凍パスワード: " + $password + "\n" +
                "\n" +
                "よろしくお願いします。\n";
        if( leftstr($sign, 1) == "\\" ) {
            //切り替えできない
            $signContent = dllfuncstr("LoadTemplate", "sign", $sign);
            if( $signContent != "" ) {
                insert "\n" + $signContent;
            }
        } else {
            #n = dllfunc("SwitchSign", $sign);          //署名をここで切り替え
        }
        gofiletop;
        setactivehidemaru #attachhidemaru;
    }
    endmacro;

----------------------------------------------------------------------------------------

 僕の所でテストした結果はこんな風でした。中身にある7z.exeへのパス名が違ってたりとか、zipファイルのファイル名なり圧縮対象ファイルのファイル名なりが正しいかどうか確認してみると何か分かると思います。


----------------------------------------------------------------------------------------
コマンドラインは以下の1行です。
"C:\Program files\7-Zip\7z.exe" -p2nl9Hf a "C:\Users\hideo\Documents\ZipTemp\test.txt.zip" "e:\hidemailhome\斉藤秀夫メイン\送信添付\201209_06\test.txt"


7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 file, 6 bytes (1 KiB)

Creating archive: C:\Users\hideo\Documents\ZipTemp\test.txt.zip

Add new data to archive: 1 file, 6 bytes (1 KiB)


Files read from disk: 1
Archive size: 168 bytes (1 KiB)
Everything is Ok
[ ]
(管理者削除)No.00570
XXXXXXXX さん 20/12/09 17:32
 
[ ]
RE:00570 マクロファイルの動きNo.00571
秀まるお さん 20/12/09 17:49 [ コメントを投稿する ]
   パスワードの所が化けてるような気がします。なぜそうなるのやら?

 マクロの141行目付近にある

    if( $password != "" ) {
        $cmd = "-p" + $password + " " + $cmd;
    }

 の直前に、試しに

    $password = "pass";

 みたいなのを入れてパスワードを固定文字列にしてみたらどうでしょうか。それでうまく動くとしたら、パスワードの生成の処理がおかしいのかなぁと思いますけども・・・。
[ ]
RE:00571 マクロファイルの動きNo.00572
秀まるお さん 20/12/09 17:56 [ コメントを投稿する ]
   あと、すみません。00570番発言の中にもしかしたら公開されたらまずいかもしれない情報があったので、念のため削除しておきました。
[ ]
RE:00571 マクロファイルの動きNo.00573
officenoji さん 20/12/09 19:19 [ コメントを投稿する ]
  お世話になっております。
色々ありがとうございます。
結果上手くいきました。
ZipTempフォルダにもファイルが存在しているのを確認できました。
--------------------------------------------------------------
コマンドラインは以下の1行です。
"C:\Program files\7-Zip\7z.exe" -ppass a "C:\Users\********\Documents\ZipTemp\****.zip" "C:\TuruKameData\***@****.jp\送信添付\201209_11\*****.pdf"


7-Zip 20.02 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-08-08

Scanning the drive:
1 file, 240590 bytes (235 KiB)

Creating archive: C:\Users\*******\Documents\ZipTemp\*******.zip

Add new data to archive: 1 file, 240590 bytes (235 KiB)


Files read from disk: 1
Archive size: 211859 bytes (207 KiB)
Everything is Ok
--------------------------------------------------------------
原因らしきものは判明されるのでしょうか、
よろしくお願いいたします。


> パスワードの所が化けてるような気がします。なぜそうなるのやら?
>
> マクロの141行目付近にある
>
>    if( $password != "" ) {
>        $cmd = "-p" + $password + " " + $cmd;
>    }
>
> の直前に、試しに
>
>    $password = "pass";
>
> みたいなのを入れてパスワードを固定文字列にしてみたらどうでしょうか。それで
>うまく動くとしたら、パスワードの生成の処理がおかしいのかなぁと思いますけど
>も・・・。
[ ]
RE:00573 マクロファイルの動きNo.00574
秀まるお さん 20/12/09 23:01 [ コメントを投稿する ]
   確認どうもです。

 ということは、パスワードを生成する処理がバグってるのかもしれませんが、なぜに昨日まで大丈夫だったのが今日になってダメになるのか、よく分からず・・・

 とりあえず、パスワードを生成する処理を少しいじってみました。これでどうでしょ?

 あと、秀丸メールのバージョンが古い場合は最新版(V6.96)か、もっと新しい最新β版をインストールして試してみて欲しいです。

-----------------------------------------------------------------------------
// 添付ファイル圧縮-7zip-パスワード別便通知.mac by 斉藤秀夫
// 2019.02.24
// 7-zipのダウンロード先:  http://sevenzip.sourceforge.jp/
//
// 2019.03.08 Version 1.1 署名も付けるようにした。乱数発生用のメッセージ表示回数を少し減らした。

    //パスワード付きにする場合はここにパスワードを設定しておく。
    //パスワード無しにするなら""を代入する。
    //パスワードを毎回入力したい場合は $password = "*"としておく。
    //パスワードの中には空白は入れないでください。
    //受信したメールの添付ファイルを圧縮する場合についてはパスワードの指定は効きません。常にパスワード無しで圧縮されます。
    //
    // 例:
    //  $password = "";         ... パスワード無し
    //  $password = "pass";     ... パスワードを"pass"にする。
    //  $password = "*";        ... パスワードを毎回入力する。
    //  #passwordlength = 10;   ... パスワードを自動生成。長さ指定。
    #passwordlength = 6;

    loaddll "tkinfo.dll";
    $7zip = "C:\\Program files\\7-Zip\\7z.exe";
    if( ! existfile( $7zip ) ) {
        $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            message "7-Zipのプログラム用ファイルが見つかりません。7-Zipをインストールしてください。\n\n" +
                    "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program files (x86)\\7-Zip にインストールされてる必要があります。";
            endmacro;
        }
    }
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    $home = getregstr( "HomeDir" );
    closereg;
    $account = dllfuncstr("CurrentAccount");
    if( dllfunc("IsTuruKameMain") ) {
        message "このマクロは送信するメール専用です。";
        endmacro;
    }

    if( dllfunc("MailType") == 3 || readonly ) {
        message "受信したメールの添付ファイル・圧縮は、このマクロでは出来ません。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "To" ) == "" ) {
        message "宛先がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "Subject" ) == "" ) {
        message "件名がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    #cAttach = 0;
    while(1) {
        $aAttach[#cAttach] = dllfuncstr("CurrentHeader2", "X-Attach"
                                       , #cAttach );
        if( $aAttach[#cAttach] == "" ) break;
        #cAttach = #cAttach + 1;
    }
    if( #cAttach == 0 ) {
        message "添付ファイルは1つもありません。";
        endmacro;
    }
    if( #cAttach == 1 ) {
        if( rightstr( $aAttach[0], 4 ) == ".zip" ) {
            message "添付ファイルは既に圧縮されてます。";
            endmacro;
        }
        $dest = $aAttach[0] + ".zip";
    } else {
        $dest = $aAttach[0] + "など.zip";
    }
    while(1) {
        #n = strstr( $dest, "\\" );
        if( #n < 0 ) {
            break;
        }
        $dest = midstr( $dest, #n + 1, 256 );
    }
    $dest = input( "圧縮して作成するファイル名は?", $dest );
    if( $dest == "" ) {
        endmacro;
    }
    if( #passwordlength != 0 ) {
        #i = 0;
        $password = "";
        #rand_init = tickcount + #i + val(second) + val(minute);
        while( #i < #passwordlength ) {
            if( #i == 0 ) {
                #rand = #rand_init / (10 + 26 + 26) % (10 + 26 + 26);
            } else if( #i == 1 ) {
                #rand = #rand_init % (10 + 26 + 26);
            } else {
                message "乱数を生成する用に、何かキーを押してください。(あと" + str( #passwordlength - #i ) + "回)";
                refreshdatetime;
                #rand = (tickcount + #i + val(second) + val(minute)) % (10 + 26 + 26);
            }
            if( #rand < 10 ) {
                $rand = char( '0' + #rand );
            } else if( #rand < 10 + 26 ) {
                $rand = char( 'a' + #rand - 10 );
            } else {
                $rand = char( 'A' + #rand - 10 - 26 );
            }
            $password = $password + $rand;
            #i = #i + 1;
        }
    } else {
        if( $password == "*" ) {
            $password = input( "パスワードは?" );
            if( $password == "" ) {
                question "パスワード無しにしますか?";
                if( result != yes ) {
                    endmacro;
                }
            }
        }
    }

    //「ドキュメント」フォルダ配下に生成する?
    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\ZipTemp";
    runsync2 "cmd.exe /c rmdir /s /q \"" + $outfolder + "\"";       //古いファイルのゴミを削除
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    $destbase = $dest;
    $dest = $outfolder + "\\" + $dest;
    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
    #n = dllfunc("Bypass_DeleteFile", $dest);
    //添付ファイル圧縮-7zip.macで修正。
    //$cmd = "-j \"" + $dest + "\"";
    $cmd = "a \"" + $dest + "\"";
    #i = 0;
    while( #i < #cAttach ) {
        $cmd = $cmd + " \"" + $home + $account + "\\" + $aAttach[#i] + "\"";
        #i = #i + 1;
    }
    //添付ファイル圧縮-7zip.macで修正。
    //#n = dllfunc("Zip", hidemaruhandle(0), $cmd);

    if( $password != "" ) {
        $cmd = "-p" + $password + " " + $cmd;
    }
    $cmdline = "\"" + $7zip + "\" " + $cmd;
    runsync2 $cmdline;
    if( !result ) {
        message "7zipの実行に失敗しました。";
        endmacro;
    }
    if( ! existfile( $dest ) ) {
        message "7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗しています。\nファイル名 = " + $dest;
        endmacro;
    }
    #n = dllfunc("AddAttach", $dest);
    // ファイルの削除
    #n = dllfunc("Bypass_DeleteFile", $dest);
    #i = 0;
    while( #i < #cAttach ) {
        #n = dllfunc("UndoAttach", $aAttach[#i]);
        #i = #i + 1;
    }
    if( $password != "" ) {
        $to = dllfuncstr("CurrentHeader", "To");
        $toname = dllfuncstr("SetNameOnly", $to);
        if( $toname == "" ) {
            $toname = $to;
        }
        $subject = dllfuncstr("CurrentHeader", "Subject");
        $sign = dllfuncstr("CurrentSignName");
        #attachhidemaru = hidemaruhandle(0);
        #n = dllfunc("NewMail");
        #n = dllfunc("SwitchSign", "");         //署名無しに一回切り替え
        #n = dllfunc("SetHeader", "To", $to );
        #n = dllfunc("SetHeader", "Subject", "パスワードの通知 - " + $subject );
        gofiletop;
        beginsel;
        gofileend;
        delete;
        insert $toname + " 様\n\n暗号化したファイルを別メールで送信しましたので、\nパスワードをお知らせします。\n\n" +
                "件名 : " + $subject + "\n" +
                "\n" +
                "添付ファイル名: " + $destbase + "\n" +
                "解凍パスワード: " + $password + "\n" +
                "\n" +
                "よろしくお願いします。\n";
        if( leftstr($sign, 1) == "\\" ) {
            //切り替えできない
            $signContent = dllfuncstr("LoadTemplate", "sign", $sign);
            if( $signContent != "" ) {
                insert "\n" + $signContent;
            }
        } else {
            #n = dllfunc("SwitchSign", $sign);          //署名をここで切り替え
        }
        gofiletop;
        setactivehidemaru #attachhidemaru;
    }
    endmacro;
[ ]
RE:00574 マクロファイルの動きNo.00575
officenoji さん 20/12/10 08:47 [ コメントを投稿する ]
  お世話になっております。
迅速な対応ありがとございます。
頂いたスクリプトで問題は解消いたしました。
原因は?です。秀丸メールは最新バージョンにUPしております。
お願いばかりで恐縮ですが、別送のメールに自動的に本文のCCをつけたいのですが、
簡単にはいかないのでしょうか、
ほぼ毎日のように添付ファイル付きのメールを送っており、都度CCをコピペしており
偶に忘れると、CC宛先方から問い合わせが来ます。
無理なお願いで恐縮ですが、よろしくお願いいたします。

> 確認どうもです。
>
> ということは、パスワードを生成する処理がバグってるのかもしれませんが、なぜ
>に昨日まで大丈夫だったのが今日になってダメになるのか、よく分からず・・・
>
> とりあえず、パスワードを生成する処理を少しいじってみました。これでどうでし
>ょ?
>
> あと、秀丸メールのバージョンが古い場合は最新版(V6.96)か、もっと新しい最新
>β版をインストールして試してみて欲しいです。
>
>-----------------------------------------------------------------------------
>// 添付ファイル圧縮-7zip-パスワード別便通知.mac by 斉藤秀夫
>// 2019.02.24
>// 7-zipのダウンロード先:  http://sevenzip.sourceforge.jp/
>//
>// 2019.03.08 Version 1.1 署名も付けるようにした。乱数発生用のメッセージ表示
>回数を少し減らした。
>
>    //パスワード付きにする場合はここにパスワードを設定しておく。
>    //パスワード無しにするなら""を代入する。
>    //パスワードを毎回入力したい場合は $password = "*"としておく。
>    //パスワードの中には空白は入れないでください。
>    //受信したメールの添付ファイルを圧縮する場合についてはパスワードの指定は
>効きません。常にパスワード無しで圧縮されます。
>    //
>    // 例:
>    //  $password = "";         ... パスワード無し
>    //  $password = "pass";     ... パスワードを"pass"にする。
>    //  $password = "*";        ... パスワードを毎回入力する。
>    //  #passwordlength = 10;   ... パスワードを自動生成。長さ指定。
>    #passwordlength = 6;
>
>    loaddll "tkinfo.dll";
>    $7zip = "C:\\Program files\\7-Zip\\7z.exe";
>    if( ! existfile( $7zip ) ) {
>        $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
>        if( ! existfile( $7zip ) ) {
>            message "7-Zipのプログラム用ファイルが見つかりません。7-Zipをイン
>ストールしてください。\n\n" +
>                    "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program 
>files (x86)\\7-Zip にインストールされてる必要があります。";
>            endmacro;
>        }
>    }
>    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
>    $home = getregstr( "HomeDir" );
>    closereg;
>    $account = dllfuncstr("CurrentAccount");
>    if( dllfunc("IsTuruKameMain") ) {
>        message "このマクロは送信するメール専用です。";
>        endmacro;
>    }
>
>    if( dllfunc("MailType") == 3 || readonly ) {
>        message "受信したメールの添付ファイル・圧縮は、このマクロでは出来ませ
>ん。";
>        endmacro;
>    }
>    if( dllfuncstr("CurrentHeader", "To" ) == "" ) {
>        message "宛先がまだ指定されてません。このマクロは宛先/件名を入力した
>後に実行してください。";
>        endmacro;
>    }
>    if( dllfuncstr("CurrentHeader", "Subject" ) == "" ) {
>        message "件名がまだ指定されてません。このマクロは宛先/件名を入力した
>後に実行してください。";
>        endmacro;
>    }
>    #cAttach = 0;
>    while(1) {
>        $aAttach[#cAttach] = dllfuncstr("CurrentHeader2", "X-Attach"
>                                       , #cAttach );
>        if( $aAttach[#cAttach] == "" ) break;
>        #cAttach = #cAttach + 1;
>    }
>    if( #cAttach == 0 ) {
>        message "添付ファイルは1つもありません。";
>        endmacro;
>    }
>    if( #cAttach == 1 ) {
>        if( rightstr( $aAttach[0], 4 ) == ".zip" ) {
>            message "添付ファイルは既に圧縮されてます。";
>            endmacro;
>        }
>        $dest = $aAttach[0] + ".zip";
>    } else {
>        $dest = $aAttach[0] + "など.zip";
>    }
>    while(1) {
>        #n = strstr( $dest, "\\" );
>        if( #n < 0 ) {
>            break;
>        }
>        $dest = midstr( $dest, #n + 1, 256 );
>    }
>    $dest = input( "圧縮して作成するファイル名は?", $dest );
>    if( $dest == "" ) {
>        endmacro;
>    }
>    if( #passwordlength != 0 ) {
>        #i = 0;
>        $password = "";
>        #rand_init = tickcount + #i + val(second) + val(minute);
>        while( #i < #passwordlength ) {
>            if( #i == 0 ) {
>                #rand = #rand_init / (10 + 26 + 26) % (10 + 26 + 26);
>            } else if( #i == 1 ) {
>                #rand = #rand_init % (10 + 26 + 26);
>            } else {
>                message "乱数を生成する用に、何かキーを押してください。(あと
>" + str( #passwordlength - #i ) + "回)";
>                refreshdatetime;
>                #rand = (tickcount + #i + val(second) + val(minute)) % (10 + 
>26 + 26);
>            }
>            if( #rand < 10 ) {
>                $rand = char( '0' + #rand );
>            } else if( #rand < 10 + 26 ) {
>                $rand = char( 'a' + #rand - 10 );
>            } else {
>                $rand = char( 'A' + #rand - 10 - 26 );
>            }
>            $password = $password + $rand;
>            #i = #i + 1;
>        }
>    } else {
>        if( $password == "*" ) {
>            $password = input( "パスワードは?" );
>            if( $password == "" ) {
>                question "パスワード無しにしますか?";
>                if( result != yes ) {
>                    endmacro;
>                }
>            }
>        }
>    }
>
>    //「ドキュメント」フォルダ配下に生成する?
>    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\
>Explorer\\Shell Folders";
>    $outfolder = getregstr("Personal");
>    closereg;
>    $outfolder = $outfolder + "\\ZipTemp";
>    runsync2 "cmd.exe /c rmdir /s /q \"" + $outfolder + "\"";       //古いフ
>ァイルのゴミを削除
>    #n = dllfunc("Bypass_CreateDirectory", $outfolder);
>
>    $destbase = $dest;
>    $dest = $outfolder + "\\" + $dest;
>    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
>    #n = dllfunc("Bypass_DeleteFile", $dest);
>    //添付ファイル圧縮-7zip.macで修正。
>    //$cmd = "-j \"" + $dest + "\"";
>    $cmd = "a \"" + $dest + "\"";
>    #i = 0;
>    while( #i < #cAttach ) {
>        $cmd = $cmd + " \"" + $home + $account + "\\" + $aAttach[#i] + "\"";
>        #i = #i + 1;
>    }
>    //添付ファイル圧縮-7zip.macで修正。
>    //#n = dllfunc("Zip", hidemaruhandle(0), $cmd);
>
>    if( $password != "" ) {
>        $cmd = "-p" + $password + " " + $cmd;
>    }
>    $cmdline = "\"" + $7zip + "\" " + $cmd;
>    runsync2 $cmdline;
>    if( !result ) {
>        message "7zipの実行に失敗しました。";
>        endmacro;
>    }
>    if( ! existfile( $dest ) ) {
>        message "7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗
>しています。\nファイル名 = " + $dest;
>        endmacro;
>    }
>    #n = dllfunc("AddAttach", $dest);
>    // ファイルの削除
>    #n = dllfunc("Bypass_DeleteFile", $dest);
>    #i = 0;
>    while( #i < #cAttach ) {
>        #n = dllfunc("UndoAttach", $aAttach[#i]);
>        #i = #i + 1;
>    }
>    if( $password != "" ) {
>        $to = dllfuncstr("CurrentHeader", "To");
>        $toname = dllfuncstr("SetNameOnly", $to);
>        if( $toname == "" ) {
>            $toname = $to;
>        }
>        $subject = dllfuncstr("CurrentHeader", "Subject");
>        $sign = dllfuncstr("CurrentSignName");
>        #attachhidemaru = hidemaruhandle(0);
>        #n = dllfunc("NewMail");
>        #n = dllfunc("SwitchSign", "");         //署名無しに一回切り替え
>        #n = dllfunc("SetHeader", "To", $to );
>        #n = dllfunc("SetHeader", "Subject", "パスワードの通知 - " + $subject
> );
>        gofiletop;
>        beginsel;
>        gofileend;
>        delete;
>        insert $toname + " 様\n\n暗号化したファイルを別メールで送信しましたの
>で、\nパスワードをお知らせします。\n\n" +
>                "件名 : " + $subject + "\n" +
>                "\n" +
>                "添付ファイル名: " + $destbase + "\n" +
>                "解凍パスワード: " + $password + "\n" +
>                "\n" +
>                "よろしくお願いします。\n";
>        if( leftstr($sign, 1) == "\\" ) {
>            //切り替えできない
>            $signContent = dllfuncstr("LoadTemplate", "sign", $sign);
>            if( $signContent != "" ) {
>                insert "\n" + $signContent;
>            }
>        } else {
>            #n = dllfunc("SwitchSign", $sign);          //署名をここで切り替
>え
>        }
>        gofiletop;
>        setactivehidemaru #attachhidemaru;
>    }
>    endmacro;
[ ]
RE:00575 マクロファイルの動きNo.00576
秀まるお さん 20/12/10 09:06 [ コメントを投稿する ]
   マクロがうまく動いてなかったのは、すみませんがマクロのバグのようでした。マクロの中で乱数を発生させるのに「tickcount」って値(WindowsのGetTickCount()関数の返り値)を使ってるんですが、これはパソコンを起動してから25日ほど経過すると負の数になってしまいます。負の数の時に、マクロが誤動作してました。大変失礼しました。

 昨日書き込みにたマクロもまだその辺は配慮がされてないので、またその辺修正させていただきます。

> お願いばかりで恐縮ですが、別送のメールに自動的に本文のCCをつけたいのですが、
> 簡単にはいかないのでしょうか、

 Cc:の宛先のことは考えてませんでした。tickcountの解釈がおかしいバグ修正も含めて、マクロを直してまた書き込みさせていただきます。少々お待ちください。
[ ]
RE:00576 マクロファイルの動きNo.00577
officenoji さん 20/12/10 09:13 [ コメントを投稿する ]
  ご対応ありがとうございました。
乱数を発生させないと分からなかったようですね、
原因が判明し助かりました。
引き続きよろしくお願いいたします。

> マクロがうまく動いてなかったのは、すみませんがマクロのバグのようでした。マ
>クロの中で乱数を発生させるのに「tickcount」って値(WindowsのGetTickCount()関
>数の返り値)を使ってるんですが、これはパソコンを起動してから25日ほど経過する
>と負の数になってしまいます。負の数の時に、マクロが誤動作してました。大変失礼
>しました。
>
> 昨日書き込みにたマクロもまだその辺は配慮がされてないので、またその辺修正さ
>せていただきます。
>
>> お願いばかりで恐縮ですが、別送のメールに自動的に本文のCCをつけたいのですが、
>> 簡単にはいかないのでしょうか、
>
> Cc:の宛先のことは考えてませんでした。tickcountの解釈がおかしいバグ修正も含
>めて、マクロを直してまた書き込みさせていただきます。少々お待ちください。
[ ]
RE:00577 マクロファイルの動きNo.00578
秀まるお さん 20/12/10 10:14 [ コメントを投稿する ]
   マクロ内容です。一応テストしたので大丈夫だと思います。
 とりあえずこの内容でライブラリにもアップロードしなおしさせていただきます。

-------------------------------------------------------------------------------
// 添付ファイル圧縮-7zip-パスワード別便通知.mac by 斉藤秀夫
// 2019.02.24
// 7-zipのダウンロード先:  http://sevenzip.sourceforge.jp/
//
// 2019.03.08 Version 1.1 署名も付けるようにした。乱数発生用のメッセージ表示回数を少し減らした。
// 2020.12.09 Version 1.2 パスワード生成処理のバグ修正。(tickcountが負の数になるとダメだった)
//                        Cc: / Bcc:宛先を無視してたバグ修正も。

    //パスワード付きにする場合はここにパスワードを設定しておく。
    //パスワード無しにするなら""を代入する。
    //パスワードを毎回入力したい場合は $password = "*"としておく。
    //パスワードの中には空白は入れないでください。
    //受信したメールの添付ファイルを圧縮する場合についてはパスワードの指定は効きません。常にパスワード無しで圧縮されます。
    //
    // 例:
    //  $password = "";         ... パスワード無し
    //  $password = "pass";     ... パスワードを"pass"にする。
    //  $password = "*";        ... パスワードを毎回入力する。
    //  #passwordlength = 10;   ... パスワードを自動生成。長さ指定。
    #passwordlength = 6;

    loaddll "tkinfo.dll";
    $7zip = "C:\\Program files\\7-Zip\\7z.exe";
    if( ! existfile( $7zip ) ) {
        $7zip = "C:\\Program files (x86)\\7-Zip\\7z.exe";
        if( ! existfile( $7zip ) ) {
            message "7-Zipのプログラム用ファイルが見つかりません。7-Zipをインストールしてください。\n\n" +
                    "7-Zipは、C:\\Program files\\7-Zip またはC:\\Program files (x86)\\7-Zip にインストールされてる必要があります。";
            endmacro;
        }
    }
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    $home = getregstr( "HomeDir" );
    closereg;
    $account = dllfuncstr("CurrentAccount");
    if( dllfunc("IsTuruKameMain") ) {
        message "このマクロは送信するメール専用です。";
        endmacro;
    }

    if( dllfunc("MailType") == 3 || readonly ) {
        message "受信したメールの添付ファイル・圧縮は、このマクロでは出来ません。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "To" ) == "" ) {
        message "宛先がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    if( dllfuncstr("CurrentHeader", "Subject" ) == "" ) {
        message "件名がまだ指定されてません。このマクロは宛先/件名を入力した後に実行してください。";
        endmacro;
    }
    #cAttach = 0;
    while(1) {
        $aAttach[#cAttach] = dllfuncstr("CurrentHeader2", "X-Attach"
                                       , #cAttach );
        if( $aAttach[#cAttach] == "" ) break;
        #cAttach = #cAttach + 1;
    }
    if( #cAttach == 0 ) {
        message "添付ファイルは1つもありません。";
        endmacro;
    }
    if( #cAttach == 1 ) {
        if( rightstr( $aAttach[0], 4 ) == ".zip" ) {
            message "添付ファイルは既に圧縮されてます。";
            endmacro;
        }
        $dest = $aAttach[0] + ".zip";
    } else {
        $dest = $aAttach[0] + "など.zip";
    }
    while(1) {
        #n = strstr( $dest, "\\" );
        if( #n < 0 ) {
            break;
        }
        $dest = midstr( $dest, #n + 1, 256 );
    }
    $dest = input( "圧縮して作成するファイル名は?", $dest );
    if( $dest == "" ) {
        endmacro;
    }
    if( #passwordlength != 0 ) {
        #i = 0;
        $password = "";
        #rand_init = (tickcount & 0x7FFFFFFF) + #i + val(second) + val(minute);
        $asciilist = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        while( #i < #passwordlength ) {
            if( #i == 0 ) {
                #rand = #rand_init / (10 + 26 + 26) % (10 + 26 + 26);
            } else if( #i == 1 ) {
                #rand = #rand_init % (10 + 26 + 26);
            } else {
                message "乱数を生成する用に、何かキーを押してください。(あと" + str( #passwordlength - #i ) + "回)";
                refreshdatetime;
                #rand = ((tickcount & 0x7FFFFFFF) + #i + val(second) + val(minute)) % (10 + 26 + 26);
            }
            if( #rand < 0 ) {
                #rand = - #rand;        //負の数だとダメ。念のための処理。
            }
            $password = $password + midstr( $asciilist, #rand % strlen($asciilist), 1 );
            #i = #i + 1;
        }
    } else {
        if( $password == "*" ) {
            $password = input( "パスワードは?" );
            if( $password == "" ) {
                question "パスワード無しにしますか?";
                if( result != yes ) {
                    endmacro;
                }
            }
        }
    }

    //「ドキュメント」フォルダ配下に生成する?
    openreg "CURRENTUSER","Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
    $outfolder = getregstr("Personal");
    closereg;
    $outfolder = $outfolder + "\\ZipTemp";
    runsync2 "cmd.exe /c rmdir /s /q \"" + $outfolder + "\"";       //古いファイルのゴミを削除
    #n = dllfunc("Bypass_CreateDirectory", $outfolder);

    $destbase = $dest;
    $dest = $outfolder + "\\" + $dest;
    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
    #n = dllfunc("Bypass_DeleteFile", $dest);
    //添付ファイル圧縮-7zip.macで修正。
    //$cmd = "-j \"" + $dest + "\"";
    $cmd = "a \"" + $dest + "\"";
    #i = 0;
    while( #i < #cAttach ) {
        $cmd = $cmd + " \"" + $home + $account + "\\" + $aAttach[#i] + "\"";
        #i = #i + 1;
    }
    //添付ファイル圧縮-7zip.macで修正。
    //#n = dllfunc("Zip", hidemaruhandle(0), $cmd);

    if( $password != "" ) {
        $cmd = "-p" + $password + " " + $cmd;
    }
    $cmdline = "\"" + $7zip + "\" " + $cmd;
    runsync2 $cmdline;
    if( !result ) {
        message "7zipの実行に失敗しました。";
        endmacro;
    }
    if( ! existfile( $dest ) ) {
        message "7zipで生成されたはずのファイルがありません。たぶん圧縮に失敗しています。\nファイル名 = " + $dest;
        endmacro;
    }
    #n = dllfunc("AddAttach", $dest);
    // ファイルの削除
    #n = dllfunc("Bypass_DeleteFile", $dest);
    #i = 0;
    while( #i < #cAttach ) {
        #n = dllfunc("UndoAttach", $aAttach[#i]);
        #i = #i + 1;
    }
    if( $password != "" ) {
        $to = dllfuncstr("CurrentHeaderUnited", "To");
        $cc = dllfuncstr("CurrentHeaderUnited", "Cc");          //バグ修正。Cc: / Bcc:対応。
        $bcc = dllfuncstr("CurrentHeaderUnited", "Bcc");        //バグ修正。Cc: / Bcc:対応。
        $toname = dllfuncstr("SetNameOnly", $to);
        $subject = dllfuncstr("CurrentHeader", "Subject");
        $sign = dllfuncstr("CurrentSignName");
        #attachhidemaru = hidemaruhandle(0);
        #n = dllfunc("NewMail");
        #n = dllfunc("SwitchSign", "");         //署名無しに一回切り替え
        #n = dllfunc("SetHeaderUnited", "To", $to);
        if( $cc != "" ) {
            #n = dllfunc("SetHeaderUnited", "Cc", $cc);
        }
        if( $bcc != "" ) {
            #n = dllfunc("SetHeaderUnited", "Bcc", $bcc);
        }
        #n = dllfunc("SetHeader", "Subject", "パスワードの通知 - " + $subject );
        gofiletop;
        beginsel;
        gofileend;
        delete;
        insert $toname + " 様\n\n暗号化したファイルを別メールで送信しましたので、\nパスワードをお知らせします。\n\n" +
                "件名 : " + $subject + "\n" +
                "\n" +
                "添付ファイル名: " + $destbase + "\n" +
                "解凍パスワード: " + $password + "\n" +
                "\n" +
                "よろしくお願いします。\n";
        if( leftstr($sign, 1) == "\\" ) {
            //切り替えできない
            $signContent = dllfuncstr("LoadTemplate", "sign", $sign);
            if( $signContent != "" ) {
                insert "\n" + $signContent;
            }
        } else {
            #n = dllfunc("SwitchSign", $sign);          //署名をここで切り替え
        }
        gofiletop;
        setactivehidemaru #attachhidemaru;
    }
    endmacro;
[ ]
RE:00578 マクロファイルの動きNo.00579
officenoji さん 20/12/10 11:16 [ コメントを投稿する ]
  お世話になっております。
以下のマクロファイルで問題なく動作いたしました。
別送メールにCCが付いたため、大変助かりました。
ありがとうございました。


> マクロ内容です。一応テストしたので大丈夫だと思います。
> とりあえずこの内容でライブラリにもアップロードしなおしさせていただきます。
[ ]

[ 新規に投稿する ]