エクスポートについて。No.02742
エイト さん 01/08/21 00:09
 
 鶴亀メールにはいつも大変お世話になっております。
1点だけ要望が有ります。
もし既に実現できているならばやり方を教えて下さい。
 受信メールを、subject名+".eml"の形式で1ファイルづつ
且つ手早くエクスポートしたいのですが、今の鶴亀では
"ログをOutlook Explessで開く"を選択し、outlookから
"名前を付けて保存する"のが最速かなと思ってます。
 しかし、複数メールを一度に処理できず、またできるなら
鶴亀の機能だけで実現できたらベストと思ってます。
 "他メーラーへのエクスポート"では、作られるファイル名が
"ExportXXXX"になってしまうこともあり、大変失礼ながら
満足できる機能ではありません。
 以上です。
 すいませんが、どうかよろしくお願い致します。

[ ]
RE:02742 エクスポートについて。No.02752
ひろ さん 01/08/21 12:44
 
 エイトさん今日は、ひろです。
>  受信メールを、subject名+".eml"の形式で1ファイルづつ
> 且つ手早くエクスポートしたいのですが、今の鶴亀では
 ファイル名が重なってしまう場合にどの様な処理を為ればよいか解れば、
マクロで可能だと思います。それでよろしければ、処理方法を教えて下さい。

[ ]
RE:02742 エクスポートについて。No.02754
秀まるお2 さん 01/08/21 12:52
 
 斉藤秀夫です。

>  "他メーラーへのエクスポート"では、作られるファイル名が
> "ExportXXXX"になってしまうこともあり、大変失礼ながら
> 満足できる機能ではありません。

 んじゃ、なるべくSubject:を使うように修正しようかなぁと…。

 要望リストに入れておきます。

[ ]
RE:02754 エクスポートについて。No.02756
Kengo さん 01/08/21 13:35
 
私も、マクロなり他のツール(perlとかawkとか)で処理できる
ことだとは思うのですが、

> >  "他メーラーへのエクスポート"では、作られるファイル名が
> > "ExportXXXX"になってしまうこともあり、大変失礼ながら
> > 満足できる機能ではありません。
>
>  んじゃ、なるべくSubject:を使うように修正しようかなぁと…。

もし鶴亀メールで対応するのなら、オプションで
・ExportXXXX.emlというファイル名にする
・なるべくSubject:を使ったファイル名にする
を選べるとありがたいです。

#"Export"じゃなくてもいいですけど、ファイル名の
#頭が揃っている方が(私は)いいです。

[ ]
RE:02754 エクスポートについて。No.02765
エイト さん 01/08/21 23:35
 
 お世話になっております。みなさん返答ありがとうございました。

> ファイル名が重なってしまう場合にどの様な処理を為ればよいか解れば
> マクロで可能だと思います。
>
 上記以外にも、例えばファイル名として使用禁止記号もあるので
それらがsubjectに含まれるメールの場合の変換ルール
(例えば、全て一律半角スペースにする)が別途必要だと思われます。
 subjectが等しい場合のファイル名変換は、例えば、subjectが"abc"の
メール2通の場合、outlookでエクスポートすると"abc.eml abc(1).eml"に
なりました。Beckyでは、"abc.eml abc1.eml"に変換されました。
 尚、異なるフォルダにエクスポートした場合は、この変換ルールに
当てはまりませんでした。

> ・ExportXXXX.emlというファイル名にする
> ・なるべくSubject:を使ったファイル名にする
> を選べるとありがたいです。
>
 上記、私も賛成です。

 以上です。どうぞよろしくお願い致します。

[ ]
RE:02765 エクスポートについて。No.02768
ひろ さん 01/08/22 12:48
 
 エイトさん今日は、ひろです。
>  上記以外にも、例えばファイル名として使用禁止記号もあるので
 これについては全て全角にするつもりでした。

>  subjectが等しい場合のファイル名変換は、例えば、subjectが"abc"の
> メール2通の場合、outlookでエクスポートすると"abc.eml abc(1).eml"に
> なりました。Beckyでは、"abc.eml abc1.eml"に変換されました。
 それでは後者の方法にします。

>  尚、異なるフォルダにエクスポートした場合は、この変換ルールに
> 当てはまりませんでした。
 DDE や DLL を使用すれば、エクスポート先を選択するようにも出来ます
