ページを選択

ストブロ

Coffee's Blog.

fmlで自動応答を実現する その2

執筆者 | 2021年01月28日 | Coffee, さくらのレンタルサーバー, ストブロ

前回までは「Recieved」という固定したファイルの中身で自動応答する事が出来ました。
文中に件名にも付与した「受付番号」を挿入したい…
という事でまたしてもヤンマさんにヒントを貰いながら、トライ&エラー

無事に完成しました!

最終的に実現出来たプログラムは以下の通りです。


# 送信元への配信はスキップし、Reply-toが未設定なら送信元アドレスを挿入
$START_HOOK = q#
 $SKIP{ $From_address } = 1;
 if ("reply-to" == $MAIL_LIST) {
        &DEFINE_FIELD_FORCED("reply-to", $From_address);
    };
#;


# 自動応答
$str = "メール受付のご案内";
use Encode 'from_to';
from_to($str, 'Shift_JIS', 'UTF-8');
$RECEIVED_STATEMENT = "$str";

$DISTRIBUTE_CLOSE_HOOK= q{

  local($part1st) = &GET_BUFFER_FROM_FILE("$DIR/part1st");
  local($part2nd) = &GET_BUFFER_FROM_FILE("$DIR/part2nd");

  $RECEIVED_FILE =  "$DIR/received";
  $MyReceivedFile = "$DIR/received$$";
   
    &Copy($RECEIVED_FILE, $MyReceivedFile);
  
      if ($Envelope{'Body'}) { 
        $MY_REC_ID      = sprintf("受付番号:[${BRACKET}:%05d]", $ID);
        from_to($Envelope{'Body'}, 'UTF-8', 'Shift_JIS');

        &Append2($part1st, $MyReceivedFile);
        &Append2($MY_REC_ID, $MyReceivedFile);
        &Append2($part2nd, $MyReceivedFile);
        &Append2($Envelope{'Body'}, $MyReceivedFile);
        $RECEIVED_FILE = $MyReceivedFile;
      }
      #;

  $Envelope{'GH:From:'} = $MAIL_LIST;
  $MY_RECEIVED_STATEMENT=
        sprintf("[${BRACKET}:%05d] ${RECEIVED_STATEMENT}", $ID);
  &SendFile($From_address, $MY_RECEIVED_STATEMENT, $RECEIVED_FILE);

};

  $FML_EXIT_HOOK = q# 
    unlink $MyReceivedFile;
  #;

結局私の思っていたよりも遙かに手の込んだプログラムになりました(笑)
無駄なことをして居るかもしれませんが、ノンプログラマーの私としてはきちんと動作してくれるので問題なしです。

part1st、part2ndのファイルを作る

受付番号を入れる部分を中心にして、文章を前半部と後半部に分けファイルを二分割します。

Received_Statementに件名に使う文字を入れる

何故このタイミングで?と思います。
もっと適切な場所があると思いますが、動いているので気にしません。
そのままだと文字化けするので文字コードを変換しておきます。

#件名に挿入する文章、文字コードを変換して$RECEIVED_STATEMENTに入れる。
$str = "メール受付のご案内";
use Encode 'from_to';
from_to($str, 'Shift_JIS', 'UTF-8');
$RECEIVED_STATEMENT = "$str";

一時的に文章を読み込んでおく

この方法、ヘッダーやフッターを組み込むための手法として紹介されていましたが、local($xxxx)のxxxxを変えればいくらでも一時的に文章を読み込めます。
これが理解出来たのが今回の一番の肝だったかも。

 #自動応答の文章(前半、後半)を一時ファイルに読みこむ
  local($part1st) = &GET_BUFFER_FROM_FILE("$DIR/part1st");
  local($part2nd) = &GET_BUFFER_FROM_FILE("$DIR/part2nd");

仮ファイルを作成する

実は「このパートは必要なのか?」と今でも悩んでいます。
localで一時的に文章を作れるなら、ワザワザ実体のあるファイルを作る必要があるのか?という悩みです。
ただ、ちゃんと動いているので気にしません(笑)
前回は中身のあったreceivedファイルは今回は空っぽにしてあります。
さらに空のファイルをreceived$$という一時ファイルにワザワザコピーしています。
このコピーの作業も今となっては不要?ただ、一時的なファイルを作ってそこで文章を組み立てていくのは好きです。

#空っぽのReceivedファイルから作業用の一時ファイルを作成(必要?)
  $RECEIVED_FILE =  "$DIR/received";
  $MyReceivedFile = "$DIR/received$$";
  &Copy($RECEIVED_FILE, $MyReceivedFile);

文章を組み立てる

