ページを選択

ストブロ

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;
  #;

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

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

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

PSNひっそりと再開

個人情報流出が問題となってサービスを停止していたプレイステーションネットワーク(通称:PSN)が一昨日5月28日ひっそりと再開しました。 ニュース報道ではサービス停止と情報流出の話題を大々的に取り上げたのに、 再開についてはほぼスルー?...

もふ・・・

今日はモフ曜日です(`・ω・´) 以上(/ω\) イヤン 桂 コヒ蔵でしたー( ^o^)ノ

DAIGORO with you, and me.

俺とおまえと どんどんっ♪ だいごろおー♪ ・・・ 焼酎はあまり好きじゃないですけど(/ω\) イヤン 最近「RUSE」というゲームにはまっています。 RTS(リアルタイムシミュレーションとか、リアルタイムストラテジーっていうのかな?)...

HDDデータの完全消去

昨日の続きですけど、パソコンを手放す際にはHDDを完全消去して個人情報などのデータが外部に漏れるのを防ぎたいですよね。 あと捨てるだけ、っていう状態ならHDD取り出してハンマーでゴチンゴチンやっちゃってくださいw...

週末始末記

なにやらこの週末はばたばた、ばたばた・・・ バタコさんかっ! コヒ蔵です( ・`ω・´)キリッ ってくらいばたばたでした。 土曜日出勤だったので、週末は土曜の夜から。 友人がパソコンを処分するっていうので、データの消去作業のお手伝い。...

2010/05/20は何を?

今日は眠たくてネタもないので去年の今頃は?とねじ巻きねじ巻き。 2010年05月20日は「夢か幻か・・・」 昨日我が家の無線LAN環境をちょっといじる必要があり、 でいじっていました。 無線LANに関してはこれまでずいぶんと頭を悩ませ、...

ジャンボ!

ドリームジャンボでしたか? 発売中ですよね。 ・・・  どの番号が当たるのか、こっそり教えてくれませんか?(`・ω・´) ・・・  当たった番号と私の番号、交換しませんか!(`・ω・´) ・・・  私に油田をちょうだい?(*ノωノ)キャ...

扇子を下さい。

レゴブロックを組み立てる的なセンスや粘り強さ、集中力は結構ある方だと思います。 いちから勉強すれば良いんでしょうが、サンプルコードやパターン学習、トライアンドエラーで XHTMLを書いたり。...

春雨ダイエット

夕食のコントロールを初めて・・・もう2年くらいにはなっていると思うのですが、 当初MAX85kg位あった私の体重も、時間をかけてゆっくりと降下し 一時71kg台まで下がりました。 そこから時間をかけてゆっくりと上昇し74kgに。 これはやばい!とWii...

コーヒーのノリノリEnglish

やぁ、みんな! 今日もコーヒー先生のノリノリEnglishの時間だよ! ちゃーんと復習してきたかなっ? ははは、ジョークさぁ! だって今日が初めてだもんな!w さて、早速今日の日常生活にガチで役に立つ バリュアボーなフレーズをスタディーして行こうぜ!...

iPhone Appって簡単に作れるのかな?

なんとなく、 なんとなくそう思う時があります。 iPhonAppって簡単に作れるのかな?って。 何十万本とAppはあるそうですが、なかなか自分にジャストミートっていうの探すの大変ですよね。 だったら作れたら良いのに。みたいなw...

パソコンうるさいw

MBAを買って一番気がついたことは・・・もとからあったデスクトップPCの騒音の大きさw 排熱の為のファンがギュンギュン回っている訳で、 慣れちゃうとなんていう事はないですが、比較すると顕著ですよね。...

0コメント


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

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

開催のお知らせ

詳細はこちら

国際ポッドキャストの日

International Podcast Day Event

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

まとめファンサイト