Export関数で任意のファイル名で、eml形式No.10319
hutec さん 24/05/04 15:37
 



識者の皆様教えてください。
秀丸メールのマクロ作成ですが、ここで宜しかったでしょうか?
2日前からマクロを作り始た初心者です。

やりたい事
電子帳簿保存法でメールを保存する必要があり、
該当メールを電帳法命名ルールに従ったファイル名にし
本文も添付ファイルも1ファイルのeml形式で保存します。

メール本文中に下記の行があります。
KW:(yyyymmdd_取引先名to当社_伝票名_金額[_サブタイトル])
KW:(〜)の行を探し、ファイル名を括弧内の名称のファイルにしたいです。

eml形式だと、ファイル名が自動生成されますが、
ファイル名を指定する事は出来ないでしょうか?

##n = dllfunc("Export", $base_dir + $$folder, "eml-date", "encode-attach-htm
l", "orikaeshi","truncate");

または、上記の次の行で、生成されたファイル名をRENAMEする関数などありますか?

どうぞ、宜しくお願いします。

[ ]
RE:10319 Export関数で任意のファイル名でNo.10320
秀まるお2 さん 24/05/08 10:46
 
 コメントしてなくてすみません。

 Export関数での"eml-XXXX"形式指定で、さらにファイル名も指定する対応は簡単に
出来ると思うので、それはそれで対応したいと思います。パラメータ2に

    "eml-filename"

 を指定したら、パラメータ1がファイル名になるようにって対応をしようと思いま
す。次のβ版からそうしようと思います。

 とりあえず現在の秀丸メールでなんとかするとしたら、パラメータ2は"hidemarum
ail"にした上で、出力されたファイルの先頭にある1行を削除するような加工をする
作戦があるかなぁと思いました。置換は、grepreplaceを使うのが簡単かと思います。

 例えば、

    loaddll "tkinfo.dll";
    $$filename = "e:\\temp\\test.eml";           //テスト用のファイル名(書
き換え必要)
    $$charset = dllfuncstr("CurrentCharSet");
    ##n = dllfunc("Export", $$filename, "hidemarumail", "encode-attach-html",
 "orikaeshi","truncate");
    if( $$charset == "iso-2022-jp" ) {
        grepreplace "^\\x0C!.*\\n", "", $$filename, ".", regular, jis;
    } else {
        grepreplace "^\\x0C!.*\\n", "", $$filename, ".", regular, utf8;
    }
    ##headerview = dllfunc("HeaderView");
    #n = dllfunc("SwitchHeaderView", ##headerview);

 みたいなマクロでテストしてみてうまくいきました。greplaceする時のエンコード
の指定がちょっとトリッキーなんですが、一応「上記のようなやり方で、日本語の
メールまたはユニコードのメールならうまくいきました。

 grepreplaceした後にSwitchHeaderView呼び出しするのは、grepreplaceした後に置
換結果を表示してしまうのを取り消す用です。

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

 メールは1通だけ選択してる前提にはなります。

[ ]
RE:10320 Export関数で任意のファイル名でNo.10321
hutec さん 24/05/09 11:21
 
秀丸先生、サポート有り難うございます。

>   //#n = dllfunc("SwitchHeaderView", ##headerview);
上記をコメントアウトして実行したところ、下記の様に表示されました。
----------------
1 個のファイルを検索しました。
0 個のファイルを全て置換して、上書き保存しました。
0 個の置換を行ないました。

>パラメータ2は"hidemarumail"にした上で、出力されたファイルの先頭にある1行を
>削除する

1)test.emlを秀丸エディタで開いても、先頭の1行目は見られませんか?
エクスポートしたtest.emlの先頭1行には、何が書かれているのでしょうか?1行目を
削除する理由が解っていません。

>置換は、grepreplaceを使うのが簡単かと思います。
>grepreplace "^\\x0C!.*\\n", "", $$filename, ".", regular, jis;

2)正規表現が良く解っていなくて、色々勉強したのですが、\\x0C!が何を検索してい
るのでしょうか?

お忙しい所申し訳ございませんが、宜しくお願いします。

[ ]
RE:10321 Export関数で任意のファイル名でNo.10322
秀まるお2 さん 24/05/09 14:33
 
 "hidemarumail"形式指定でエクスポートしただけだと、ファイルの先頭にCtrl-Lの
