ページを選択

ストブロ

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

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

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

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

電器屋Walker10周年記念グッズ

2009年の配信スタート以来、電器屋Walkerは10周年を迎えました。長きにわたるご愛顧とご支援誠にありがとうございます。電器屋Walkerでは10周年記念バッジ&ステッカーを作成しました。こちらはCAMPFIREのパトロンさん限定セット「電器屋Walker...

Velopでネットワークカメラ等の2.4Ghz接続機器を接続する方法

Velopは2.4Ghz及び5Ghzを電波強度などを自立的に判断しながら切り替えて使える非常に便利なWi-Fiルーターです。特に「メッシュWi-Fi」と呼ばれ、同じSSIDを複数の無線アクセスポイントが共用し、複数の無線アクセスポイント(ノード)が一つの編み目...

IPv6環境での外部アクセス方法 その2

「IPv6 (IPoE MAP-E)環境でNASに外部接続出来る様にする環境設定」 前回に引き続きIPv6環境にてSynologyのNAS(今回はDS218J)にアクセスする手順を確認していきます。 1)DS218Jを家庭内LAN環境に接続する。...

IPv6環境での外部アクセス方法 その1 Synology DS218J

電器屋Walker Synology部略してSyno部(シノブ)です。 現在2ベイモデルのNAS DS218Jを使用していますが、半年ほど実用して色々分かってきたことを備忘録としてまとめていきます。 みなさんのNASライフのお役に立てれば幸いです。...

Synology部 略してSyno部 始めます!

電器屋Walkerのコーヒーは外部ストレージそSynologyのDS218Jに頼っています。 ここ数ヶ月実用してきて色々と分かってきたこと、興味が深まったこと、これから学びたいことが出てきました。...

Windows10とBSoDとexfat

突如Windows10でBSoDが表示された。SDカードを挿入したタイミング。 SDカードはOM-D E-M1 MarkⅡで直前までテスト撮影等をしていたもの。OM-D E-M1 MarkⅡではきちんと認識されている。...

F1-LP、F1-SPキャリングケースDIY

OM-D E-M1 MarkⅡでの動画撮影の際にZOOMのF1シリーズがかなり良い感じだという事はYoutubeでもレビューしたとおりです。 マイクカプセルとか色々あるので、キャリングケースを自作しました。 使用したのは「メイホウ」の「アタッシェ B5」...

さくらのレンサバをLet’s Encryptでhttps対応 その6

レンタルサーバーforビギナーズ さくらのレンタルサーバーをLet's Encryptでhttps対応(SSL対応) 「その6 リダイレクト(正規化)の設定。」 みなさんご機嫌いかがですか、久しぶりのレンタルサーバーforビギナーズです。...

さくらのレンサバをLet’s Encryptでhttps対応 その5

レンタルサーバーforビギナーズ さくらのレンタルサーバーをLet's Encryptでhttps対応(SSL対応) 「その5 SSL証明書をwwwありとwwwなしに設定する。」 みなさんご機嫌いかがですか、久しぶりのレンタルサーバーforビギナーズです。...

0コメント


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

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

開催のお知らせ

詳細はこちら

国際ポッドキャストの日

International Podcast Day Event

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

まとめファンサイト