|
>マクロじゃないんですが、awkとnkfで作ってみました。
Kengoさん、ありがとうございます。
私も元記事の方と同じくSubjectをファイル名にしたかったので
早速、使わさせていただきました。
ただ、ファイルの日付がエクスポートした日になっているので
ファイル名に日付を付ける様に改造しました。
(要望リストに上がっているようですが、エクスポートのファイル名形式が選べる様
になるといいのですが・・・)
ファイル名はこんな感じになります。
"010907 さぶじぇくと.eml"
"010907 さぶじぇくと(1).eml"
"010908 さぶじぇくと.eml"
"010908 さぶじぇくと(1).eml"
"010908 thank you.eml"
(エクスポートする際に日付順に並べてファイルを選択しておいた方がいいです)
===はじめてawkのスクリプトをさわったので見苦しいのですが、ご容赦を。
===以降が改変したソースです。
BEGIN {
TRUE = (1==1);
FALSE = !TRUE;
if( ARGC > 1 ) {
path = ARGV[1];
} else {
path = "";
exit;
}
# 一時ファイル
temp1_file = path "temp1.$$$";
temp2_file = path "temp2.$$$";
# 対象となるファイルの一覧を作る
cmd = "dir /on \"" path "Export*.eml\" > \"" temp1_file "\"";
system( cmd );
# それを読み込ませる
ARGV[1] = temp1_file;
}
# /^[Ee][Xx][Pp][Oo][Rr][Tt]/ {
/[Ee][Xx][Pp][Oo][Rr][Tt]/ { # yone
if( match( $0, /[Ee][Xx][Pp][Oo][Rr][Tt][0-9]+[.][Ee][Mm][Ll]$/ ) ) {
# 元のファイル名
org = path substr( $0, RSTART, RLENGTH );
# Subjectを取得してファイル名を決める
subject = ParseFile( org );
if( subject == "" ) {
subject = org;
gsub( /[.][Ee][Mm][Ll]$/, "", subject );
}
name = ConvChar( subject );
# 名前が重複してないかチェックする
i = 1;
base = name ".eml";
file = path base;
while( TRUE ) {
if( ( getline t < file ) < 0 ) {
break; # この名前にする
}
close( file );
# 重複なので"(#)"を加える
base = name sprintf( "(%d)", i++ ) ".eml";
file = path base;
}
# リネームする
ccc = "ren \"" org "\" \"" base "\"";
print ccc;
system( ccc );
}
}
# メールを解析して、Subject:を返す
function ParseFile( file, subject, s, t, flag, cmd ) {
subject = "";
dt = ""; # yone
# デコードしてtemp2_fileに出力
cmd = sprintf( "nkf32 -s \"%s\" > \"%s\"", file, temp2_file );
system( cmd );
# それを読み込む
flag = FALSE;
while( ( getline s < temp2_file ) > 0 ) {
if( s ~ /^$/ ) {
break; # ヘッダ終わり
}
# yone start
if( s ~ /^[Dd][Aa][Tt][Ee]:/ ) {
split(s, ss);
y = ss[5];
y = substr(y,length(y)-2+1,2); # 年2桁
m = index("Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec", ss
[4]);
m = (m-1) / 4 + 1;
d = ss[3];
dt = sprintf("%02d%02d%02d ", y, m, d);
}
# yone end
if( s ~ /^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:/ ) {
flag = TRUE;
# subject = subject ChopSubject( s );
subject = dt subject ChopSubject( s ); # yone
continue;
}
if( flag && ( s ~ /^[\t ]/ ) ) {
subject = subject ChopSubject( s );
}
if( flag && ( s ~ /^[^\t ]/ ) ) {
flag = FALSE;
break; # Subject 終わり
}
}
close( temp2_file );
return subject;
}
# Subject:の整形
function ChopSubject( str ) {
# /^Subject:/を削除
gsub( /^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:/, "", str );
# 行頭のホワイトスペースを削除
gsub( /^[\t ]+/, "", str );
return str;
}
# ファイル名として使えない文字を置換する
function ConvChar( name ) {
gsub( /\\/, "¥", name );
gsub( /[/]/, "/", name );
gsub( /:/, ":", name );
gsub( /;/, ";", name );
gsub( /[*]/, "*", name );
gsub( /[?]/, "?", name );
gsub( /[<]/, "<", name );
gsub( /[>]/, ">", name );
gsub( /[|]/, "|", name );
gsub( /["]/, "”", name );
return name;
}
END {
if( path != "" ) {
cmd = "del \"" temp1_file "\" > nul";
system( cmd );
cmd = "del \"" temp2_file "\" > nul";
system( cmd );
}
}
|
|