Q2:自動返信マクロNo.00425
JR0LPL さん 07/07/18 02:15
 
皆様お世話になります。皆様の暖かいアドバイスで、かなり実装できました。

最終段階として、iniファイルにあるメールアドレスと、受信した新規メールの
メールアドレスの比較でつまずきました。またまたで、申し訳ないのですが、ア
ドバイスお願い致します。

Iranoan さんより

if( getininum( $ini, $sec, $$From ) ) call SendMail;

このような書式を提案頂きました。早速、iniファイルを下記のように作成しま
した。

[Addr]
*****1@*****.ne.jp
*****2@*****.ne.jp
*****3@*****.ne.jp
*****4@*****.ne.jp

そして、上記 if 文を実行しましたが、iniファイルにメールアドレスがあるの
に、サブルーチンコールが実行されませんでした。ここが出来れば、ほぼ完成に
なると思います。以下に作成した全マクロを示しますので、

なぜ

if( getininum( $ini, $sec, $$From ) ) call SendMail;

が実行できないのか、iniファイルの書式は有っているのか、アドバイス頂けた
ら幸いです。

[Addr1]
*****1@*****.ne.jp
[Addr2]
*****2@*****.ne.jp

のように書いてループで回して判定しないとダメなのかな?iniファイル自体が
理解出来てない状態です。

//---------------------------------------------------------
// 受信毎にマクロ起動するので、$Flag でマクロ起動を制御する
//---------------------------------------------------------

// $Flag = "";
   $Flag = "自動送信ON";

if ( $Flag == "" ) endmacro;

//---------------------------------------------------------
//                getininum 関数用の設定
//---------------------------------------------------------

$Dir = "E:\\TuruKameData\\AutoReplay\\";
$ini = $Dir + "Addr.ini";
$sec = "Addr";
$a   = "From";

//----------------------------------------------------------
//             自動返信メール生成用の設定
//----------------------------------------------------------
//ここを書き換える事で、Subroutine内で$Subject+".txt"を読み
//込む作りにする
//----------------------------------------------------------

$Subject = "外出中です";
//$Subject = "睡眠中です";
//$Subjecy = "来客中です";
//$Subject = "食事中です";
//$Subject = "離席中です";
//$Subject = "通院中です";

//----------------------------------------------------------
//                     メインルーチン
//----------------------------------------------------------

loaddll "tkinfo.dll";

$From = ""; // 安全の為入れておく

while( dllfunc( "SelectRecvMail" ) ) {
    $From = dllfuncstr( "CurrentHeader" , "From");
}

if ( $From == "" ) endmacro;

$From = dllfuncstr( "SetEmailOnly" , $From );

if( getininum( $ini, $sec, $$From ) ) call SendMail;

endmacro;

//----------------------------------------------------------------
//                         サブルーチン
//----------------------------------------------------------------
// 指定したFrom:が有った場合、文面及び To: , From をセットして送信
//----------------------------------------------------------------

SendMail:

//#n = dllfunc( "SetQuietMode" , 1 ); ←最終的に完成したら入れる事
  #n = dllfunc( "NewMail" );
  #n = dllfunc( "SetHeader" , "To" , $From );
  #n = dllfunc( "SetHeader" , "Subject" , $Subject);
  gofiletop;
  beginsel;
  gofileend;
  delete;
  insertfile $Dir+$Subject+".txt";
  #n = dllfunc("SendNow");
  #n = dllfunc( "SetQuietMode" , 0 );
return;

[ ]
RE:00425 Q2:自動返信マクロNo.00426
JR0LPL さん 07/07/18 02:36
 
JR0LPLです。お世話になります。

Subroutine内の
#n = dllfunc( "NewMail" );

#n = dllfunc( "MakeReply" );
に変更して以下のように改定しましたので、Subroutine部分のみ、再度掲載させ
ていただきます。

