|
すみません。僕が直したのは、送信するメール用の添付ファイルを圧縮する方だけで
した。受信したメールの添付ファイルを圧縮する方が問題だったのですね。
マクロは、修正点がややこしいので全部書きます。
----------------添付ファイル圧縮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;
|
|