メール受信時のマクロでメール本文をテキNo.39064
tacox さん 10/08/31 23:07
 
毎日利用させていただいています。

秀丸マクロはまったく利用したことがない初心者ですが、
以下のことをやりたいと思っていますが、可能でしょうか?

@メール受信時にメール本文をUTF-8テキストファイルで保存。
Aファイル名はメールのヘッダ送信日時・件名やmessageidなどを
 利用する。
B保存したメールは別のフォルダに移動。

秀丸マクロではなく、他のプログラム言語、APIでやれば
よいのですが、もしも手軽にできるようであれば利用
させて頂こうと思っています。

VBからMAPIを利用して同様のことをやろうとしましたが、
MAPIがUNICODEのテキストに対応していないらしく断念しました。

アドバイスをよろしくお願いします。




[ ]
RE:39064 メール受信時のマクロでメール本No.39067
秀まるお2 さん 10/09/01 09:05
 
 秀丸メールなら出来ます。

 作戦としてですが…、秀丸メールでは、「受信が一段落したら」というタイミ
ングでマクロを自動実行する機能があります。そのマクロの中で、受信したメー
ルを1通ずつ選択して何かのアクションをする、ということが出来ます。

 その、1通ずつ選択して行うアクションの中で、秀丸エディタ相当のエディタ
の中でメールを加工し、「名前を付けて保存」に相当する処理を実行すれば、実
現出来ます。

> 秀丸マクロではなく、他のプログラム言語、APIでやれば
> よいのですが、もしも手軽にできるようであれば利用
> させて頂こうと思っています。

 秀丸マクロだとコンパイルとかの作業が必要無いのでデバッグなどもやりやす
いと思います。

 マクロでどうしても出来ない処理は、例えばC++言語で作成したDLLをマクロか
ら呼び出して処理させたり、外部のEXEファイルと連携して処理させることも出
来ます。

 (例えばうちの会社では送金報告いだだいたメールから必要な情報を抽出して
Accessのデータベースに自動登録するようなマクロも使っています。)


 で、実際にマクロを作るとなると、まずは何から手を付けていいかすら分から
ないと思いますので、それはそれでまた質問して欲しいです。

[ ]
RE:39067 メール受信時のマクロでメール本No.39079
tacox さん 10/09/01 23:34
 
アドバイスありがとうございます。

> 秀丸メールなら出来ます。
>
> 作戦としてですが…、秀丸メールでは、「受信が一段落したら」というタイミ
>ングでマクロを自動実行する機能があります。そのマクロの中で、受信したメー
>ルを1通ずつ選択して何かのアクションをする、ということが出来ます。
>
> その、1通ずつ選択して行うアクションの中で、秀丸エディタ相当のエディタ
>の中でメールを加工し、「名前を付けて保存」に相当する処理を実行すれば、実
>現出来ます。

秀丸マクロのヘルプとか、他の方が作成されたマクロ作品を
眺めていましたが、秀丸マクロ単体ではメールの本文は
取り出せないのでしょうか?

メールの各種ヘッダと、受信テキストファイルのパス、
該当メールのOffset、サイズ、ヘッダの行数などを取得して、
秀丸エディタのマクロや、外部プログラムを呼び出して
テキスト処理を行う・・・といった手順でしょうか?


>
> で、実際にマクロを作るとなると、まずは何から手を付けていいかすら分から
>ないと思いますので、それはそれでまた質問して欲しいです。

ありがとうございます。また行き詰った場合、よろしくお願いします。

[ ]
RE:39079 メール受信時のマクロでメール本No.39080
秀まるお2 さん 10/09/02 09:04
 
> 秀丸マクロのヘルプとか、他の方が作成されたマクロ作品を
> 眺めていましたが、秀丸マクロ単体ではメールの本文は
> 取り出せないのでしょうか?

 秀丸メールの中のメール内容を表示している部分は秀丸エディタV7.11相当の
物なので、メール本文は、秀丸マクロでどうにでも出来ます。

 例えばメール本文を取り出して中身を他のファイルに保存するなら、秀丸マク
ロのsaveasとかの命令を使う形になります。メール本文の一部を変数に代入した
りってことなら、gettext関数とかの関数があります。

