文字の抽出No.36693
南天 さん 09/07/30 14:43
 
メール振り分けであるフォルダに受信するメールの
一番最初のURL(http://***)を抽出してtxtファイルにメールが来るたびに追加する
プログラムにして下さい。
着信フラグ変更無しで保存するtxtファイルの最新が10行目ぐらいに来るようにして
もらえるとうれしいです。
(タイトルおよび詳細等を入れたいので 新着が一番上です。)
秀丸エディタも常駐しています。

[ ]
RE:36693 文字の抽出No.36698
秀まるお2 さん 09/07/30 17:38
 
 受信時の自動振り分けのタイミングで、受信したメール1通ずつを対象として
何か処理をしたい場合には、一般にSelectRecvMailまたは
SelectRecvMailInFolder関数を使うことになります。この場合、その関数によっ
て選択されたメールの新着フラグは必ずOFFになります。

 その辺の話は既にマクロヘルプを参照して理解いただいてるということですよ
ね。

 それで、しいてその新着フラグがOFFになるのを避けたいということであれは、

   GetLastRecvMailBodyTop

 って関数を使って処理することも可能ではあります。ただし、その関数で取得
できるメール本文の長さは先頭から200バイト程度しかありません。なので、
もしもメールの先頭付近にURLがあるという訳じゃないのなら、やはり新着フラ
グをOFFにする手段しかありません。

 新着フラグをOFFにしてもいいとして、具体的なマクロの例としては、マクロ
ヘルプのSelectRecvMailInFolderの所辺りを参考にしていただければいいと思い
ます。


--------------------------------------------------------------------

 メールの中にURLがあるとして、それを例えばc:\temp.txtってファイルに出力
するマクロを作ると、例えば以下のようになります。

    #x = x; #y = y;
    gofiletop;
    searchdown2 "http://", nocasesense;
    if( result ) {
        #x1 = x; #y1 = y;
        searchdown2 "[^!#$%&*+\\-./0-9:;=?@a-z^_|~]", regular, nocasesense;
        $url = gettext( #x1, #y1, x, y );
        runsync2 "cmd.exe /c echo " + $url + ">>c:\\temp.txt";
    }
    moveto #x, #y;

 画面に一瞬コマンドプロンプトが出てくるのがちょっとよくないですけど、一
応こういう方法しか思いつかないです。

 それと、SelectRecvMailInFolderでループさせる処理をうまく組み合わせれば
いいと思います。

 (他にいい方法があったら誰か教えてください)

[ ]
RE:36698 文字の抽出No.36699
秀まるお2 さん 09/07/30 17:54
 
 追加でコメントしてしまいます。

>         runsync2 "cmd.exe /c echo " + $url + ">>c:\\temp.txt";

 これですが、URLの中に「?xxxx&xxx=xxx」みたいに「&」があるとダメみたい
です。

 &があってもうまくいくようにするためには、

        runsync2 "cmd.exe /c echo \"" + $url + "\">>c:\\temp.txt";

 にしないとダメみたいです。ただしそうすると、temp.txtに出力されるURLの
前後に「""」が付いてしまうようです。

 それは仕方がないということで使ってもらうしか無いかなぁと思います。

[ ]
RE:36698 文字の抽出No.36700
秀まるお2 さん 09/07/30 17:58
 
 それと、SelectRecvMailInFolder関数のヘルプにはあんまり適当なサンプルは
ありませんでした。

 例としては、例えばこんな感じになります。

    loaddll "tkinfo.dll";
    if( dllfunc("RecvMailCountShow") == 0 ) {
        endmacro;
    }
    $account = dllfuncstr("CurrentAccount");
    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "特定アカウント", "特定フォルダ");
    if( dllfunc("RecvMailCountInFolder") != 0 ) {
        while( dllfunc("SelectRecvMailInFolder") ) {
            //
            // URLを抽出するマクロ
            //
        }
    }
    #n = dllfunc("SelectFolder", $acount, $folder);

[ ]
RE:36700 文字の抽出No.36702
南天 さん 09/07/31 08:00
 
秀まるお2様
ありがとうございます。
URL抽出も特定フォルダも うまく動きました。
しかし、マクロ実行すると新着がフラグが消えてしまいます。
また、出力txtの最終行に追記してしまいます。

新着フラグのON・OFFと出力形式のマクロも教えて下さい。
よろしくお願いします。

[ ]
RE:36702 文字の抽出No.36703
秀まるお2 さん 09/07/31 08:52
 
 新着フラグかOFFになるのを避けることは出来ないです。新着フラグを無理矢
理ONにすると、SelectRecvMailInFolder関数がまたそのメールを選択して同じ処
理を繰り返してしまいます。

> また、出力txtの最終行に追記してしまいます。

 だいたいこういう記録といか、一般的なログというのはみんな追記で記録され
る物というか、追記でないとコンピュータの処理的に非常に難しくて時間のかか
る処理になってしまうと思います。

 しいてやるとしたら、例えばこんなマクロになります。

    #x = x; #y = y;
    gofiletop;
    searchdown2 "http://", nocasesense;
    if( result ) {
        #x1 = x; #y1 = y;
        searchdown2 "[^!#$%&*+\\-./0-9:;=?@a-z^_|~]", regular, nocasesense;
        $url = gettext( #x1, #y1, x, y );
        runsync2 "cmd.exe /c copy c:\\temp.txt c:\\temp2.txt";
        runsync2 "cmd.exe /c echo " + $url + ">c:\\temp3.txt";
        runsync2 "cmd.exe /c copy c:\\temp3.txt+c:\\temp2.txt c:\\temp.txt";
        runsync2 "cmd.exe /c del c:\\temp2.txt";
        runsync2 "cmd.exe /c del c:\\temp3.txt";
    }
    moveto #x, #y;

[ ]
RE:36703 文字の抽出No.36704
秀まるお2 さん 09/07/31 08:58
 
 あと念のため、新着フラグを書き換える方法も書いておくと…

    loaddll "tkinfo.dll";
    #n = dllfunc("SetMailFlag", "hot", 1);

 です。

[ ]
RE:36704 文字の抽出No.36710
南天 さん 09/07/31 22:05
 
秀まるお2様
新着フラグとtxt追記の件・・・
ループしたり処理が遅くなったり・・・そうなんですね。
でも、紹介して頂いたマクロを使ってやってみます。
本当にいつもありがとうございます。

[ ]
RE:36700 文字の抽出No.36785
南天 さん 09/08/09 16:27
 
教えて頂いた
"特定アカウント・特定フォルダ"のマクロなんですが
アカウント・フォルダ・URLを抽出するマクロを記入して
しばらく使っていたのですが
選択中のフォルダおよび1メールに複数のURLも抽出してしまいます。
修正点があれば教えて下さい。よろしくお願いします。

[ ]
RE:36785 文字の抽出No.36787
秀まるお2 さん 09/08/10 09:07
 
 僕の作った処理そのままであれば、1メール中の複数URLを抽出したり、
SelectFolderしたフォルダとは別の所のメールからURLを抽出したりということ
は無いと思います。

 南天様の作成されたマクロをここに書いていただければ、具体的にどこが間違
ってるとかっていう指摘はできるかなぁと思います。

[ ]
RE:36787 文字の抽出No.36793
南天 さん 09/08/10 11:28
 
秀まるお2さま
こんな感じで記述しました。添削お願いします。

//URL抽出(特定フォルダ)
loaddll "tkinfo.dll";
 if( dllfunc("RecvMailCountShow") == 0 ) {
 endmacro;
 }
  $account = dllfuncstr("CurrentAccount");
 $folder = dllfuncstr("CurrentFolder");
 #n = dllfunc("SelectFolder", "アカウント", "フォルダ");
// #n = dllfunc("SelectFolder", "特定アカウント", "特定フォルダ");
 if( dllfunc("RecvMailCountInFolder") != 0 ) {
 while( dllfunc("SelectRecvMailInFolder") ) {
 //
 // URLを抽出するマクロ
#x = x; #y = y;
 gofiletop;
 searchdown2 "http://", nocasesense;
 if( result ) {
 #x1 = x; #y1 = y;
 searchdown2 "[^!#$%&*+\\-./0-9:;=?@a-z^_|~]", regular, nocasesense;
 $url = gettext( #x1, #y1, x, y );
 runsync2 "cmd.exe /c echo \"" + $url + "\">>\"D:\\抽出.txt\"";
 }
moveto #x, #y;
 // URLを抽出するマクロ
 //
 }
 }
#n = dllfunc("SelectFolder", $acount, $folder);


[ ]
RE:36793 文字の抽出No.36794
秀まるお2 さん 09/08/10 11:54
 
 僕が拝見した限りでは特におかしいことは無いと思います。

 しいて直すとしたらですけども…

 SelectFolderで選択してるフォルダとは別のフォルダのメールも対象に処理し
てしまうことがあるということでしたら、たとえば

    #n = dllfunc("SelectFolder", "アカウント", "フォルダ");

 の後に、

    if( #n != 0 ) {
        message "SelectFolderに失敗しました。";
        endmacro;
    }

 を入れてたしかにフォルダ選択に成功したかどうかチェックするとか、あるい


        while( dllfunc("SelectRecvMailInFolder") ) {

 の直後に、たしかに今現在のフォルダが目的のフォルダかどうか確認する用に、
たとえば

        if( dllfuncstr("CurrentFolder") != "フォルダ" ) {
            message "フォルダが目的のものじゃなくなってます。";
            endmacro;
        }

 を入れてチェックするとかしたらいいんじゃないかと思います。

 それと、1つのメールの中に複数URLが入っているケースですが、マクロの動
作としては、一番先頭にヒットした1つのURLしか処理しないはずです。何かの
勘違いじゃないかと思います。

 たしかに1つのメールにつき1回しかURLを抽出してないってことを確認する
ようにマクロを直すのも手ではありますけども…。

runsync2 "cmd.exe /c echo \"" + $url + "\">>\"D:\\抽出.txt\"";

 の所を、たとえば

$messageid = dllfuncstr("CurrentHeader", "Message-Id:");
runsync2 "cmd.exe /c echo " + "\"" + $messageid + " " + $url + "\">>\"D:\\抽
出.txt\"";

 みたいにして、どのメールからどのURLを抽出したのかmessage-idを使って確
認するようにしたらいいんじゃないかと思います。

[ ]
RE:36794 文字の抽出No.36822
南天 さん 09/08/13 12:21
 
> 僕が拝見した限りでは特におかしいことは無いと思います。
とのことですが、
単発起動、自動起動
自動起動は、受信が一段落した時(&V):に登録
ともに 他フォルダ得に「受信」選択時は駄目です。

原因を考えたんですが、
振り分け設定で重複しているのが原因かもしれません
確認お願いします。

[ ]
RE:36822 文字の抽出No.36824
秀まるお2 さん 09/08/13 12:33
 
 僕の所では再現テスト出来ないので、マクロの中にデバッグ用の処理を入れて、
それでいろいろ状況をご自身で調べてもらうしか無いと思います。

 SelectFolderに失敗してるのだとしたら、それの返り値を見てエラーならエ
ラーメッセージを出すようにするとか、あるいはURLを取り出す処理の直前で
CurrentFolder関数の返り値を調べるなどすれば原因が究明出来るんじゃないか
と思います。

 仮にそれて、たとえばSelectFolder関数がうまく動かないケースがあるとした
ら、なぜそれがうまくいかないのかの原因を考える、という風な手順になると思
います。

> 原因を考えたんですが、
> 振り分け設定で重複しているのが原因かもしれません

 これも僕の書いたマクロの通り、本当に「1つのメールから複数URLを取り出
してることが間違いない」のかどうかを調べてみないとなんとも言えないです。
僕がマクロを見た限りは、絶対に、1つのメールから複数URLを取り出すような、
そういうループするようなことは無いはずだと思います。

 メールのMessage-Idも出力するようにすれば、たしかにどのメールからどの
URLを抽出したのか分かると思いますけども。

[ ]
RE:36824 文字の抽出No.36827
南天 さん 09/08/13 12:52
 
>> 原因を考えたんですが、
>> 振り分け設定で重複しているのが原因かもしれません
>
> これも僕の書いたマクロの通り、本当に「1つのメールから複数URLを取り出
>してることが間違いない」のかどうかを調べてみないとなんとも言えないです。

振り分け設定と複数のURLですこし誤解しているように思いますので
補足で説明します。言葉足らずで済みません

このマクロを使った時に、
選択中のフォルダのURLを拾ってしまうのです。

この原因が、振り分け設定に 上位と下位などに同じメールの
設定がされていると不具合があるのでは無いかと言うことです。
検討よろしくお願い致します。

[ ]
RE:36827 文字の抽出No.36828
秀まるお2 さん 09/08/13 13:22
 
 どうも話がかみ合ってないようです。

 とりあえずですが、マクロの中のURLを抽出する処理の直前の所に、


   if( dllfuncstr("CurrentFolder") != "目的のフォルダ" ) {
       message "目的のフォルダじゃない所でURLを抽出しようとしています。"
       endmacro;
   }

 みたいな処理を入れればいいんじゃないでしょうか。それでたしかに、目的の
フォルダじゃない所でURL抽出が実行されようとした時に、マクロがエラーメッ
セージを表示して中断することが確認出来れば、それで一歩前に進んだというこ
とが言えると思います。

 実際にそういう風にマクロを直してみて、たしかにそのエラーが出て中断する
ということであればですけども…

 たとえばSelectRecvMailInFolderじゃなくてSelectRecvMailを使っていると、
せっかくSelectFolderしても意味がなくて、受信したメール全部を対象にURL抽
出すると思います。

[ ]
RE:36828 文字の抽出No.36829
秀まるお2 さん 09/08/13 13:39
 
 たぶんですけど、SelectFolder関数で指定するアカウント名/フォルダ名が間
違ってるせいでマクロがうまく動いてないんじゃないかと思います。

 僕の書いたマクロは、あくまで参考のマクロであって、それをそっくりそのま
ま南天さんの所で動かして動く物ではありません。アカウント名やフォルダ名は、
具体的に南天さんの所での目的のアカウント名/フォルダ名に直してやらないと
うまく動かないです。

 たとえばですけど、アカウント名が「テストアカウント」で、目的のフォルダ
が、たとえばアカウント直下に作った「テストフォルダ」だったとしたら、

    #n = dllfunc("SelectFolder", "テストアカウント", "User\\テストフォルダ");


 のようにしないといけないです。

 もしかして「受信」フォルダ配下にある「テストフォルダ」だったら、

    #n = dllfunc("SelectFolder", "テストアカウント", "受信\\テストフォルダ");

 としないといけないです。

 「\\」と書くべき所を「\」としただけでも失敗すると思います。

 その辺確認してみるとか、あるいはSelectFolder関数の返値を確認するように
マクロを直すとかしたらいいんじゃないかと思います。

[ ]
RE:36829 文字の抽出No.37000
南天 さん 09/09/16 14:02
 
秀まるお2
確認返事遅れて済みません
>    #n = dllfunc("SelectFolder", "テストアカウント", "User\\テストフォルダ");
> のようにしないといけないです。
が原因だったようです。うまくいきました。
ありがとうございます。

[ ]