|
マクロ作ってみました。これでどうでしょうか。
一応、送信系メールと受信系メールの両方でテストはしました。
jpg、png、zip、lzhなど、圧縮しても意味のない(ファイルサイズが小さくならな
い)物は除外するようにしました。
------------------------------------------------------------
// 添付ファイル圧縮-7zip-Separate.mac by 斉藤秀夫
// 2013.05.28
// 7-zipのダウンロード先: http://sevenzip.sourceforge.jp/
//パスワード付きにする場合はここにパスワードを設定しておく。
//パスワード無しにするなら""を代入する。
//パスワードを毎回入力したい場合は $password = "*"としておく。
//パスワードの中には空白は入れないでください。
//
// 例:
// $password = ""; ... パスワード無し
// $password = "pass"; ... パスワードを"pass"にする。
// $password = "*"; ... パスワードを毎回入力する。
$password = "*";
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 fil
es (x86)\\7-Zip にインストールされてる必要があります。";
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;
}
if( $password == "*" ) {
$password = input( "パスワードは?" );
if( $password == "" ) {
question "パスワード無しにしますか?";
if( result != yes ) {
endmacro;
}
}
}
if( $password != "" ) {
$7zip = $7zip + " -p" + $password;
}
#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"
|| $ext == ".pdf"
|| $ext == ".gif"
|| $ext == ".jpg"
|| $ext == ".png"
|| $ext == ".bin"
) {
#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 = "a \"" + $dest + "\" \"" + $home + $account + "\\" + $attach
+ "\"";
runsync2 $7zip + " " + $cmd;
if( !result ) {
message "7zipの実行に失敗しました。";
endmacro;
}
#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 );
}
}
endmacro;
// 受信したメールの添付ファイルを圧縮する処理。
CompressAll:
#n = dllfunc("LockSelection");
#cCompressed = 0;
#cCompressedMail = 0;
while( dllfunc("EnumSelection", 1) != 0 ) {
#attachcount = dllfunc("CountCurrentHeader", "X-Attach");
if( #attachcount != 0 ) {
#Update = 0;
#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 == ".png"
|| $ext == ".bin"
|| rightstr($attach, 26) == "\\application_pgp-signature"
|| rightstr($attach, 26) == "\\application_pgp-encrypted"
|| rightstr($attach, 25) == "\\application_octet-stream"
) {
// 圧縮しても効果がないので圧縮しない
// PGP関係の添付ファイルも圧縮しない
} else {
$path = $home + $account + "\\" + $attach;
if( dllfunc("Bypass_GetFileSize", $path) >= 256 ) {
// 256バイト以上のファイルなら圧縮する。
$pathLzh = $path + ".zip";
$cmd = "a \"" + $pathLzh + "\" \"" + $path + "\"";
runsync2 $7zip + " " + $cmd;
if( ! existfile( $pathLzh ) ) {
message "Zip圧縮に失敗したようです。スキップしま
す。";
} else {
if( #Update == 0 ) {
#Update = 1;
#n = dllfunc("BeginEditMail");
#cCompressedMail = #cCompressedMail + 1;
}
#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;
}
if( #Update ) {
#n = dllfunc("SaveEditMail", 0);
}
}
}
#n = dllfunc("UnlockSelection", 1);
if( #cCompressedMail == 0 ) {
message "圧縮した添付ファイルはありませんでした。";
} else {
message str(#cCompressedMail) + "通のメールの、 " + str(#cCompresse
d) + "個の添付ファイルを圧縮しました。";
}
endmacro;
|
|