#!/usr/local/bin/perl # 上の行にはスクリプトを設置するサーバ上の perl の場所を記述します。 # システムの管理者に perl のパスを確認して、上の行を書き換えてくださ # い。 ! 記号は必須です。必ずパスの先頭に書き加えてください。 # # # mailform.cgi # http://www.macromedia.com/support/dreamweaver/ # 08/30/97 # # 機能 # ------------------- # mailform.cgi は、HTML のフォームから e-mail の送信をするためのスク # リプトです。このスクリプトは、「F + 番号 + アンダースコア( _ ) # + フィールド名」という形式の名前(たとえば、F01_TextField、 # F02_SelectField)を指定したフィールドの内容を、番号の順番にメール # の本文に出力します。上記以外形式のフィールド名を指定することもでき # ますが、この場合にはフィールドの内容はメールの本文には出力されませ # ん。送信者の名前や e-mail アドレスなどは、「F + 番号 + アンダース # コア( _ )」の付かないフィールド名を指定すれば、メールのヘッダだ # けにフィールドの内容を出力することができます。番号付のフィールド名 # を指定する仕様によって、スクリプト側でフィールドを出力する順番を設 # 定する必要がなくなりました。 # # 環境設定 # ------------------- # $MAIL 変数にはこのスクリプトを設置するサーバ上のメールプログラム # の場所をセットします。sendmail プログラムのパスがわからない場合は、 # which して確認するかサーバの管理者に問い合わせてください。sendmail # を使用してフォームで指定した受信者にメールを送信するには -t オプショ # ンを付ける必要があります。 $MAIL="/usr/lib/sendmail -t"; # # use CGI; $\="\n"; $req=new CGI; print $req->header; # メインイベント # ------------------- %fields=&read_fields; &send_form; &print_thanks_page; exit(0); # サブルーチン # ------------------- sub read_fields{ my(%fields); foreach $f ($req->param){ $name=&clean_name($f); $fields{$f}{name}=$name; $value=&clean_value($f); $fields{$f}{value}=$value; } return(%fields); } # read_fields 関数は、フォームデータからフィールド名と値を読み込みます。 # この関数はclean_name と clean_value を呼び出して、変数名から「F + 番号 # + アンダースコア( _ )」の部分を取り除き、値をひとつなぎに並べます。 sub clean_name{ local($f)=shift; $f=~s/^F\d+_//; $f=~s/_/ /g; return($f); } sub clean_value{ local($f)=shift; local(@val,$val); @val=$req->param($f); $#val-- unless $val[-1]=~/\S/; $val=join(" - ",@val); return($val); } sub send_form{ # return unless $fields{'mailto'}{'value'}=~/^[\w-]+@(yourdomain)\.co\.jp$/; # フォーム入力の HTML ページを改竄して mailto フィールドに細工を加 # え、他のドメインのアドレスに転送するような不正使用を防止するには、 # 上の行の yourdomain をユーザが実際に使っているドメイン名に書き直し # ます。また、ドメインのサフィックスがco.jp以外(ne.jp や ac.jp な # ど)の場合には、実際のものに書き直します。以上の変更が済んだら、# # 記号を削除して上の行を有効にします。 open(MAIL,"| $MAIL") or error("can't send mail"); # 最初に定義した $MAIL を使って sendmail プログラムへのパイプ処理を # MAIL と言うハンドルで開きます。 print MAIL "To: $fields{'mailto'}{'value'}"; print MAIL "From: $fields{'Name'}{'value'} <$fields{'E-mail'}{'value'}>"; print MAIL "Reply-To: $fields{'E-mail'}{'value'}"; print MAIL "Subject: $fields{'subject'}{'value'}"; print MAIL ""; # send_form ルーチンのうち、上の部分は自由にカスタマイズすることがで # きます。このスクリプトでは、フォームのmailto および subject という # 名前(name) の隠しフィールドを使ってメッセージの受信者と subject # を定義しています。スクリプトとフォームで名前が対応するようにしてお # けば、他の情報をメールのヘッダに追加することができます。また、Name # および E-mail フィールドは隠しフィールドではなく、ブラウザの入力 # 欄から入力できるようになってます。フォームがどのように送信されるか # を知るには、testform.html の mailto という名前の隠しフィールドの # e-mail アドレスを自分のアドレスに変更して実際の動作を確認してみて # ください $\=""; $,=" - "; foreach $f (sort keys %fields){ next unless $f=~/^F\d/; if ($fields{$f}{name} =~ /Comment/i) { print MAIL "\n"; print MAIL "$fields{$f}{value}"; print MAIL "\n"; } else{ print MAIL "$fields{$f}{name}: "; print MAIL ($fields{$f}{value} ? $fields{$f}{value} : @{$fields{$f}{'values'}}); print MAIL "\n"; } } # send_form ルーチンの上のセクションでは、フィールドを一つずつ順番に # 処理していきます。 foreach ループの2行目(123 行目)の unless 文で # は、フィールド名が「F + 番号 + アンダースコア(_)」で始まって # いなければ以下の処理をスキップして次のフィールドの処理に移ります。 # これによって、フィールド名の先頭に「F + 番号 + アンダースコア( _ # )」が付いていないフィールドの内容はメッセージの本文には出力され # ません。もし、ヘッダに出力した内容を本文にも出力したい場合には、ヘ # ッダ出力のセクション(102〜105 行目)で参照するフィールド名を「F + # 番号 + アンダースコア( _ )+ フィールド名」に書き直して、フォー # ムから送信するフィールド名もそれに対応した名前に変更します。たとえ # ば 103 行目と 104 行目の E-mail を F02_Email に変更しフォーム送信 # 用 HTML ファイルの E-mail 入力フィールドの定義でも、name="E-mail" # を name="F02_E-mail" に変更します。 # # 124〜128行目は、フィールド名に Comment(大文字と小文字は区別され # ません)という文字列が含まれていれば、そのフィールドの内容の前後に # 空行を出力します。これによってコメントを他のフィールドから離して出 # 力することができます。この処理を適用するフィールドの名前を変更する # には、124 行目の # if ($fields{$f}{name} =~ /Comment/i) { # を # if ($fields{$f}{name} =~ /任意の名前/i) { # のように書き換えます。他のフィールド名にも同じ処理を適用したい場合 # には、同じ行を # if ($fields{$f}{name} =~ /任意の名前/i || $fields{$f}{name} =~ /別の名前/i) { # のように書き換えます。 # # 129〜133 行目はフィールド名に Comment と言う文字列が含まれていない # 場合(124 〜 128 行目が実行されなかった場合)に実行されます。フィー # ルド名のあとにコロンを出力し、値がひとつの場合にはその値を出力し、 # 値が複数の場合には値のリストを出力します。 # $,=""; close(MAIL); } # MAIL というハンドルで開いた sendmail へのパイプ処理を閉じて # send_form 関数を wrap します。メールは指定した受信者に送信され # ます。 sub print_thanks_page{ $\=""; print <<"EOM"; ありがとうございました

