受信メールの添付ファイルの自動保存出来No.07586
nana20210121 さん 21/01/21 10:37
 
受信メールに添付されたファイルを自動的に決まったフォルダに保存することは出来
ないでしょうか?

毎日大量のPDFファイルが届きます。
半数は不要なものですが、ビューワーで開くまで判別できません。

自動的に保存するマクロが有れば紹介して頂けませんか?
無ければ作り方のヒントだけでも教えて頂けないでしょうか?

ファイルの種類はpdf限定でもok(全ての種類でもok)
保存先はマクロ内で決め打ちでもok
メールはそのままで添付ファイルのコピーを保存したい

宜しくお願い申し上げます。

[ ]
RE:07586 受信メールの添付ファイルの自動No.07589
秀まるお2 さん 21/01/21 11:54
 
 受信したメールの添付ファイルをとにかくすべて特定フォルダに保存する、という
マクロなら以前作ったことがありました。

    https://log.maruo.co.jp/hidesoft/hidesoft_8/x07329.html

 上記マクロはpdfファイルじゃなくてもなんでも保存する物でした。

 今改めてpdfファイルのみで保存するマクロを作り直しました。

-----------------------------------------------------------------------
    $destfolder = "c:\\data";
    loaddll "tkinfo.dll";
    $prevaccount = dllfuncstr("CurrentAccount");
    $prevfolder = dllfuncstr("CurrentFolder");
    while( dllfunc( "SelectRecvMail" ) ) {
        #count = dllfunc("CountCurrentHeader", "X-Attach");
        if( #count > 0 ) {
            #i = 0;
            while( #i < #count ) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                if( dllfuncstr("ToLower", rightstr($attach,4)) == ".pdf" ) {
                    $src = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccoun
t") + "\\" + $attach;
                    $basename = midstr( $attach, strrstr($attach, "\\") + 1 );
                    $dest = $destfolder + "\\" + $basename;
                    #nLabel = 1;
                    while( existfile($dest) ) {
                        #nLabel = #nLabel + 1;
                        $dest = $destfolder + "\\" + leftstr( $basename, str
len($basename) - 4 ) + "(" + str(#nLabel) + ").pdf";
                    }
                    #n = dllfunc("Bypass_CopyFile", $src, $dest, 0 );
                    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x20 );
                }
                #i = #i + 1;
            }
        }
    }
    #n = dllfunc("SelectFolder", $prevaccount, $prevfolder);
-----------------------------------------------------------------------

 1行目が保存先フォルダの指定になりまして、そこは好きなように書き換えてもら
う必要があります。「\」は「\\」と書く必要があります。

 このマクロを「マクロ・マクロ登録...」の「自動起動」の「受信が一段落した
時」に登録するような形になります。

 どうでしょうか。自分から自分にpdfファイル付きメールを送って受信してってや
れば動作確認が出来ると思います。

[ ]
RE:07589 受信メールの添付ファイルの自動No.07594
nana20210121 さん 21/01/21 14:13
 
秀まるお2 様
ありがとうございました。
動作確認致しました。
完璧です
ファイル名の重複時の対策までして頂き、本当にありがとうございました。


[ ]
RE:07589 受信メールの添付ファイルの自動No.07630
Aja さん 21/01/28 21:50
 
私も以前から同様のマクロが欲しいと思っていました。
マクロの知識がないので、どこを変えれば良いのか解りません。

・メール新着時に保存
・全てのファイルを同じフォルダに保存
・サブフォルダを作らずに保存
・同名ファイルは新しければ上書き

という条件にしたいのですが。

[ ]
RE:07630 受信メールの添付ファイルの自動No.07632
秀まるお2 さん 21/01/29 08:47
 
> ・メール新着時に保存
> ・全てのファイルを同じフォルダに保存
> ・サブフォルダを作らずに保存

 これは既にそのようになってます。

> ・同名ファイルは新しければ上書き

 以下の6行を単純に削除するだけでいいです。