件名にも入れる受付文ですが、本文中に挿入するので改めてMY_REC_IDという変数に入れておきます。
文字化けするのでエンコード。

 #自答応答文章の組み立てパート
      if ($Envelope{'Body'}) { 
        #受付番号表示の生成
        $MY_REC_ID      = sprintf("受付番号:[${BRACKET}:%05d]", $ID);
        #メール本文が文字化けするので文字コードを変換
        from_to($Envelope{'Body'}, 'UTF-8', 'Shift_JIS');

一時ファイルとして作成したrecieved$$は空っぽなので、そこに必要な順番で追記していきます。
part1stはファイルの中身、
MY_REC_IDは受付番号、
part2ndはファイルの中身です。
つまり、事前に用意しておいたpart1stとpart2ndの間にMY_REC_IDを挿入している感じです。
既存の文章の一部を置き換えるというのが物凄く難しそうだったので、ヤンマさんのアドバイスでこの手法にたどり着きました。

ついでに「$Envelope Body」(送られてきたメール本文)を追記します。

出来上がったらRECEIVED_FILEに割り当てます。

        #空のrecievedにAppend2で文章を追記していく
        #順に、前半パート、受付番号、後半パート、メール本文
        &Append2($part1st, $MyReceivedFile);
        &Append2($MY_REC_ID, $MyReceivedFile);
        &Append2($part2nd, $MyReceivedFile);
        &Append2($Envelope{'Body'}, $MyReceivedFile);
        #RECEIVED_FILEに出来上がった文章をセット
        $RECEIVED_FILE = $MyReceivedFile;
      }
      #;

メールの送信元、件名、本文をセットして送信

前回と同様です。

 #送信元がadminとか付かないように変更
  $Envelope{'GH:From:'} = $MAIL_LIST;
  #自動応答の件名を作成
  $MY_RECEIVED_STATEMENT=
        sprintf("[${BRACKET}:%05d] ${RECEIVED_STATEMENT}", $ID);
  #自動応答の送信
  &SendFile($From_address, $MY_RECEIVED_STATEMENT, $RECEIVED_FILE);

最後に一時ファイルを削除

received$$は使い終わったので削除しておきます。

  #一時ファイルの削除
  $FML_EXIT_HOOK = q# 
    unlink $MyReceivedFile;
  #;

これで、受付番号を文中に挿入した自動応答の完成です!
いやー、長かった(笑)

頑張った!やり遂げた!ので満足感が高いです。

「ここ直した方が良いよ?」というアドバイス等ありましたらお待ちしてます♪

久しぶりに出勤

おはようございます。 皆様ご機嫌如何ですか? 桂 コヒ蔵です。 被災地のみなさんには心よりお見舞い申し上げます。 一日でも早く暖かく安心できる春が来る事をお祈りしております。 震災後、会社が休業となりその後初出勤です。...

震災後初めて迎える月曜日。

おはようございます。 今日は震災後初めて迎える月曜日です。 各方面、かなりの混乱が発生する可能性があります。 みなさん、どうかいつも以上に気をつけて行動してください。 被災地のみなさん、安否確認や連絡がとれないみなさん。...

こそっ

|`・ω・´)? | ) ミ  さっ

あ、間に合ったw

昨日からの雪で交通状態は最悪。 ってことで、会社に来る時間もぎりぎりになりました。...

iPhone4用スタンド&Dockケーブル

いまさらですが、 昨日iPhone4用のスタンドとDockケーブルを購入しました。 ポイントなのは「バンパー」との併用です! バンパーが大好きって訳ではないのですが、私にとっては現状最も使いやすいケースなのです。 ただ、問題なのがスリムコネクター。...

ひき始めの攻防

日曜日の朝からなんとなく喉が痛いと思っていたのですが、 どうやら風邪のひき始めの様子。 ここで風邪をひいてはなるまいと、早めの葛根湯攻撃! 「風邪VS私」 で激しい攻防戦が続いております(`・ω・´) 2年に一度位3月に大きな風邪を引きまして、...

一年前は?:電器屋新CM

一年前は何をしていたか? とブログを振り返ると、2010年の3月は既にほぼ毎日更新をスタートしていました。 2010年3月7日は日曜日、なので本来ストブロはお休みでしたが、 この日は書き込みがありましたね。...

たった一言でも・・・

たった一言でも、 ストブロを更新し続ける為に、 自分のペースを守る為に、 自分のルールを守る為に、 たった一言でも、 ブログへ投稿するべきなのだろうか? 「おはよ」だけでも、 かきこむべきなのだろうか? それは読んでくれている人を裏切る行為なのか?...

冬が戻ってきました(>_

今朝は冷え込みましたね! こちらでは、また雪が降っちゃいました。 もう三月だけど、春は遠いなぁって感じです。 出勤に時間が掛かってしまった為・・・ 本日はこれにて!ww...

ミニチュアの日

3月2日は「ミニチュア」の日なんだそうです。 3(み) 2(に) の語呂合わせでしょうね。 ・・・ん? だとすると、ミニが付くものなら何でも来いかな? ミニスカートの日 ミニ肉まんの日 ミニミニピザの日 ミニダンボーの日 ミニーマウスの日 ミニ四駆の日...

終わっちゃいますよ!

2月が終わっちゃいますよ!? あっという間に! え、今日28日? 2月最終日じゃないですかΣ( ̄。 ̄ノ)ノ 早かったですねぇ。 もう、今日は2月の余韻に浸って一杯飲みたいと思いますw...

久しぶりの雨

みなさん、雨はお好きですか? 私はINST内では無双の雨好きなのですが、「雨が好き!」っていうと だいたい理解してくれませんw 今朝は私の町では久しぶりのまとまった雨が降っています。 今日は午後まで降り続く予報です。...

0コメント


電器屋Walkerの過去配信のBGMで利用させて頂いております。

ポッドキャスト品質向上、整音テクニック 解説Live

開催のお知らせ

詳細はこちら

国際ポッドキャストの日

International Podcast Day Event

ツキイチ - 隣のポッドキャスト

まとめファンサイト