ありがとうございました

お忙しいところ弊社のアンケートにご協力頂きありがとうございました。 弊社からのお知らせは、 $fields{'E-mail'}{'value'} 宛てにお送りさせて頂きます。

EOM } # 178 行目からの print_thanks_page 関数は、181 行目から終端文字 EOM # の前の行までの内容を HTTP クライアントに出力します。終端文字を使用 # するクォート記法を用いたことで、クォーテーションマークをバックスラ # ッシュでエスケープする必要がなくなり、出力したい HTML を print 文 # と終端文字の間にそのまま記述することが出来ます。 # # この部分は必要に応じて自由に変更することができます。HTML タグを自 # 由に変更、追加したり、フォームのフィールドやその他の変数を参照して # 出力することができます(ダブルクォーテーションでクォートした場合と # 同じく 180 行目の print 文と終端文字の間に記述した変数名は評価され # ます)。たとえば、部品の注文用のフォームを作成しているなら、この関 # 数によって次のような出力をさせることもできます。 # #

ご注文いただきありがとうございます。ご注文の品物は、以下のご住 # 所に 7 〜 10 日の間に発送致します。

# #
#   $fields{'F01_Name'}{'value'}
#   $fields{'F02_Address1'}{'value'}
#   $fields{'F03_Address2'}{'value'}
#   $fields{'F04_City'}{'value'}, $fields{'F05_State'}{'value'}
#   $fields{'F06_ZIP'}{'value'}
#   
# # この場合、 F01_Name、F02_Address1、F03_Address2、F04_City、 # F05_State および F06_ZIP というフィールドを用意しておくことが必要で # す。こうした、確認ページを用意しておけば、顧客が注文のメールが発送 # されたことを確認したり、入力した内容が正しいことを確認したりするこ # とができます。また、訂正のメールを送信できるように、メールアドレス # を記入しておいたり、トップページへのリンクを用意しておくこともでき # ます。