-------------------------------------------------------------------
                    #nLabel = 1;
                    while( existfile($dest) ) {
                        #nLabel = #nLabel + 1;
                        $dest = $destfolder + "\\" + leftstr( $basename, str
len($basename) - 4 ) + "(" + str(#nLabel) + ").pdf";
                    }
-------------------------------------------------------------------

 他にマクロの中でいじる所としては、1行目の

    $destfolder = "c:\\data";

 の所だけで大丈夫なはずだと思います。

 「マクロ・マクロ登録...」の「自動起動」ページの中の「受信が一段落した時」
に登録しておけば、新着メールを受信する度にマクロが自動実行されて添付ファイル
が保存されるはずになります。

[ ]
RE:07632 受信メールの添付ファイルの自動No.07636
Aja さん 21/01/29 16:22
 
何とか思うとおりに保存できました。
ありがとうございました。

○$destfolder = "c:\\data";については、全角文字のフォルダではうまくいきませ
んでした。

○PDF以外も保存したいので、関連するif文を削除しました。

 残るは、添付ファイルの日付です。オリジナルと同じにするには、送信側と受信側
で設定すれば可能なのでしょうか?

[ ]
RE:07636 受信メールの添付ファイルの自動No.07638
秀まるお2 さん 21/01/29 16:48
 
> ○$destfolder = "c:\\data";については、全角文字のフォルダではうまくいきま
>せんでした。

 それはなぜだかちょっと分かりませんが、試しに僕の所で

   c:\データ

 ってフォルダを作ってマクロの1行目を

    $destfolder = "c:\\データ";

 とした限りはうまく保存するようでした。

> ○PDF以外も保存したいので、関連するif文を削除しました。

 失礼しました。たしかに".pdf"と比較してるif分とそれに対応する「}」の行を削
除しないといけないです。

>  残るは、添付ファイルの日付です。オリジナルと同じにするには、送信側と受信
>側で設定すれば可能なのでしょうか?

 Bypass_CopyFile関数でファイルをコピーしてますが、その方法でコピーすると、
秀丸メールのメールデータ上にあるファイルと更新日時などはまったく同じになるは
ずです。

 もしかしてメールのDate:ヘッダと同じ日時にしたいってことだとしたら、「全般
的な設定・上級者向け・デコード・添付ファイル」の中にある「受信した添付ファイ
ルの更新日時をDate:ヘッダと同じにする」ってオプションをONにしておけばいいは
ずです。そうすればコピー元のファイルの更新日時がDate:と同じになるので、Bypas
_CopyFileでコピーされたファイルもその日時になるはずです。

[ ]
RE:07638 受信メールの添付ファイルの自動No.07639
秀まるお2 さん 21/01/29 16:58
 
>  残るは、添付ファイルの日付です。オリジナルと同じにするには、送信側と受信
>側で設定すれば可能なのでしょうか?

 もしかして、送信する側での添付ファイルの日時と同じにしたいってことでしたら、
すみませんがそれは仕組み上不可になります。

 インターネットのメールの仕組みとして、添付ファイルの日時は伝達してないです。
なのでオリジナル(送信側)の添付ファイル日時は受信側では分かりません。

[ ]
RE:07638 受信メールの添付ファイルの自動No.07641
Aja さん 21/01/29 17:29
 
このマクロでは、"d:\\添付ファイル"も"d:\添付ファイル"もダメでした。
別のマクロでは、なぜか、"d:\添付ファイル"で保存できました。

日付については、ハードディスクに保存しているファイルの日付がメールで送って保
存すると変わるのが困るという意味です。

ご指摘のチェックが入っていないのに、保存ファイルの日付がメール一覧Dateの日付
になっているようです。

[ ]
RE:07641 受信メールの添付ファイルの自動No.07642
秀まるお2 さん 21/01/29 18:28
 
> このマクロでは、"d:\\添付ファイル"も"d:\添付ファイル"もダメでした。

 一応、僕の所で

    $destfolder = "D:\\添付ファイル";

 でテストした限りは大丈夫なようではありました。

 ちょっとそれ以上は分かりません。

