添付ファイルの有無を確認するマクロNo.48116
yanagida さん 15/06/12 16:29
 
こんにちは。

送信時に添付ファイルがあれば、新規にそのメールの返信メールを
作成し、解凍パスワードを記入したいと思っています。

そこで、
送信時に添付ファイルがあれば、新規にそのメールの返信メールを作成する
というマクロを作成しようと思っているのですが、
第一段階として、添付ファイルの有無を確認しようと思い、

-------------------------------
loaddll "TKInfo.dll";


#n = dllfunc("GetMailFlag", "attach");

if( #n == 1 )
{
 message "添付ファイルがありました。";
}
else
{
 message "添付ファイルはありません。";
}
-------------------------------

というマクロを作成し、
マクロ登録>自動起動>あとで送信/今すぐ送信時
に登録して実行したところ、
添付ファイルの有無に関わらず、常に「添付ファイルはありません。」
というメッセージが表示されてしまいます。


新規にメールを作成し、草稿に保存した状態で、上のマクロを
実行しても、やはり添付ファイルの有無に関わらず、常に
「添付ファイルはありません。」
というメッセージが表示されてしまいます。

GetMailFlagの使い方が間違っているのでしょうか?

添付ファイルの有無を確認するマクロの作成方法について
教えてください。


[ ]
RE:48116 添付ファイルの有無を確認するマNo.48117
秀まるお2 さん 15/06/12 16:51
 
 ヘルプに書いて無くてすみませんが、送信する用の作成中のメールの場合、す
みませんがGetMailFlagはうまく機能しないです。(たぶん)

 添付ファイルがあるかどうかは、X-Attach:ヘッダの有無で判断して欲しいで
す。

    if( dllfuncstr("CurrentHeader","X-Attach") != "" ) {
        message "添付ファイルあります。";
    } else {
        message "添付ファイルありません。";
    }

 とか、あるいは

    if( dllfunc("CountCurrentHeader","X-Attach") != 0 ) {
        message "添付ファイルあります。";
    } else {
        message "添付ファイルありません。";
    }

 みたいな処理で判断できます。

> 送信時に添付ファイルがあれば、新規にそのメールの返信メールを作成する
> というマクロを作成しようと思っているのですが、

 まだ送信してないメールに対して「返信メール」を作成することは、すみませ
んが現状の秀丸メールでは出来ないです。

 しいて、新規メールの上で

    #n = dllfunc("MakeReply");

 を実行すると、今現在編集してるメールが消えてしまうようです。(これはこ
れでバグになりそうなので、直さないといけないですが)

 返信メールを作成するためには、返信元メールのMessage-Id:ヘッダが固定化
されてる必要かあるのですが、まだ送信してないメールには固定のMessage-Id:
ヘッダが割り振られてません。なので、送信してない段階で返信メールを作成す
ることは出来ないです。

 これはどうしようも無いです。

 そもそも、まだ送信してないメールに対して返信メールを作成するってことは
普通しないはずです。どういう事情があってそういう必要性があるのか教えてい
ただければ、代替策がご提案できそうな気がします。例えば添付ファイルを
パスワード付きzipファイル化して送る必要かあって、そのパスワードは別便で
送らないといけないとかでしたら、そういうマクロの例を僕の方で作ることは出
来そうな気がします。

[ ]
RE:48117 添付ファイルの有無を確認するマNo.48118
yanagida さん 15/06/12 17:09
 
こんにちは。

すばやい返信ありがとうございます。

教えていただいた、以下の方法にて、

>
>    if( dllfuncstr("CurrentHeader","X-Attach") != "" ) {
>        message "添付ファイルあります。";
>    } else {
>        message "添付ファイルありません。";
>    }
>
> とか、あるいは
>
>    if( dllfunc("CountCurrentHeader","X-Attach") != 0 ) {
>        message "添付ファイルあります。";
>    } else {
>        message "添付ファイルありません。";
>    }
>

添付ファイルの有無を判定できました。

>例えば添付ファイルを
>パスワード付きzipファイル化して送る必要かあって、そのパスワードは別便で
>送らないといけないとかでしたら、そういうマクロの例を僕の方で作ることは出
>来そうな気がします。


まさに、ご指摘のマクロの作成を考えていました。

送信先と同じ宛先でメールを作りたいので、

if( dllfunc("CountCurrentHeader","X-Attach") != 0 )
{
 message "添付ファイルあります。";
 #n = dllfunc( "MakeReplyCustom", "All", "" );
}
else
{
 message "添付ファイルありません。";
}

として、マクロ登録>自動起動>あとで送信/今すぐ送信時 に登録して実行したと
ころ
返信メールは作成されるのですが、宛先はブランクのままでした。

アドバイスいただけますでしょうか?

[ ]
RE:48118 添付ファイルの有無を確認するマNo.48119
秀まるお2 さん 15/06/12 17:31
 
 添付ファイルを自動で圧縮したりとか、圧縮するのに入力したパスワードを自
動でメールに入れたりまでやらず、単純に、同じ宛先にもう1通メールを作るだ
けでしたら、こんな感じになります。

    loaddll "tkinfo.dll";
    if( dllfunc("CountCurrentHeader", "X-Attach") == 0 ) {
        endmacro;
    }
    $to = dllfuncstr("CurrentHeaderUnited", "To");
    $cc = dllfuncstr("CurrentHeaderUnited", "Cc");
    $bcc = dllfuncstr("CurrentHeaderUnited", "Bcc");
    $subj = dllfuncstr("CurrentHeader", "Subject");
    #n = dllfunc("NewMail");
    #n = dllfunc("SetHeader", "Subject", "[解凍用パスワードの通知] " + $subj );
    #n = dllfunc("SetHeader", "To", $to );
    #n = dllfunc("SetOrDeleteHeader", "Cc", $cc );
    #n = dllfunc("SetOrDeleteHeader", "Bcc", $bcc );
    gofiletop;

 とかのマクロでどうでしょうか。

 メール本文を適当に指定したい場合は、gofiletop;の後に、例えば

    insert " お送りした添付ファイルを解凍する用のパスワードは、";

 とか入れておいたりするといいんじゃないかと思います。

 他に「こうしたい」的な話があれば、簡単に直せる範囲ならすぐにお返事でき
ると思います。

[ ]
RE:48119 添付ファイルの有無を確認するマNo.48137
yanagida さん 15/06/15 16:56
 
すばやい回答を頂いたのに、返信遅れてすいません。

教えていただいたマクロも動かしてみました。
新しいメールが同じ返信先に作成されました。
添付ファイルの圧縮は別のソフトで行っているので、
やりたいことは、ほぼ実現できました。

「ほぼ」というのは、
「このメールに添付したファイルのパスワードですよ」
という意味もこめて、送信したメールの本文も、返信の形(">"が行頭に入った形)
で挿入したいのですが、可能でしょうか?

イメージとしては、
添付ファイルがあれば返信メールを作成、その上部に
「 お送りした添付ファイルを解凍する用のパスワードは、」のような
メッセージを追加したいと思っています。


[ ]
RE:48137 添付ファイルの有無を確認するマNo.48139
秀まるお2 さん 15/06/16 11:38
 
 返信元メールの本文を引用付きで入れる例を作ってみました。

    loaddll "tkinfo.dll";
    if( dllfunc("CountCurrentHeader", "X-Attach") == 0 ) {
        endmacro;
    }
    $to = dllfuncstr("CurrentHeaderUnited", "To");
    $cc = dllfuncstr("CurrentHeaderUnited", "Cc");
    $bcc = dllfuncstr("CurrentHeaderUnited", "Bcc");
    $subj = dllfuncstr("CurrentHeader", "Subject");
    $body = dllfuncstr("RootBody");
    $body = dllfuncstr("Quote", $body);
    #n = dllfunc("NewMail");
    #n = dllfunc("SetHeader", "Subject", "[解凍用パスワードの通知] " + $subj );
    #n = dllfunc("SetHeader", "To", $to );
    #n = dllfunc("SetOrDeleteHeader", "Cc", $cc );
    #n = dllfunc("SetOrDeleteHeader", "Bcc", $bcc );
    gofiletop;
    insert " お送りした添付ファイルを解凍する用のパスワードは、\n\n";
    insertfix $body;
    gofiletop;
    golineend;


 返信元メールのメール本文が非常に長いと途中で切れてしまうのですけども、
それは別にいいんじゃないかと思います。

 (RootBodyとかQuoteとかの関数の扱える文字列長さに制限があるので、切れ
てしまうのは仕方がないです。)

[ ]
RE:48139 添付ファイルの有無を確認するマNo.48142
yanagida さん 15/06/16 13:48
 
修正版ありがとうございます。

早速試したのですが、本文の引用が入りませんでした。

マクロ登録>自動起動>あとで送信/今すぐ送信時
に登録して試したので、これがまずいかと思い、
草稿に保存した状態で、マクロ実行しましたが、
同様に引用文が入りませんでした。

私の方で実行手順がまちがってますでしょうか?

[ ]
RE:48142 添付ファイルの有無を確認するマNo.48144
yanagida さん 15/06/16 15:11
 
※本文に間違いがあったので、先の投稿を削除しました。

たびたびすいません。

いろいろ試してみて気づいたのですが、私のイメージと異なっていました。

作っていただいたマクロだと、

----------------------
お世話になります。
○○です。

XXXの件です。

以上よろしくお願いします。
----------------------

という本文のに以下のような添付ファイル付き返信メールを送った場合、

======================
お世話になります。

添付ファイル送ります。

以上、よろしくお願いします。

>お世話になります。
>○○です。
>
>XXXの件です。
>
>以上よろしくお願いします。
======================


**********************
 お送りした添付ファイルを解凍する用のパスワードは、

>お世話になります。
>○○です。
>
>XXXの件です。
>
>以上よろしくお願いします。
**********************

というメールを新規に作成するんですね。

私のイメージでは、

++++++++++++++++++++++++++++++++++
 お送りした添付ファイルを解凍する用のパスワードは、

>お世話になります。
>
>添付ファイル送ります。
>
>以上、よろしくお願いします。
>
>>お世話になります。
>>○○です。
>>
>>XXXの件です。
>>
>>以上よろしくお願いします。
++++++++++++++++++++++++++++++++++

というように、添付ファイルを付けた自分のメールの本文を
引用付きで入れたいと思っていました。

これは可能なのでしょうか?

[ ]
RE:48144 添付ファイルの有無を確認するマNo.48145
秀まるお2 さん 15/06/16 15:20
 
 状況理解しました。以下のように、$bodyを、今現在のメールから取ってくる
ようにすればいいと思います。


    loaddll "tkinfo.dll";
    if( dllfunc("CountCurrentHeader", "X-Attach") == 0 ) {
        endmacro;
    }
    $to = dllfuncstr("CurrentHeaderUnited", "To");
    $cc = dllfuncstr("CurrentHeaderUnited", "Cc");
    $bcc = dllfuncstr("CurrentHeaderUnited", "Bcc");
    $subj = dllfuncstr("CurrentHeader", "Subject");
    #x = x; #y = y;
    gofiletop;
    beginsel;
    gofileend;
    $body = gettext( seltopx, seltopy, selendx, selendy );
    moveto #x, #y;
    $body = dllfuncstr("Quote", $body);
    #n = dllfunc("NewMail");
    #n = dllfunc("SetHeader", "Subject", "[解凍用パスワードの通知] " + $subj );
    #n = dllfunc("SetHeader", "To", $to );
    #n = dllfunc("SetOrDeleteHeader", "Cc", $cc );
    #n = dllfunc("SetOrDeleteHeader", "Bcc", $bcc );
    gofiletop;
    insert " お送りした添付ファイルを解凍する用のパスワードは、\n\n";
    insertfix $body;
    gofiletop;
    golineend;



 どうでしょうか。
 メール本文がむちゃくちゃ長いと、途中でカットされてしまいますけども。

[ ]
RE:48145 添付ファイルの有無を確認するマNo.48148
yanagida さん 15/06/17 13:54
 
ありがとうございます!
イメージ通りにできました!

・・・ところで、うまくいくとちょっと欲が出てきてしまったのですが、
添付ファイルの拡張子が「zip」のときだけ、このマクロを実行する
ような条件を追加できますでしょうか?





[ ]
RE:48148 添付ファイルの有無を確認するマNo.48149
秀まるお2 さん 15/06/17 14:38
 
 この程度の変更は簡単でして…

    if( dllfunc("CountCurrentHeader", "X-Attach") == 0 ) {
        endmacro;
    }

 の3行を、

    $attach = dllfuncstr("CurrentHeader", "X-Attach:");
    $ext = dllfuncstr("ToLower", rightstr( $attach, 4 ) );
    if( $ext != ".zip" ) {
        endmacro;
    }

 のように置き換えれば、.zipの拡張子付きメールのみを対象に動作するように
なります。

[ ]
RE:48149 添付ファイルの有無を確認するマNo.48150
yanagida さん 15/06/17 16:59
 
ありがとうございます。
完璧です!

色々とありがとうございました。

[ ]