> メールの各種ヘッダと、受信テキストファイルのパス、
> 該当メールのOffset、サイズ、ヘッダの行数などを取得して、
> 秀丸エディタのマクロや、外部プログラムを呼び出して
> テキスト処理を行う・・・といった手順でしょうか?

 メール用ファイルの「ファイル名+オフセット」を取り出して、あとは外部の
ソフトにすべて処理させる、ということも出来ます。

 秀丸メールのメールデータ用ファイルを直接外部のソフトで処理させる場合、
メールの文字コードの種類によってメールデータの保存される文字コードも変化
するので、その辺の配慮だけは必要になります。例えばutf-8文字コードのメー
ルはメールデータ自体もutf-8で保存されたりします。

 なるべくなら、秀丸メールのマクロ上で処理させた方が楽だと思います。

[ ]
RE:39080 メール受信時のマクロでメール本No.39081
秀まるお2 さん 10/09/02 09:43
 
> @メール受信時にメール本文をUTF-8テキストファイルで保存。
> Aファイル名はメールのヘッダ送信日時・件名やmessageidなどを
>  利用する。

 とりあえずマクロ的にはこんな感じになると思います。

    loaddll "tkinfo.dll";
    if( dllfunc("RecvMailCountShow") == 0 ) {
        endmacro;
    }
    #headerview = dllfunc("HeaderView");
    if( #headerview != 0 ) {
        #n = dllfunc("SwitchHeaderView", 0);
    }
    while( dllfunc("SelectRecvMail") ) {
        $messageid = dllfuncstr("CurrentHeader", "Message-Id");
        if( $messageid == "" ) {
            $messageid = "(nomessageid)"
                + dllfuncstr("CurrentHeader", "Date");
        }
        if( strlen($messageid) > 100 ) {
            $messageid = leftstr( $messageid, 100 );
        }
        #i = 0;
        while( #i < strlen($messageid) ) {
            #code = ascii( midstr( $messageid, #i, 1 ) );
            if( #code == '\\'
             || #code == ':' || #code == '/'
             || #code == '\"' || #code == ',' || #code == '<'
             || #code == '>' || #code == '|' || #code == ';'
             || #code == '?' || #code == '*'
             || #code < ' ' || #code >= 0x7F ) {
                //削除
                $messageid = leftstr($messageid,#i) +
                        midstr($messageid,#i+1,999);
            } else {
                #i = #i + 1;
            }
        }
        $path = "C:\\temp\\" + $messageid;
        $path0 = $path;
        $path = $path + ".txt";
        #i = 2;
        while( existfile( $path ) ) {
            $path = $path0 + "(" + str(#i) + ").txt";
            #i = #i + 1;
            if( #i > 1000 ) {
                break;
            }
        }
        saveas $path, utf8;
    }
    endmacro;

[ ]
RE:39081 メール受信時のマクロでメール本No.39109
tacox さん 10/09/04 00:05
 
お返事遅れました。

コードまで掲載していただいてありがとうございます。
短いコードで簡単に実現できるんですね。
ビックリしました。

秀丸メールのマクロのヘルプを見ましたが(斜め読みですが)
メール本文の扱い方がよくわかりませんでした。

マクロ作成のヒントでは、テキストを扱いたい場合は
秀丸エディタのマクロで・・・ということだったので、
秀丸エディタのマクロも勉強しなければ・・と思っていました。
「saveas」で現在選択しているメールの本文が保存できたんですね。
#
#「saveas」も秀丸エディタの命令ですね・・
#

ところで、この受信後に実行されるマクロは、複数アカウントでも
問題なく動作するという認識でよいのでしょうか?
それとも特殊な処理がいるのでしょうか?
お世話になりっぱなしですいません。


[ ]
RE:39109 メール受信時のマクロでメール本No.39112
秀まるお2 さん 10/09/04 22:24
 
 SelectRecvMail関数でループさせてるんですけど、これは複数アカウントでも
かまわず全部の新着メールを選択してループする動作になります。

 特定アカウント配下だけループさせる命令は無いので、しいてそれをやるなら
ば、SelectRecvMail関数でメールを選択させてからCurrentAccountを見て判定さ
せるか、またはSelectRecvMailInFolder関数でループさせるかって形になります。

[ ]