圧縮マクロattachcompress4.zipについてNo.43320
kusakabe さん 12/09/21 18:40
 
添付ファイルを1つのファイルにしたいため2012/04/08版の
「添付ファイル圧縮マクロ(受信系/送信系兼用、lzh/zip形式両対応)」attachcomp
ress4.zipを利用させていただきました。

添付ファイルありのファイルのみに絞って圧縮するのですが、
zipファイルが1つのみ添付されているファイルだと、
aaa.zip.zipというファイルになってしまいます。

zipファイルが1つのみ添付されているファイルは、
スキップするようにするにはどうすればよいでしょうか。

マクロが分からないのですいません。。

[ ]
RE:43320 圧縮マクロattachcompress4.zipNo.43324
秀まるお2 さん 12/09/22 10:20
 
改良してみました。

ここの会議室に書き込みします。

-------------------添付ファイル圧縮ZipSeparate.mac----------
// 添付ファイル圧縮ZipSeparate.mac by 斉藤秀夫
// 2004.10.29
// 受信したメールを複数選択して圧縮したり、送信系メール上で添付ファイルを圧
縮できるようになった。
// 鶴亀メールV2.33以上でないと使えない。
// 2012.4.7 ファイル名に角括弧が入っている場合は圧縮しないようにした。(エ
ラーになるので)
// 2012.9.22 送信系メールでのzip/lzhファイルは圧縮しないように修正。
//
    loaddll "tkinfo.dll";
    if( dllfunc("TuruKameVersion") < 450 ) {
        message "このマクロを使うには、秀丸メールのバージョンがV4.50以上でな
いとダメです。";
        endmacro;
    }
    if( 0x7FFFFFFF + 0x1000 > 0x7FFFFFFF ) {
        message "このマクロは秀丸メールの32bit版でないと使えません。";
        endmacro;
    }
    if( !dllfunc("LoadZipDll") ) {
        message "Zip32J.dllおよびZip32.dllがロードできませんでした。Zip32J.d
llとZip32.dllの両方を入手して正しくインストールしてください。\n(詳しくはwww.
google.co.jp等でご自分で検索してください。)";
        endmacro;
    }
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    $home = getregstr( "HomeDir" );
    closereg;
    $account = dllfuncstr("CurrentAccount");
    if( dllfunc("IsTuruKameMain") ) {
        question "現在選択しているメール(複数も可)の添付ファイルを圧縮しま
す。よろしいですか?";
        if( result == yes ) goto CompressAll;
        endmacro;
    }

    if( dllfunc("MailType") == 3 ) {
        message "受信したメールの添付ファイル・圧縮は、秀丸メール本体上でし
か実行できません。";
        endmacro;
    }
    if( readonly ) {
        #n = dllfunc("EnableEdit");
    }
    #cAttach = dllfunc("CountCurrentHeader", "X-Attach");
    if( #cAttach == 0 ) {
        message "添付ファイルは1つもありません。";
        endmacro;
    }
    #i = 0;
    while( #i < #cAttach ) {
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i );
        if( strstr( $attach, "[" ) > 0
         || strstr( $attach, "]" ) > 0 ) {
            message "ファイル名の中に角括弧を含む場合はこのマクロでは圧縮出
来ません。7-zipで圧縮するマクロを使ってください。";
            endmacro;
        }
        #i = #i + 1;
    }
    #i = 0;
    #cNewAttach = 0;
    while( #i < #cAttach ) {
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i );
        if( $attach == "" ) break;
        $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ));
        if( $ext == ".zip" || $ext == ".lzh" ) {
            #i = #i + 1;
            continue;
        }
        $dest = $attach + ".zip";
        while(1) {
            #n = strstr( $dest, "\\" );
            if( #n < 0 ) {
                break;
            }
            $dest = midstr( $dest, #n + 1, 256 );
        }
        $tmp = getenv("temp");
        if( $tmp == "" ) {
            $tmp = getenv("tmp");
        }
        if( rightstr($tmp, 1) != "\\" ) {
            $tmp = $tmp + "\\";
        }
        $dest = $tmp + $dest;
        #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
        #n = dllfunc("Bypass_DeleteFile", $dest);
        $cmd = "-j \"" + $dest + "\" \"" + $home + $account + "\\" + $attach
 + "\"";
        #n = dllfunc("Zip", hidemaruhandle(0), $cmd);
        #n = dllfunc( "AddAttach", $dest );
        #n = dllfunc("Bypass_DeleteFile", $dest);

        #aiNewAttach[#cNewAttach] = #i;
        #cNewAttach = #cNewAttach + 1;

        #i = #i + 1;
    }
    if( #cNewAttach == 0 ) {
        message "圧縮した添付ファイルはありませんでした。";
    } else {
        #i = #cNewAttach;
        while( #i > 0 ) {
            #i = #i - 1;
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #aiNewAttach
[#i] );
            #n = dllfunc( "UndoAttach", $attach );
        }
    }
    #n = dllfunc("FreeZipDll");
    endmacro;


// 受信したメールの添付ファイルを圧縮する処理。
CompressAll:
    #n = dllfunc("LockSelection");
    #cCompressed = 0;
    while( dllfunc("EnumSelection", 1) != 0 ) {
        if( dllfuncstr("CurrentHeader", "X-Attach") != "" ) {
            #n = dllfunc("BeginEditMail");
            #i = 0;
            while(1) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                if( $attach == "" ) {
                    break;
                }
                $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ));
                if( $ext == ".lzh" || $ext == ".zip"
                 || $ext == ".pdf"
                 || $ext == ".gif"
                 || $ext == ".jpg"
                 || $ext == ".bin"
                 || rightstr($attach, 26) == "\\application_pgp-signature"
                 || rightstr($attach, 26) == "\\application_pgp-encrypted"
                 || rightstr($attach, 25) == "\\application_octet-stream"
                 || strstr($attach, "[" ) >= 0
                 || strstr($attach, "]" ) >= 0
                        ) {
                    // 圧縮しても効果がないので圧縮しない
                    // PGP関係の添付ファイルも圧縮しない
                    //2012.4.7 角括弧入りファイル名のファイルもスキップ。
                } else {
                    $path = $home + $account + "\\" + $attach;
                    if( dllfunc("Bypass_GetFileSize", $path) >= 256 ) {
                        // 256バイト以上のファイルなら圧縮する。
                        $pathLzh = $path + ".zip";
                        $cmd = "-j \"" + $pathLzh + "\" \"" + $path + "\"";
                        #n = dllfunc("Zip", hidemaruhandle(0), $cmd);
                        if( ! existfile( $pathLzh ) ) {
                            message "Zip圧縮に失敗したようです。スキップしま
す。";
                        } else {
                            #n = dllfunc("Bypass_SetFileAttributes", $pathLz
h, 0x00000021);     //ReadOnly属性に設定。
                            #n = dllfunc("Bypass_SetFileAttributes", $path,
0x00000020);        // ReadOnlyを解除。
                            #n = dllfunc("Bypass_DeleteFile", $path);
                            if( #n == 0 ) {
                                message $path + " の削除に失敗しましたが処理
を続行します。";
                            }
                            #n = dllfunc("SetHeader2", "X-Attach", $attach +
 ".zip", #i);
                            #cCompressed = #cCompressed + 1;
                        }
                    }
                }
                #i = #i + 1;
            }
            #n = dllfunc("SaveEditMail", 0);
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    message str(#cCompressed) + "個の添付ファイルを圧縮しました。";
    #n = dllfunc("FreeZipDll");
    endmacro;

[ ]
RE:43324 圧縮マクロattachcompress4.zipNo.43342
kusakabe さん 12/09/27 19:29
 
秀まるお2様

マクロの書き込みありがとうございました。

書き込みした内容は、記載内容が分かりずらかったかも
しれませんが、「添付ファイル圧縮.mac」の方の内容でした。

「添付ファイル圧縮.mac」で、複数の添付ファイルを1つのzipに
圧縮してくれますが、その際にzipファイルが1つのみ添付されて
いるファイルをスキップするようにしたいという内容です。

こちらのマクロも教えて頂けますでしょうか。

お手数をお掛けしますが、宜しくお願い致します。

[ ]
RE:43342 圧縮マクロattachcompress4.zipNo.43343
秀まるお2 さん 12/09/27 23:13
 
 「添付ファイル圧縮.mac」の方は、lzh形式に圧縮するものなので、zipに圧縮
するとしたら、「添付ファイル圧縮Zip.mac」の方ですかね。

 それだとしたら、53行目付近にある

    if( #cAttach == 1 ) {
        $dest = $aAttach[0] + ".zip";
    } else {
        $dest = $aAttach[0] + "など.zip";
    }

 って処理を、

    if( #cAttach == 1 ) {
        if( rightstr( $aAttach[0], 4 ) == ".zip" ) {
            message "添付ファイルは既に圧縮されてます。";
            endmacro;
        }
        $dest = $aAttach[0] + ".zip";
    } else {
        $dest = $aAttach[0] + "など.zip";
    }

 のようにしたらいいかと思います。それでどうでしょうか。

[ ]
RE:43343 圧縮マクロattachcompress4.zipNo.43359
kusakabe さん 12/10/02 20:27
 
「添付ファイル圧縮Zip.mac」の教えて頂いたところを書き変えてみましたが、
思うような動きになりません。

いろいろ試してみたところ、下記のようになりました。

【確認結果】
@aaa.txt 1ファイルのみが添付:aaa.txt.zip になる
Aaaa.zip 1ファイルのみが添付:aaa.zip.zip になる
Baaa.txt,aaa.xls の2つが添付:aaa.txt.zip 1つになる
Caaa.zip,bbb.zip の2つが添付:aaa.zip.zip 1つになる

Aはなにもせずに飛ばす
BCは「〜など.zip」になる
とするにはどうすればよいでしょうか。
もしよろしければ教えてください。

[ ]
RE:43359 圧縮マクロattachcompress4.zipNo.43361
秀まるお2 さん 12/10/03 08:49
 
すみません。僕が直したのは、送信するメール用の添付ファイルを圧縮する方だけで
した。受信したメールの添付ファイルを圧縮する方が問題だったのですね。

マクロは、修正点がややこしいので全部書きます。

----------------添付ファイル圧縮Zip.mac------------------
// 添付ファイル圧縮Zip.mac by 斉藤秀夫
// 2006.4.14
// 受信したメールを複数選択して圧縮したり、送信系メール上で添付ファイルを圧
縮できるようになった。
// 秀丸メールV2.33以上でないと使えない。
// 2006.4.14 受信したメールの添付ファイルを圧縮する時は、1つにまとめるよう
にした。
// 2012.4.7 Zipに失敗した場合対応。およびファイル名に[]がある場合対応。(フ
ァイル名に[]があるとダメみたいだ)
// 2012.10.03 既に.zip単独ファイルになってる物は圧縮しない。
    loaddll "tkinfo.dll";
    if( dllfunc("TuruKameVersion") < 450 ) {
        message "このマクロを使うには、秀丸メールのバージョンがV4.50以上でな
いとダメです。";
        endmacro;
    }
    if( 0x7FFFFFFF + 0x1000 > 0x7FFFFFFF ) {
        message "このマクロは秀丸メールの32bit版でないと使えません。";
        endmacro;
    }
    if( !dllfunc("LoadZipDll") ) {
        message "Zip32J.dllおよびZip32.dllがロードできませんでした。Zip32J.d
llとZip32.dllの両方を入手して正しくインストールしてください。\n(詳しくはwww.
google.co.jp等でご自分で検索してください。)";
        endmacro;
    }
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    $home = getregstr( "HomeDir" );
    closereg;
    $account = dllfuncstr("CurrentAccount");
    if( dllfunc("IsTuruKameMain") ) {
        question "現在選択しているメール(複数も可)の添付ファイルを圧縮しま
す。よろしいですか?";
        if( result == yes ) goto CompressAll;
        endmacro;
    }

    if( dllfunc("MailType") == 3 ) {
        message "受信したメールの添付ファイル・圧縮は、秀丸メール本体上でし
か実行できません。";
        endmacro;
    }
    if( readonly ) {
        #n = dllfunc("EnableEdit");
    }
    #cAttach = 0;
    while(1) {
        $aAttach[#cAttach] = dllfuncstr("CurrentHeader2", "X-Attach"
                                       , #cAttach );
        if( strstr( $aAttach[#cAttach], "[" ) > 0
         || strstr( $aAttach[#cAttach], "]" ) > 0 ) {
            message "ファイル名の中に角括弧を含む場合はこのマクロでは圧縮出
来ません。7-zipで圧縮するマクロを使ってください。";
            endmacro;
        }
        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;
    }
    $tmp = getenv("temp");
    if( $tmp == "" ) {
        $tmp = getenv("tmp");
    }
    if( rightstr($tmp, 1) != "\\" ) {
        $tmp = $tmp + "\\";
    }
    $dest = $tmp + $dest;
    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x00000020);
    #n = dllfunc("Bypass_DeleteFile", $dest);
    $cmd = "-j \"" + $dest + "\"";
    #i = 0;
    while( #i < #cAttach ) {
        $cmd = $cmd + " \"" + $home + $account + "\\" + $aAttach[#i] + "\"";
        #i = #i + 1;
    }
    #n = dllfunc("Zip", hidemaruhandle(0), $cmd);
    #n = dllfunc( "AddAttach", $dest );
    // ファイルの削除
    #n = dllfunc("Bypass_DeleteFile", $dest);
    #i = 0;
    while( #i < #cAttach ) {
        #n = dllfunc( "UndoAttach", $aAttach[#i] );
        #i = #i + 1;
    }
    #n = dllfunc("FreeZipDll");
    endmacro;


// 受信したメールの添付ファイルを圧縮する処理。
CompressAll:
    #n = dllfunc("LockSelection");
    #cCompressed = 0;
    while( dllfunc("EnumSelection", 1) != 0 ) {
        if( dllfuncstr("CurrentHeader", "X-Attach") != "" ) {
            //2012.4.7 ファイル名に角括弧がある場合はZip32.dllがエラーになる
ので、圧縮しないようにする。
            #KakuKakko = 0;
            #attachcount = dllfunc("CountCurrentHeader", "X-Attach");
            #i = 0;
            while( #i < #attachcount ) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                if( strstr( $attach, "[" ) >= 0
                 || strstr( $attach, "]" ) >= 0 ) {
                    #KakuKakko = 1;
                    break;
                }
                #i = #i + 1;
            }
            if( #attachcount == 1
             && rightstr( dllfuncstr("CurrentHeader", "X-Attach"), 4 ) == ".
zip" ) {
                //スキップ
                message "既にzip形式になってるのでスキップします。";
            } else if( #KakuKakko ) {
                message "添付ファイル・ファイル名に角括弧が含まれてるので圧
縮出来ません。スキップします。";
            } else {
                #WantSave = 1;
                #n = dllfunc("BeginEditMail");
                #i = 0;
                if( dllfunc("CountCurrentHeader", "X-Attach") != 0 ) {
                    //2006.4.14 複数ファイルをまとめて1つにするバージョン
                    $attach = dllfuncstr("CurrentHeader", "X-Attach");
                    $path = $home + $account + "\\" + $attach;
                    if( #attachcount == 1 ) {
                        $lzh = $attach + ".zip";
                        $pathLzh = $path + ".zip";
                    } else {
                        $lzh = $attach + "など.zip";
                        $pathLzh = $path + "など.zip";
                    }
                    $cmd = "-j \"" + $pathLzh + "\"";
                    while(1) {
                        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                        if( $attach == "" ) {
                            break;
                        }
                        $path[#i] = $home + $account + "\\" + $attach;
                        $cmd = $cmd + " \"" + $path[#i] + "\"";
                        #i = #i + 1;
                        #count = #i;
                        #cCompressed = #cCompressed + 1;
                    }
                    #n = dllfunc("Zip", hidemaruhandle(0), $cmd);
                    if( ! existfile( $pathLzh ) ) {
                        message "Zip圧縮に失敗しました。(圧縮によって生成さ
れたはずのファイルがありません。)";
                        #WantSave = 0;
                    } else {
                        #n = dllfunc("Bypass_SetFileAttributes", $pathLzh, 0
x00000021);     //ReadOnly属性に設定。
                        #i = 0;
                        while( #i < #count ) {
                            #n = dllfunc("Bypass_SetFileAttributes", $path[#
i], 0x00000020);        // ReadOnlyを解除。
                            #n = dllfunc("Bypass_DeleteFile", $path[#i]);
                            #i = #i + 1;
                        }
                        while( #i > 0 ) {
                            #i = #i - 1;
                            #n = dllfunc("DeleteHeader2", "X-Attach", #i);
                        }
                        #n = dllfunc("SetHeader", "X-Attach", $lzh);
                    }
                } else {
                    while(1) {
                        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                        if( $attach == "" ) {
                            break;
                        }
                        $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ));
                        if( $ext == ".lzh" || $ext == ".zip"
                         || $ext == ".pdf"
                         || $ext == ".gif"
                         || $ext == ".jpg"
                         || $ext == ".bin"
                         || rightstr($attach, 26) == "\\application_pgp-sign
ature"
                         || rightstr($attach, 26) == "\\application_pgp-encr
ypted"
                         || rightstr($attach, 25) == "\\application_octet-st
ream"
                                ) {
                            // 圧縮しても効果がないので圧縮しない
                            // PGP関係の添付ファイルも圧縮しない
                            #WantSave = 0;
                        } else {
                            $path = $home + $account + "\\" + $attach;
                            if( dllfunc("Bypass_GetFileSize", $path) >= 256 ) {
                                // 256バイト以上のファイルなら圧縮する。
                                $pathLzh = $path + ".zip";
                                $cmd = "-j \"" + $pathLzh + "\" \"" + $path
+ "\"";
                                #n = dllfunc("Zip", hidemaruhandle(0), $cmd);
                                if( ! existfile( $pathLzh ) ) {
                                    message "Zip圧縮に失敗しました。(圧縮に
よって生成されたはずのファイルがありません。)";
                                    #WantSave = 0;
                                } else {
                                    #n = dllfunc("Bypass_SetFileAttributes",
 $pathLzh, 0x00000021);     //ReadOnly属性に設定。
                                    #n = dllfunc("Bypass_SetFileAttributes",
 $path, 0x00000020);        // ReadOnlyを解除。
                                    #n = dllfunc("Bypass_DeleteFile", $path);
                                    if( #n == 0 ) {
                                        message $path + " の削除に失敗しまし
たが処理を続行します。";
                                    }
                                    #n = dllfunc("SetHeader2", "X-Attach", $
attach + ".zip", #i);
                                    #cCompressed = #cCompressed + 1;
                                }
                            }
                        }
                        #i = #i + 1;
                    }
                }
                if( #WantSave ) {
                    #n = dllfunc("SaveEditMail", 0);
                } else {
                    #n = dllfunc("CancelEditMail");
                }
            }
        }
    }
    #n = dllfunc("UnlockSelection", 1);
    message str(#cCompressed) + "個の添付ファイルを圧縮しました。";
    #n = dllfunc("FreeZipDll");
    endmacro;

[ ]