> 日付については、ハードディスクに保存しているファイルの日付がメールで送って
>保存すると変わるのが困るという意味です。

 メールを送る時の話でしょうか。ちょっと状況がよく分からないのですみません
が・・・。

 メールを送る時に何か添付ファイルを付けたとして、その添付ファイルの更新日時
が勝手に変わってしまうということは、一応無いはずだと思います。

 たとえばこちらで簡単にテストした例として、

 1.C:\dataフォルダに「aaa.txt」ファイルがあって、その更新日時が
   2010年になってる。
 2.「新規メール」として、そこにaaa.txtファイルをドラッグドロップ
   で添付して送った。
 3.その後「c:\data」フォルダにあるaaa.txtファイルの更新日時を
   確認すると、2010年のままで特に変化は無い。

 という感じです。

 「メールで送って保存する」っていうことは、送った後に何か「保存」に相当する
操作をされた場合ということなのやら?。もしかし自分から自分に添付ファイルを送
って、それで届いたファイルの更新日時が元の日付と違ってしまうってことだとした
ら、それは回避不能です。(メールの仕組み的に)

[ ]
RE:07642 受信メールの添付ファイルの自動No.07643
Aja さん 21/01/29 19:39
 
お手数をお掛けしました。

日付は、ファイルに情報があるのではなく、記録された媒体にしかないので、メール
というDOSを介さず転送する場合は、引き継ぎようがないということなのですね。

そのため、同名ファイルは上書きせず、番号を付加していくことが安全という訳です
ね。

大きな勘違いをしていました。

[ ]
RE:07638 受信メールの添付ファイルの自動No.07660
Aja さん 21/02/01 20:06
 
おかげさまで、全ファイルの自動保存が順調にできていますが、2点解らないことが
あります。

○指定フォルダに『smime.p7s』というファイルが保存されるようになったみたいで
す、これは何でしょうか。

○添付ファイルが自動保存されると、未読が既読になるようで、設定で自動保存して
も未読を保持できないでしょうか。

初歩的な質問で申し訳ありません。宜しくお願い致します。

[ ]
RE:07660 受信メールの添付ファイルの自動No.07663
秀まるお2 さん 21/02/02 09:32
 
> ○指定フォルダに『smime.p7s』というファイルが保存されるようになったみたい
>です、これは何でしょうか。

 これは、いわゆる「電子署名」がされたメールでの、電子署名についての情報を覚
えてるファイルになります。他のメールソフトだと添付ファイルとして出てこない物
も多いんですが、秀丸メールの場合はすみませんが添付ファイルとして出てきてしま
います。

 電子署名付きのメールは、たとえば三井住友銀行からのメールとか、信用を必要と
するメールについてることが多いです。個人でも電子証明書を購入して付けることも
出来ます。

 電子署名付きメールをの電子署名を検証するには「編集」メニューの「暗号の複合
/署名の検証」コマンドを実行します。

 この添付ファイルが保存不要であれば、

                if( dllfuncstr("ToLower", rightstr($attach,4)) == ".p7s" ) {

 みたいな判定を入れて保存しないようにすればいいと思います。

> ○添付ファイルが自動保存されると、未読が既読になるようで、設定で自動保存し
>ても未読を保持できないでしょうか。

 たぶんですが、「全般的な設定・未読メールの閲覧」ページにある「未読から既読
への自動切り替え」の中の、たぶん「メールを最後まで表示したら」辺りがONになっ
てるせいだと思います。

 とりあえずはそこの設定をOFFにしていただくしか回避策無さそうな気がします。

 マクロでなんとかするとしたら、既読になったら未読にする、みたいな制御をした
らいいかと思います。サンプルマクロ提示します。


    $destfolder = "D:\\添付ファイル";
    loaddll "tkinfo.dll";
    $prevaccount = dllfuncstr("CurrentAccount");
    $prevfolder = dllfuncstr("CurrentFolder");
    while( dllfunc( "SelectRecvMail" ) ) {
        #count = dllfunc("CountCurrentHeader", "X-Attach");
        if( #count > 0 ) {
            #i = 0;
            while( #i < #count ) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                if( dllfuncstr("ToLower", rightstr($attach,4)) == ".p7s" ) {
                    //スキップ
                } else {
                    $src = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccoun
t") + "\\" + $attach;
                    $basename = midstr( $attach, strrstr($attach, "\\") + 1 );
                    $dest = $destfolder + "\\" + $basename;
                    #n = dllfunc("Bypass_CopyFile", $src, $dest, 0 );
                    #n = dllfunc("Bypass_SetFileAttributes", $dest, 0x20 );
                }
                #i = #i + 1;
            }
        }
        if( ! dllfunc("IsUnread") ) {
            #n = dllfunc("SwitchUnread");
        }
    }
    #n = dllfunc("SelectFolder", $prevaccount, $prevfolder);