が、要望一覧にも加えられていることですし、取り敢えず「ホームディレク
トリ」をエクスポート先にします。
 末尾マクロの仕様は、以下のようになっています。
(1)選択しているメールのエクスポート
(2)配下に tmp というフォルダを作成し、マクロで使用するため、マクロ終了
  後 tmp フォルダを削除→既に存在していても全て削除
(3)一旦 tmp にコピーしたメールは「ゴミ箱」に移動
(4)ログをエクスポートしたい場合は、「受信/送信ログ」フォルダで実行
→ログを開く DLL 関数は今後必要になるのかな?->All
//--------------------- export.mac ----------------------------------
loaddll "tkinfo.dll";
#num = dllfunc("DisableDraw",1);
if(!dllfunc("MakeFolder","tmp"))goto DllError;
$tmp = dllfuncstr("CurrentFolder") + "\\tmp";
if(!dllfunc("Copy","",$tmp))goto DllError;
if(!dllfunc("SelectFolder","",$tmp))goto DllError;
if(!dllfunc("SetThreadView", 0))goto DllError;
if(!dllfunc("SetViewArea", 0))goto DllError;
#header = dllfunc("HeaderView");
#num = dllfunc("SwitchHeaderView",2);
#num = dllfunc("MailCountAll");
if(!dllfunc("SetMailIndex", 0))goto DllError;
#i = 0;
while(#i<#num){
  $$return = dllfuncstr("CurrentHeader","Subject");
  call ChangeCharacter $$return,"\\","¥";
  call ChangeCharacter $$return,"/","/";
  call ChangeCharacter $$return,":",":";
  call ChangeCharacter $$return,";",";";
  call ChangeCharacter $$return,"*","*";
  call ChangeCharacter $$return,"?","?";
  call ChangeCharacter $$return,"<","<";
  call ChangeCharacter $$return,">",">";
  call ChangeCharacter $$return,"|","|";
  call ChangeCharacter $$return,"\"","”";
  #j = 1;
  $$return = dllfuncstr("HomeDir") + $$return;
  $file = $$return + ".eml";
  while(1){
    if(!existfile($file))break;
    $file = $$return + str(#j) + ".eml";
    #j = #j + 1;
  }
  saveas $file;
  #i = #i + 1;
  if(!dllfunc("Move","","ゴミ箱"))goto DllError;
}
if(!dllfunc("DeleteFolder",$tmp))goto DllError;
#num = dllfunc("SwitchHeaderView",#header);
#num = dllfunc("EnableDraw");
goto End;

DllError:
  message "Dll 関数失敗";

End:
  freedll;
  endmacro;

ChangeCharacter://buff 中の文字列を置換
  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##long = strlen($$1);
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

[ ]
RE:02768 エクスポートについて。No.02780
エイト さん 01/08/22 23:34
 
 お世話になっております、返答ありがとうございました。
 早速マクロを試めさせていただきました。
 しかし、残念ながら下記2点が実現されてませんでした。
 (というか、こちらも指摘してませんでしたので、当然ですね)
・エンコード
・添付ファイル出力

 提供していただいたマクロから、稚拙ながら独自に調査
しましたが、上記2点を満たす関数は無いように思われます。
 せっかく作成していただいたのに、すいません。

 以上です。ありがとうございました。

[ ]
RE:02780 エクスポートについて。No.02787
ひろ さん 01/08/23 12:05
 
 エイトさん今日は、ひろです。
> ・エンコード
 こちらはどちらの意味でしょう。
(1)メールを元の文字コードで保存
  鶴亀がサポートしていない文字コードの場合どうするか?
(2)ログを探して保存
  a.ログがない場合どうするか?
  b.MUA や MTA の問題で Message-ID がユニークでない場合、別のメールを
  保存してしまう場合が有る (DLL 関数で「このメールのログ」が無いため、
  文字列一致を使わざる得ない)

> ・添付ファイル出力
 これは添付ファイルが削除されていなければ、デコードしたファイルを取
り出すことは可能です。ただし、ファイル名が重なる可能性についてどうす
るか?
(1)鶴亀のように予め重ならないようにフォルダを作成
(2)先のメール本文の保存のように、連番にする。
また X-Attach ヘッダを表示していない場合、どの様にするか?

 これらのことが解らないと、マクロは作れません。ただこんなことをやっ
てる間に鶴亀でサポートされたりして。

[ ]
RE:02787 エクスポートについて。No.02847
エイト さん 01/08/30 19:39
 
ひろさん、返答がおくれてしまいすいません。
> ・エンコード
> ・添付ファイル出力
上記機能に対し、それほど深く考慮しておりませんでした。
ただ、"他メーラーへのエクスポート"内の"エンコードする"と
"添付ファイルも出力する"両チェックボックスがONに
なっている状態でのeml形式でファイルが作成されることを
希望しております。
もしマクロで可能であれば、どうかよろしくお願い致します。

[ ]
RE:02847 エクスポートについて。No.02852
ひろ さん 01/08/31 00:33
 
 エイトさん今日は、ひろです。
> ただ、"他メーラーへのエクスポート"内の"エンコードする"と
> "添付ファイルも出力する"両チェックボックスがONに
> なっている状態でのeml形式でファイルが作成されることを
> 希望しております。
 これはエクスポートを実現するのは、外部ツールを利用するにしても、
ちょっと面倒臭いです。ただし替わりにログを保存する形にすれば、ほぼ同
様の事が出来ます。そこで前回もかいたのですが、
a.ログがない場合どうするか?
b.MUA や MTA の問題で、確率は低いが Message-ID がユニークでない場合、
 別のメールを保存してしまう場合が有るが良いか?
の回答を頂ければ、マクロを作成します。

[ ]
RE:02847 エクスポートについて。No.02853
Kengo さん 01/08/31 12:28
 
> ただ、"他メーラーへのエクスポート"内の"エンコードする"と
> "添付ファイルも出力する"両チェックボックスがONに
> なっている状態でのeml形式でファイルが作成されることを
> 希望しております。

マクロじゃないんですが、awkとnkfで作ってみました。

gawk32
Gnu Awk (gawk) 2.15, patchlevel 4 + multi-byte extension 1.03

nkf32
Network Kanji Filter Version 1.7 (0/9711/Shinji Kono) for Win32
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),1998 S. Kono, COW