//----------------------------------------------------------------
//                         サブルーチン
//----------------------------------------------------------------
// 指定したFrom:が有った場合、文面及び To: , From をセットして送信
//----------------------------------------------------------------

SendMail:
  #n = dllfunc( "SetQuietMode" , 1 );
  #n = dllfunc( "MakeReply" );
  #n = dllfunc( "SetHeader" , "Subject" , $Subject);
  gofiletop;
  beginsel;
  gofileend;
  delete;
  insertfile $Dir+$Subject+".txt";
  #n = dllfunc("SendNow");
  #n = dllfunc( "SetQuietMode" , 0 );
return;

[ ]
RE:00425 Q2:自動返信マクロNo.00427
アルビレオ さん 07/07/18 03:01
 
アルビレオです。

>[Addr]
>*****1@*****.ne.jp
>*****2@*****.ne.jp
>*****3@*****.ne.jp
>*****4@*****.ne.jp

iniファイル内の書式は

[セクション]
キー=文字列または数値
キー=文字列または数値
キー=文字列または数値
[セクション]
キー=文字列または数値
キー=文字列または数値
キー=文字列または数値

といった形にしなければならず、セクション名の重複や同一セクション内での
キーの重複はできません。
この場合は

[Addr]
*****1@*****.ne.jp=1
*****2@*****.ne.jp=1
*****3@*****.ne.jp=1

とした方が楽だと思います。(=の後ろはゼロ以外の数字ならOK。数字によって処
理を切り替えるのも面白そうです)
ただ、キーに @ や . を含めてもいいのかどうかちょっとよくわかりません。
ダメだったら

[Addr]
Addr1=*****1@*****.ne.jp
Addr2=*****2@*****.ne.jp
Addr3=*****3@*****.ne.jp

という形にして、一致するものが見つかるまでループする必要がありますね。

[ ]
RE:00427 Q2:自動返信マクロNo.00428
JR0LPL さん 07/07/18 08:08
 
アルビレオさん、こんにちは。JR0LPLです。

iniファイルの構造について解説、ありがとうございました。

以下のことをやってみました。

[Addr]
*****1@*****.ne.jp=1
*****2@*****.ne.jp=1
*****3@*****.ne.jp=1

と記述して、

$From = "*****3@*****.ne.jp"
#n =  getininum( $ini, "Addr" , $$From );
if ( #n == 0 ) message"#nが0です";
if ( #n == 1 ) message"#nが1です";

のサンプルマクロで値の取得を試みましたが、必ず #n=0 が返ってくるようなの
で、断念しました。

ですので、二番目にアドバイス頂いた、

[Addr]
Addr1=*****1@*****.ne.jp
Addr2=*****2@*****.ne.jp
Addr3=*****3@*****.ne.jp

のiniファイル記述でやってみます。

[ ]
RE:00428 Q2:自動返信マクロNo.00431
JR0LPL さん 07/07/18 11:27
 
件名:getininum 関数その後

みなさん、こんにちは。JR0LPLです。

iniファイルの値の取得ですが、getininum 関数の s3パラメーターの
指定のプログラムミスでした。

s3パラメーターを $$From と設定したのが間違いで $From とする事
で値の取得に成功しました。

よって

[Addr]
*****1@*****.ne.jp=1
*****2@*****.ne.jp=1
*****3@*****.ne.jp=1

として、マクロ中でLoopさせなくても、if 文一個の判定で済むよう
になりました。

確認したサンプルマクロ

$From = "*****3@*****.ne.jp";
#n =  getininum( $ini, "Addr" , $From );
if ( #n == 0 ) message"#nが0です";
if ( #n == 1 ) message"#nが1です";

これは応用として、セクションを別に設けて、「お誕生日おめでと
う」などの自動送信に活用できそうです。送信前の値を1にしておい
て、「おめでとう」メール送信後、writeininum 関数で、値を0に書
き直して一回だけの送信にするとか、色々遊べそうです。

[ ]