[ ]
RE:07663 受信メールの添付ファイルの自動No.07664
秀まるお2 さん 21/02/02 09:39
 
 SelectRecvMailまたはSelectRecvMailInFolder関数呼び出しで未読メールが既読に
切り替わってしまうのはちょっと良くないので、次のベータ版では既読にならない仕
様に変更させていただきます。

[ ]
RE:07663 受信メールの添付ファイルの自動No.07670
Aja さん 21/02/02 19:37
 
サンプルマクロで上手く動きました。
ありがとうございました。

相変わらず全角のフォルダではうまく保存されません。
会社のoutlookに全角zipファイルが添付されていると文字化けする場合があり、wind
owsの更新により影響を受けているようでした。

当方のwindowsは20H2にしています。



[ ]
RE:07670 受信メールの添付ファイルの自動No.07674
秀まるお2 さん 21/02/03 09:51
 
> 相変わらず全角のフォルダではうまく保存されません。
> 会社のoutlookに全角zipファイルが添付されていると文字化けする場合があり、wi
>ndowsの更新により影響を受けているようでした。

 何かネットワークドライブ上に保存しようとしてって話なのでしょうか。何か他に
再現の条件があるのかなぁと思います。

 しいて、追求するとしたら、何か適当なファイルをあらかじめ用意した上で、マク
ロでファイルのコピーをしてうまく動くかどうかテストしてみる手はあります。

 たとえば「c:\テスト\テスト.txt」ってファイルを用意した上で、それを「c:\添
付ファイル」フォルダにコピーする例だとしたら、

    loaddll "tkinfo.dll";
    #n = dllfunc("Bypass_CopyFile", "C:\\テスト\\テスト.txt", "c:\\添付ファ
イル\\テスト.txt", 0 );
    if( #n == 0 ) {
        #error = dllfunc("Bypass_GetLastError");
        message "エラー、エラーコード=" + str(#error);
    } else {
        message "成功";
    }

 みたいなマクロで試してみるとか。

 僕の所では成功します。

 たとえばCドライブなら成功するけどDドライブ(ネットワークドライブ?)だと失
敗するとかなら、Dドライブが原因なんだろうと想像できます。

[ ]
RE:07674 受信メールの添付ファイルの自動No.07682
Aja さん 21/02/03 20:07
 
作って頂いたマクロのおかげで原因が解りました。

マクロファイルのエンコードを日本語にしたら大丈夫みたいです。
お手数をお掛けしました。

[ ]
RE:07682 受信メールの添付ファイルの自動No.07685
秀まるお2 さん 21/02/04 09:50
 
 マクロをutf-8で作成されるとダメみたいですが、最新版の秀丸メール(というか
秀丸エディタ相当部分)だとShift-JIS的におかしな文字があるケースに限ってはエ
ラーメッセージを出すようになってて、それでユーザーさんに気づいてもらえるよう
でした。

 (秀丸エディタ側にそんな機能追加されてるとは知らず、でしたが)


[ ]