#!/usr/bin/perl ####################################################################### # formml.cgi # 1999,08 by 良寛 ####################################################################### require './jcode.pl'; # ----------------------------------------------------------------- # requireは'ファイル名'で指定した、サブルーチンライブラリ # を、このプログラムの中に取り込む命令です。この場合、本プ # ログラムと同じディレクトリにある、jcode.pl(フリーソフト) # という日本語コード変換プログラムを取り込んで(結合して) # 普通のサブルーチンのように使います。 # ----------------------------------------------------------------- #=== 初期設定 ======================================================= $sendmail = '/lib/sendmail'; # ----------------------------------------------------------------- # サーバーのメールプログラムのある場所です。プロバイダによ # り少し異なりますので、プロバイダに聞いて確かめてください。 # 上記は、ミンク(鹿児島のプロバイダ)の場合です。 # ----------------------------------------------------------------- $mailto = 'ryokan@po.minc.ne.jp'; # ----------------------------------------------------------------- # フォームに入力されたデータを送る送信先アドレスです。この # 場合、良寛宛に送られてきます。 # ----------------------------------------------------------------- #=== 時刻の取得 ===================================================== ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $mon++; @week = ("日","月","火","水","木","金","土"); $yobi = $week[$wday]; # ----------------------------------------------------------------- # 送信時の時刻を取得します。(perl4.htmlで解説済み) # ----------------------------------------------------------------- #=== フォームデータの受信 =========================================== if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # ----------------------------------------------------------------- # データの送信の方法には、POSTとGETがあります。POSTかGETか # を知るには、環境変数$ENV{'REQUEST_METHOD'}という特殊な変 # 数を用います。 # POSTの場合、 # read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # とすると、$bufferに$ENV{'CONTENT_LENGTH'}で得られる # 長さのデータがSTDINから代入されます。 # GETの場合、 # $ENV{'QUERY_STRING'}から$bufferに代入されます。 # ----------------------------------------------------------------- #=== 受信データの編集 =============================================== @buffer = split(/&/, $buffer); # ----------------------------------------------------------------- # $bufferの内容を文字「&」で分離し、配列@bufferに代入します。 # ----------------------------------------------------------------- foreach $pair (@buffer) { # ----------------------------------------------------------------- # 配列@bufferの要素を一つずつ$pairに代入します。 # ----------------------------------------------------------------- local($name, $value) = split(/=/, $pair); # ----------------------------------------------------------------- # $pairの内容を文字「=」で分離し、ローカル変数$nameと$value # に代入します。 # ローカル変数というのは、そのブロック内だけで有効な変数で、 # ブロックの外で同じ変数名を用いても全く別なものになります。 # 通常、宣言しない変数はグローバル変数(全ての範囲で有効な # 変数)になります。 # ----------------------------------------------------------------- $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # ----------------------------------------------------------------- # +をスペースに置き換え%のついた2桁のデータを16進に変換 # します。 # ----------------------------------------------------------------- &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); # ----------------------------------------------------------------- # name、valueが付く変数すべて($name、@name、%nameなど)を # sjisコードに変換します。 # ----------------------------------------------------------------- $FORM{$name} = $value; # ----------------------------------------------------------------- # 連想配列%FORMに値を代入します。 # ----------------------------------------------------------------- } #=== データエラーの検出 ============================================= if ($FORM{'name'} eq "") { &error("名前の記入がありません。"); } if ($FORM{'mail'} eq "") { &error("アドレスの記入がありません。"); } if ($FORM{'message'} eq "") { &error("感想の記入がありません。"); } # ----------------------------------------------------------------- # 各データが空白の場合サブルーチンerrorを実行します。 # ----------------------------------------------------------------- #=== 改行コード復帰コードを\nにする ================================= $FORM{'message'} =~ s/\r\n/\n/g; $FORM{'message'} =~ s/\r/\n/g; #=== メール送信 ===================================================== open (OUT,"|$sendmail -t"); # ----------------------------------------------------------------- # ハンドルOUTでメールプログラムをオープンします。(パイプ # など、もっと詳しく説明しなければなりませんが)ここではメ # ール送信するときはこのように記述するものだと思ってくださ # い。$sendmailには、 '/lib/sendmail'が代入されています。 # ----------------------------------------------------------------- $send = ""; # 送信データ変数クリア $send .= "To: $mailto\n"; # 送信先 $send .= "From: $FORM{'mail'}\n"; # 送信者のアドレス $send .= "Subject: $FORM{'subject'}\n"; # 件名 $send .= "-------------------------------------------\n\n"; $send .= "送信者:$FORM{'name'}($FORM{'mail'})\n"; $send .= "送信日:$year/$mon/$day/($yobi)$hour:$min:$sec\n\n"; $send .= "感想:\n"; $send .= "$FORM{'message'}\n\n"; $send .= "-------------------------------------------\n"; # ----------------------------------------------------------------- # $sendに送信内容を代入します。 # ----------------------------------------------------------------- &jcode'convert(*send,'jis'); # ----------------------------------------------------------------- # メール送信のコードはjisに決められていますので、jcode.pl # を使って$sendをjisに変換します。*sendは$send、@send、 # %sendなどsendがつく変数すべてをさします。もちろん、ここ # では$sendだけになりますが。 # ----------------------------------------------------------------- print OUT $send; # ----------------------------------------------------------------- # メールプログラムにデータを渡します。 # ----------------------------------------------------------------- close (OUT); # ----------------------------------------------------------------- # メールプログラムをクローズします。 # ----------------------------------------------------------------- #=== 送信後の画面表示とプログラムの終了 ============================= print "Content-type: text/html\n\n"; print "お礼\n"; print "\n"; print "
$mailtoへ送信しました。

\n"; print "
ありがとうございました。
\n"; print "\n"; exit; #=== エラー表示サブルーチン ========================================= sub error { print "Content-type: text/html\n\n"; print "エラー\n"; print "\n"; print "
ERROR\n"; print "

$_[0]\n"; print "

\n"; print "\n"; exit; } # ----------------------------------------------------------------- # サブルーチンへの引数は特殊変数@_に渡されるので、その中の # 一番目の要素$_[0](一つの要素を指定するときは配列@でなく、 # スカラー$になります。)を表示します。 # exitで終了。 # ----------------------------------------------------------------- #======================================================================