制御文字で始まる余計な1行が入ってしまいます。

> 上記をコメントアウトして実行したところ、下記の様に表示されました。
> ----------------
> 1 個のファイルを検索しました。
> 0 個のファイルを全て置換して、上書き保存しました。
> 0 個の置換を行ないました。

 僕の所だと、「1 個のファイルを全て置換して、上書き保存しました。」のように
なります。「0 個」と出るなら置換してないことになります。

> エクスポートしたtest.emlの先頭1行には、何が書かれているのでしょうか?1行目
>を削除する理由が解っていません。

 秀丸エディタで見ると、1行目の先頭に

   CL

 のような文字が見えると思います。Ctrl-L(16進数で表現すると0x0C)の制御文字
があるはずだと思います。その行はメールの区切り用の行なので、「eml」のファイ
ルとしては不要な物になります。ただ、それがあってもダメってことは無いです。

 もしうまくいかない場合は、とりあえずgrepreplaceは無しでもいいかと思います。

 あと、手元の秀丸メールでExport関数の第2パラメータに"eml-unique"のような指
定をして第1パラメータでファイル名を指定できるようにしています。必要でしたら
今日にでもβ版アップロードしてもいいです。

[ ]
RE:10322 Export関数で任意のファイル名でNo.10323
hutec さん 24/05/09 15:45
 
秀丸先生有り難うございます。

> あと、手元の秀丸メールでExport関数の第2パラメータに"eml-unique"のような指
>定をして第1パラメータでファイル名を指定できるようにしています。必要でしたら
>今日にでもβ版アップロードしてもいいです。

是非、お願いします。

[ ]
RE:10323 Export関数で任意のファイル名でNo.10324
秀まるお2 さん 24/05/09 17:45
 
 今アップロードしました。

32bit版:
https://hide.maruo.co.jp/software/bin3/hmmail732b1_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hmmail732b1_x64_signed.exe

 第2パラメータには"eml-unique"を指定しつつ、第1パラメータはファイル名を指定
すれば大丈夫なはずです。grepreplaceは不要になります。


 テストマクロ:

    loaddll "tkinfo.dll";
    ##n = dllfunc("Export", "c:\\test\\test.eml", "eml-unique", "encode-atta
ch-html", "orikaeshi","truncate");

[ ]
RE:10324 Export関数で任意のファイル名でNo.10325
hutec さん 24/05/10 17:55
 
秀丸先生さま

うまく出来ました、有り難うございます。
フォルダの中のメール全てでは無く、1件づつExportする方法はございますか?
私が勝手に決めた仕様ですが、
メールの中に保存したいファイル名が記載されているので、

受信フォルダの複数メールを、
メールを1件づつ開いて、
ファイル名を抽出して、
そのファイル名でexportしたいです。

何か、サンプルとかご紹介していただければ幸いです。

宜しくお願いします。

[ ]
RE:10325 Export関数で任意のファイル名でNo.10326
秀まるお2 さん 24/05/10 18:37
 
 特定のフォルダのメールすべてをエクスポートするなら、そのフォルダのメールの
数だけSetMailIndexしながらループするようなマクロにすればいいと思います。

 マクロの例としてはこんな感じになります。


    loaddll "tkinfo.dll";
    #n = dllfunc("SetViewArea", 0);  //範囲 = 全体
    #count = dllfunc("MailCount");   //フォルダの中のメールの数
    if( #count == 0 ) {
        endmacro;
    }
    #n = dllfunc("SetThreadView", 0);       //スレッド表示になってるなら一覧
表示にする。
    #i = 0;
    while( #i < #count) {
        #n = dllfunc("SetMailIndex", #i);

        //ここにメールのエクスポートの処理を書く。
        //例:
        $subject = dllfuncstr("CurrentHeader", "Subject");
        $subject = leftstr($subject, 60);
        $subject = dllfuncstr("ValidateForFileName", $subject);
        $date = dllfuncstr("FormatDate", dllfuncstr("CurrentHeader", "Date"),
 "YYYYMMDD");
        $filename = "e:\\temp\\" + $date + "-" + $subject + ".eml";
        #n = dllfunc("Export", $filename, "eml-unique", "encode-attach-html",
 "orikaeshi","");

        #i = #i + 1;
    }