で動作確認しています。どちらもベクターあたりにあると思います。

[使い方]
1)末尾のawkスクリプトを適当な名前(例えばeml.awk)で保存する
2)鶴亀メールで、エクスポートしたいファイルを選んで、
 1メール1ファイル形式でエクスポートする
 ・エンコードする
 ・添付ファイルも出力する
 を選択しても(しなくても)可。
 c:\tmp\eml にエクスポートしたとします。
3)MS-DOSプロンプトを開いて、
 > gawk -f eml.awk c:\tmp\eml\
 を実行する。
 パス名の末尾の'\'は必要です。
4)Subject:を使ったファイル名にリネームされる。

インストールの仕方がよくわからなければ、
eml.awk
gawk.exe
nkf32.exe
をすべてc:\tmp\emlに格納し、
MS-DOSプロンプトを開いて
 > cd c:\tmp\eml
 > gawk -f eml.awk .\
とでもすればいいでしょう。

[注意点]
ファイル名の長さは考慮していません。とても長いSubject:
(200byte以上とか)だと失敗するかもしれません。

#nkfを使わず、自力でデコードするバージョンも書いてみましたが、
#とてもマニアックなのでやめました。

#### ここから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]/ {
    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 "\"";
#       ccc = "copy \"" org "\" \"" file "\"";
        print ccc;
        system( ccc );
    }
}

# メールを解析して、Subject:を返す
function    ParseFile( file,   subject, s, t, flag, cmd ) {
    subject = "";
    # デコードしてtemp2_fileに出力
    cmd = sprintf( "nkf32 -s \"%s\" > \"%s\"", file, temp2_file );
    system( cmd );
    # それを読み込む
    flag = FALSE;
    while( ( getline s < temp2_file ) > 0 ) {
        if( s ~ /^$/ ) {
            break;  # ヘッダ終わり
        }
        if( s ~ /^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:/ ) {
            flag = TRUE;
            subject = subject ChopSubject( s );
            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 );
    }
}

[ ]
RE:02853 エクスポートについて。No.02965
米田 さん 01/09/08 15:57
 
>マクロじゃないんですが、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 );
    }
}

[ ]