添付ファイルを取り出すマクロNo.02220
アレス さん 17/10/13 11:31
 

いつもお世話になります。

以下の様な条件で添付ファイルを取り出す方法を教えてください

1.対象メールはアカウント内の振り分け用フォルダに振り分けている
2.一旦一時フォルダに保存
3.zip圧縮されているものがあれば一時フォルダ内で展開
4.圧縮ファイルは複数あり
5.最終保存先フォルダの下にメールタイトルでフォルダを作成し、そこに移動
6.一時ファイルを削除

この処理を指定フォルダ内のメールに対して行うマクロをどんな感じで作ればよいか
教えてください。

よろしくお願いします。

[ ]
RE:02220 添付ファイルを取り出すマクロNo.02222
秀まるお2 さん 17/10/13 14:09
 
 まず、うちのライブラリにある「添付ファイル収集」のマクロがあるのでそれ
をお勧めしたいです。

    http://hide.maruo.co.jp/lib/tkmacro/attachcollector010.html

 これを使って収集だけは簡単に出来ると思います。

 問題は・・・

> 3.zip圧縮されているものがあれば一時フォルダ内で展開
> 4.圧縮ファイルは複数あり
> 5.最終保存先フォルダの下にメールタイトルでフォルダを作成し、そこに移動
> 6.一時ファイルを削除

 ちょっと、要求されてるレベルが高いので、簡単に「こんなマクロで」って形
でお返事できる感じにはならないです。

 とりあえず、zip形式の物があれば、何らかの解凍ツールをコマンドラインで
起動して解凍させる、くらいのことなら簡単に出来ると思うので、そういう作戦
でトライしてみたらどうかと思います。

 うまくいかないようでしたら・・・

 添付ファイルを収集しつつ、zipファイルなら解凍して、くらいのマクロなら
作って差し上げてもいいかなぁとは思います。

[ ]
RE:02222 添付ファイルを取り出すマクロNo.02223
秀まるお2 さん 17/10/13 14:46
 
 とりあえず簡単な例で、添付ファイルを特定フォルダ(e:\temp)に保存しつつ、z