[ ]
RE:10326 Export関数で任意のファイル名でNo.10327
hutec さん 24/05/11 17:49
 
秀丸先生、ご教示有り難うございました。
当然ですが、バッチリでございます。

今更ではございますが、秀丸メールマクロとエディタマクロの使い分けが理解できて
いません。私の様に初心者がつまづくところかと、勝手に思っています。※私はvb,c
しか知りません。

今回の目的
秀丸メールのメール内からキーワードを検索してファイル名にしたい。

1)メールマクロでメール選定を行う。SetMailIndex等。
2)メールを開く。
秀丸エディタが開いたので、ここからは秀丸エディタマクロで操作。
ここで得た値(今回はファイル名)を、何らかの方法でメールマクロ側に渡す。
3)エディタを閉じて、制御をメール側に戻す。
メールマクロで、取得したファイル名でexportする。

それとも、メールマクロだけで全て可能なのでしょうか?

・メールマクロからエディタマクロをcallして、戻り値のやりとりするサンプルなど
あったら教えてください。

エディタマクロの方が関数が多いので、とっつき易いですが・・

どうぞ、宜しくお願いします。

[ ]
RE:10327 Export関数で任意のファイル名でNo.10328
秀まるお2 さん 24/05/12 18:05
 
 今回の目的の処理をするのに、「メールを開く」とか「秀丸エディタで開く」のよ
うな処理はしなくても大丈夫なはずです。秀丸メール本体上でメール内容を表示する
設定(標準の設定、3枠区切り)になってるならそこだけで出来るはずです。

 メール内容枠の中は秀丸エディタ相当の物になってるので、その中で出来ると思い
ます。ただ1つ注意点として、いわゆる文字カーソルが非表示なら表示してから処理
しないといけないです。具体的には、

    if( browsemode ) {
        browsemodeswitch;
    }

 のような処理を入れないとダメです。

 メール本文の中から特定の文字列を取り出すのは、一般的にはsearchdown文で正規
表現パターンを使った検索をすることと、さらには検索でヒットする文字列を取り出
すために、「setcompatiblemode 0x00000200;」を実行しておく作戦になると思うん
ですが、その辺は慣れた人間でないと難しいです。

 具体的にどういうメール本文からどの部分を取り出すのか、個人情報の漏洩になら
ないような例を使って教えてほしいです。それで適当なサンプルマクロは僕の方で作
成できます。

[ ]
RE:10319 Export関数で任意のファイル名でNo.10329
でるもんたいいじま さん 24/05/12 19:50
 
こんばんは。秀丸エディタ愛用者の「でるもんた・いいじま」と申します。

今更ながらのご指摘で大変恐縮なのですが、1点だけ。

> 識者の皆様教えてください。
> 秀丸メールのマクロ作成ですが、ここで宜しかったでしょうか?

実は、ここ4番会議室は、秀丸「エディタ」のマクロに関する会議室です。
秀丸「メール」関係は基本、マクロも含めて8番会議室の管轄です。
https://www.maruo.co.jp/hidesoft/8/index.html

ただ、そちらを覗いてみても大抵の相談には秀まるおさんが直接回答していらっしゃ
いますし、また、今回のご相談については、既にこちら4番でかなり話が進んでいま
す。また、今現在の4番会議室には、本件以外のトピックは特に上がっていません。

なので個人的には、少なくとも今回のお話については、当面このまま4番会議室で続
けていただいても特に問題ないと考えます。これについての最終判断は、私としては
秀まるおさんに一任したいと考えます。

とはいえ、秀丸メール関係の告知、たとえばバージョンアップ等の情報は基本、8番
側に投稿されるはずです。なので、ぜひこの機会に8番会議室もご購読いただいて、
秀丸メールに関する次回以降のご相談につきましては、そちらへの投稿もご検討くだ
さい。

以上、長々と失礼いたしました。

[ ]
RE:10329 Export関数で任意のファイル名でNo.10330
hutec さん 24/05/13 08:25
 
>秀丸「メール」関係は基本、マクロも含めて8番会議室の管轄です。

でるもんた・いいじま 様
本件承知しました。以後気をつけます。
今後ともご指導宜しくお願い致します。

[ ]