メールデータの作成

HTMLフォームから入力されたデータと、外部ファイルから読み込んだ設定内容を反映したメールデータを作成します。

メールデータは、プログラム設計で決めたように、テンプレートを読み込む形で管理者用とお問い合わせの控え用の2種類作成するようにします。

  1. サンプル
  2. ダウンロード
  3. 解説

サンプル

今回もいつものように、3種類の入力フォームを用意しました。

Shift_Jisコードの入力フォーム。
EUCコードの入力フォーム。
UTF-8コードの入力フォーム。

実際にデータを入力して試してみてください。

前の段階まで作成したプログラムがそのまま生きてるので、入力しないで送信ボタンを押すとエラーメッセージが出ます。

何か適当に入力して送信ボタンを押してみてください。

管理者に送信されるメールデータが作成されます。

さらに、確認メールを送るチェックボックスをオンにした場合は、控え用に送信されるメールデータも作成されます。

<戻る>

ダウンロード

サンプルプログラムをダウンロードするにはここをクリックします。

ZIP形式で圧縮されているので解凍作業が必要です。

改行コードはWindows形式です。

文字コードは、Perl/CGIプログラム本体および各種設定ファイル、シフトジスバージョンの入力フォーム、thanks.htmlはShift_Jisコードです。

もちろんEUCバージョンの入力フォームはEUC、UTF-8バージョンの入力フォームはUTF-8コードになっています。

解説

外部ファイルのメールテンプレートを読み取り、設定内容や入力項目を挿入しメールデータを作成します。

メールファイル

メールファイルは、管理者に通知するものと、訪問者が控えとして受け取るものとの2種類作成するので、2つ用意します。

管理者通知用のメールファイルは、「infomail.txt」です。

確認用に通知するメールファイルは、「resmail.txt」です。

フォーマット

メールファイルのフォーマットは、以下のようになっています。

1行目は表示名(送信者名)です。
2行目はメールタイトルです。
3行目以降は、メール本文がきます。

挿入項目

各メールファイルを見ていただければわかるように、氏名やお問い合わせ内容といった個別情報を挿入する部分は、「%%キー%%」という形になっています。

キー部分は、メールフォームCGIスクリプト内で作成する連想配列のキーに対応するようになっています。

set関数

メールファイルを読み込み、個別の情報を挿入するのは、「mail.pl」内のset関数が担当しています。

引数には、読み込むメールファイルまでのパスと、挿入する情報を格納したリファレンス形式の連想配列をわたします。

戻り値には、「送信者名」「メールタイトル」と「メール本文」が作成されたリファレンス形式の連想配列が返されます。

処理の流れ

この関数の処理内容については、難しいところはないと思います。

1、ファイルオープン

指定されたファイルパスでファイルをオープンします。

もし、ファイルをオープンできなかったら、「or」以降のreturn関数が実行され終了です。

ファイルをオープンできれば、whileループを使って1行ずつ読み込みます。

2、改行コードの削除

まずは、改行コードを削除します。

「tr/\x0D\x0A//d;」という部分がそうです。

3、挿入処理

各挿入情報を格納した連想配列のキーと、メールファイルの挿入部分のキーが対応するようになっているので、各キーの文字列を手がかりに置換演算子を使って挿入していきます。

while (my($key, $value) = each %{$input}) {
my $pattern = '%%' . $key . '%%';
s/$pattern/$value/;
}

メールファイルの1行ずつに対して、すべての挿入情報のキーを試していきます。

もっと高速化を狙うのであれば、あらかじめ「%%」がその行に存在するかどうかをパターンマッチで調べておき…。

もしなければ、スキップさせるという手もあります。

4、配列に格納

個別情報を挿入し、改行コードを削除したメールファイルを、1行ずつ配列変数に格納していきます。

「push (@file, $_);」部分がそうですね。

改行コードの削除から、ここまでの処理が、メールファイルの行数分だけ繰り返されます。

そして、すべてのメールファイルの行を読み取ったら、メールファイルを閉じます。

5、各メールパートを作成

メールの「送信者名」「タイトル」と「本文」部分を作成します。

$mail{sender} = shift @file;
$mail{subject} = shift @file;
$mail{body} = join("\n", @file);

前述しましたように、メールファイルの1行目には「送信者名」、2行目には「タイトル」、3行目からは「本文」なので…。

配列の最初の要素には「送信者名」、次の要素には「タイトル」、残りの要素には「本文」が入っていることになるわけです。

なので、上記のようにshift関数で最初とその次の要素を移し、残りの要素はjoin関数で改行コード「\n」を使って連結させて取り出します。

これで、各メールパート「送信者名」「タイトル」と「本文」の連想配列が完成したわけです。

戻り値

最後は、完成しました連想配列のリファレンスを返します。

「return \%mail;」がそうですね。

date関数

「script.pl」内のdate関数は、現在の日付と時刻を取得します。

さらに、日付の書き方などを細かく指定できるように、メールファイルの各情報挿入と同じやり方で、日付をあらわす文字列を作成します。

現在の時間の取得には、localtime関数を使っています。

localtime関数については、メルマガでも説明したのでそちらを参照してください。

取得しました各時間情報の挿入についても、メールファイルの挿入方法と同じやり方で置換演算子を使っています。

引数は、日付フォーマットを指定した文字列です。

戻り値は、作成しました日付文字列です。

メイン処理

メイン処理では、各メールデータを作成するのに必要な、連想配列を生成しています。

ここでは、普通に連想配列に代入させたり、前述のset関数などを呼び出しているだけですから、とくに注目すべきところはありません。

<戻る>