ipだったら7-Zipで解凍した結果を保存する、みたいなマクロの例だけ作ってみました。

    $destdir = "e:\\temp";

    loaddll "tkinfo.dll";
    #n = dllfunc("SetJapaneseCodePageMode", 1);
    #mailcount = dllfunc("MailCountAll");
    if( #mailcount != dllfunc("MailCount") ) {
        message "メール一覧の「範囲」を「全体」にしてからマクロ実行してくだ
さい。";
        endmacro;
    }
    if( dllfunc("IsThreadView") != 0 ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #mailindex = 0;
    while( #mailindex < #mailcount ) {
        #n = dllfunc("SetMailIndex", #mailindex);
        if( #n == 0 ) {
            message "メールの選択に失敗 index=" + str(#mailindex);
            endmacro;
        }
        #attachcount = dllfunc("CountCurrentHeader", "X-Attach:");
        #attachindex = 0;
        while( #attachindex < #attachcount ) {
            $attach = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount")
                    + "\\" + dllfuncstr("CurrentHeader2", "X-Attach:", #atta
chindex);
            $attachbasename = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            //message $attachbasename;
            $zipext = dllfuncstr("ToLower", rightstr( $attach, 4 ));
            //message $zipext;
            if( $zipext == ".zip" ) {
                //message "\"C:\\Program files\\7-Zip\\7z.exe\" e -y \"" + $
attach;
                runex "\"C:\\Program files\\7-Zip\\7z.exe\" e -y \"" + $atta
ch + "\""
                        , 1
                        , 0, ""
                        , 0, ""
                        , 0, ""
                        , 2, $destdir
                        , 0
                        , 0
                        , 0;
            } else {
                $destfile = $destdir + "\\" + $attachbasename;
                //message $destfile;
                #n = dllfunc("Bypass_CopyFile", $attach, $destfile, 0);
            }
            #attachindex = #attachindex + 1;
        }
        #mailindex = #mailindex + 1;
    }

[ ]
RE:02223 添付ファイルを取り出すマクロNo.02235
アレス さん 17/10/16 13:23
 
アレスです。

ありがとうございました。
添付ファイルとZip解凍できただけで作業が楽になりました。
サブフォルダはどっちみち、手作業が必要になりますのでがんばります。

ちなみに下記のように7zipを呼び出している書式で、フォルダを作成するバッチファ
イルを呼び出してみたのですが、うまく動きませんでした。

$Subject = dllfuncstr( "CurrentHeader", "Subject" );
runex "\"F:\\temp\\fldmake.bat " + $Subject;

fldmake.bat
f:
cd \temp
if not exist %1 md %1

もしお時間がありましたら、後学のために教えてください。

[ ]
RE:02235 添付ファイルを取り出すマクロNo.02236
秀まるお2 さん 17/10/16 15:04
 
    $Subject = dllfuncstr( "CurrentHeader", "Subject" );
    runex "\"F:\\temp\\fldmake.bat \"" + $Subject + \";

 としたらいかもしれないですが、ただ、Subject:ヘッダにファイル名に使えな
い文字が混じってたり極端に長かったりするとダメってことはあるかと思います。

 ちょっと隠し機能というか、ヘルプに書いてない関数を使ってしまうんですが、
ValidateForFileNameって関数があって、それを使うとファイル名に使えない文
字を「_」に置き換えてくれるのでそれを使って、さらに長さ制限もして、さら
にはフォルダ作成にはBypass_CreateDirectoryを使うとして、以下のようなサン
プルマクロを作ってみました。

 loaddll "tkinfo.dll";
    $Subject = dllfuncstr("CurrentHeader", "Subject");
    $Subject = dllfuncstr("ValidateForFileName", $Subject);
    $Subject = leftstr( $Subject, 100 );
    #n = dllfunc("Bypass_CreateDirectory", "F:\\temp\\" + $Subject);
    if( #n == 0 ) {
        #error = dllfunc("Bypass_GetLastError");
        message "CreateDirectoryでエラー、エラーコード=" + str(#error);
        endmacro;
    }

 こんな感じの処理でどうでしょうか。

[ ]
RE:02235 添付ファイルを取り出すマクロNo.02237
秀まるお2 さん 17/10/16 15:08
 
 既に存在してた場合にエラーになってまってました。

    loaddll "tkinfo.dll";
    $Subject = dllfuncstr("CurrentHeader", "Subject");
    $Subject = dllfuncstr("ValidateForFileName", $Subject);
    $Subject = leftstr( $Subject, 100 );
    $folder = "F:\\temp\\" + $Subject;
    if( !existfile( $folder ) ) {
        #n = dllfunc("Bypass_CreateDirectory", $folder);
        if( #n == 0 ) {
            #error = dllfunc("Bypass_GetLastError");
            message "CreateDirectoryでエラー、エラーコード=" + str(#error);
            endmacro;
        }
    }

 だと大丈夫みたいです。

[ ]
RE:02237 添付ファイルを取り出すマクロNo.02246
アレス さん 17/10/17 17:01
 
秀まるお2様

ありがとうございました。完全に行いたかった処理が実現しました。

後々、どなたかがこれと同じ処理をされたくなった時のために、フォルダ処理を含ん
だものも一体化したマクロファイルを貼り付けておきます。


  $destdir = "f:\\temp";

    loaddll "tkinfo.dll";
    #n = dllfunc("SetJapaneseCodePageMode", 1);
    #mailcount = dllfunc("MailCountAll");
    if( #mailcount != dllfunc("MailCount") ) {
        message "メール一覧の「範囲」を「全体」にしてからマクロ実行してくだ
さい。";
        endmacro;
    }
    if( dllfunc("IsThreadView") != 0 ) {
        #n = dllfunc("SetThreadView", 0);
    }
    #mailindex = 0;
    while( #mailindex < #mailcount ) {
        #n = dllfunc("SetMailIndex", #mailindex);
        if( #n == 0 ) {
            message "メールの選択に失敗 index=" + str(#mailindex);
            endmacro;
        }
        #attachcount = dllfunc("CountCurrentHeader", "X-Attach:");
        #attachindex = 0;
        while( #attachindex < #attachcount ) {
            $attach = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount")
                    + "\\" + dllfuncstr("CurrentHeader2", "X-Attach:", #atta
chindex);
            $attachbasename = midstr( $attach, strrstr( $attach, "\\" ) + 1 );

            //フォルダの作成処理
            $Subject = dllfuncstr("CurrentHeader", "Subject");
            $Subject = dllfuncstr("ValidateForFileName", $Subject);
            $Subject = leftstr( $Subject, 100 );
            $folder = $destdir + "\\" + $Subject;
            if( !existfile( $folder ) ) {
                #n = dllfunc("Bypass_CreateDirectory", $folder);
                    if( #n == 0 ) {
                        #error = dllfunc("Bypass_GetLastError");
                        message "CreateDirectoryでエラー、エラーコード=" + s
tr(#error);
                        endmacro;
                    }
            }

            $zipext = dllfuncstr("ToLower", rightstr( $attach, 4 ));
            //message $zipext;
            if( $zipext == ".zip" ) {
                //message "\"C:\\Tools\\7-Zip\\7z.exe\" e -y \"" + $attach;
                runex "\"C:\\Tools\\7-Zip\\7z.exe\" e -y \"" + $attach + "\""
                        , 1
                        , 0, ""
                        , 0, ""
                        , 0, ""
                        , 2, $folder
                        , 0
                        , 0
                        , 0;
            } else {
                $destfile = $folder + "\\" + $attachbasename;
                //message $destfile;
                #n = dllfunc("Bypass_CopyFile", $attach, $destfile, 0);
            }
            #attachindex = #attachindex + 1;
        }
        #mailindex = #mailindex + 1;
    }


[ ]