#!/usr/bin/perl
#      ↑ここにあなたの加入しているプロバイダのperl言語のパスを指定します
#	上記で動作しない場合、｢#!/usr/local/bin/perl｣だと思われます
#-----------------------------------------------------
#↓jcode変換ライブラリ
require 'jcode.pl';

#-----------------------------------------------------
#formmail.cgiを利用したいhtmlファイルに下記を記述してください。
#formmail.cgiの保存場所によりパスを変更してください。
#下記は、利用したいhtmlファイルと同じ場所に保存した場合です。
#
#<form action="/formmail/formmail.cgi" method="POST">
#
#あなたのメールアドレスを指定します。
#このアドレスにメールが届きます
$mailto = 'hara@beam-c.co.jp';

#フォームフィールドに「mailto」が有れば変更される
#転送するメールアドレスが有れば、フォームに
#<input type=hidden name=cc value="xxxx1@xxxxxxx.or.jp,xxxx2@xxxxxx.ne.jp">
#のように「,」で区切って隠しフィールドを作成する

#-----------------------------------------------------
#送信後に戻るページのホームページアドレス
$homepage = 'http://www.beam-c.co.jp';

#-----------------------------------------------------
#送られてきたメールの題名を設定
$subject = 'beamホームページから問い合わせ';
#-----------------------------------------------------
#メールを格納しているサーバーのsendmailパス
#わからない場合はこのまま一度実行してみてください

$sendmail = '/usr/sbin/sendmail';

#上記で動作しない場合、「/usr/lib/sendmail」に変更して下さい。
#それでもエラーが出るときはプロバイダ等に確認してください。
#-----------------------------------------------------
#未記入を許可しない項目名をいくつでも設定できます。
#送信されたフォームの項目に次の項目名(nameプロパティ)
#があり、訪問者が未記入ならば送信を中止します。
#下記の'xxxx'は、フォームの入力項目の<input type="text" size="31" name="xxxx">
#同じものを記述してください。
$check[0] = 'name';
$check[1] = 'おなまえ';
$check[2] = 'お名前';
$check[3] = 'email';
$check[4] = 'メールアドレス';
$check[5] = 'Ｅメール';
$check[6] = '件名';
$check[7] = 'subject';
#-----------------------------------------------------
#ホームページアドレスをチェックする項目名(nameプロパティ)
$hpaddr = 'ホームページ';

#-----------------------------------------------------
#内容確認画面の項目欄の表示を変更する場合、フォームページのnameプロパティ
#name=xxxxxxxx　のxxxxxxxxを変更して下さい。

#文字化けが発生する場合
#cgiとhtmlファイルの漢字コードが異なっていると文字化けを起こすことがあります。
#漢字コードを確認の上、再度アップしなおして下さい。
#=======================================================================================
#			ここからは変更する必要はありません
#=======================================================================================
#日付、時刻、曜日データを取得します
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

#$monには、０から１１の数値で月のデータが入るので１から１２に変換
$month = ($mon + 1);

#現在の日付、時刻のフォーマットを整えます
$date_now = "$year/$month/$mday $hour:$min:$sec";

#フォームからデータを取得します
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); 

#もし、フォームからのデータがなければエラーを出力
if ($QUERY_DATA eq "") { &error(send_error); }

$cc = ''; $bcc = '';

#受け取ったデータをパーツごとに分解
@pairs = split(/&/,$QUERY_DATA);
foreach $pair (@pairs) {
	#不要な文字を削除後、エンコードを変換
	($name, $value) = split(/=/, $pair);
	$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;
	if (!($value =~ /\n/) && $value =~ /\r/) { $value =~ s/\r/\n/g; }

	#項目名に「email」が有れば$emailiにアドレスを格納
	if ($name eq 'email') { $email = $value; }

	#項目名に「subject」が有れば$subjectを変更
	if ($name eq 'subject') { $subject = $value; }

	#すでに確認済みならフラグを立てる
	if ($name eq 'flags') {
		$flags = 1;
	} elsif ($name eq 'mailto') {
		$mailto = $value;
	} elsif ($name eq 'cc') {
		$cc = $value;
	} elsif ($name eq 'bcc') {
		$bcc = $value;
	} else {
		#受け取ったデータをjisコードに変換（メール転送用）
		&jcode'convert(*name,'sjis');
		&jcode'convert(*value,'sjis');
		$name =~ s/</&lt;/g;
		$name =~ s/>/&gt;/g;
		$name =~ s/"/&quot;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		$value =~ s/"/&quot;/g;
		push(@NAME,$name);
		push(@VALUE,$value);
		foreach $buff (@check) {
			if ($buff eq $name) {
				if ($value eq '') { &error(bad_data); }
			}
		}
		if ($hpaddr eq $name) {
			if (!($value =~ /http:\/\/(.*)\.(.*)/i)) { &error(bad_data); }
		}
	}
}

#メールアドレスの書式をチェック
#差出人メールアドレスがなければ｢不明｣にする
if (!($email =~ /.+\@.+\..+/)) { $email = "nomail\@xxx.xxx.or.jp"; }
#題名をメール送信用jisに変換
&jcode'convert(*subject,'jis');
#項目数を数える
$count = @NAME;

#確認済みならメールを送信する
if ($flags) {
	$msg ="DATE = $date_now\n";
	$msg .= "AGENT = $ENV{'HTTP_USER_AGENT'}\n";
	$msg .= "----------------------------------------------------\n\n";
	foreach (0..$count-1) {
		$msg .= "$NAME[($_)] = $VALUE[($_)]\n";
	}
	$msg .= "----------------------------------------------------\n";
	&jcode'convert(*subject,'jis');
	&jcode'convert(*msg,'jis');
	if (&sendmail($subject, $email, $mailto, $cc, $bcc, $msg)) { &error(send_mail); }
	else { &error(no_error); }
	exit;
} else {
	#確認ページを生成
	print "Content-type: text/html\n\n";
	print "<html><head><title>formmail</title></head>\n";
	print "<body bgcolor=#FFFFFF><h1>内容確認</h1>\n";
		print "<div align=center><center>\n";
		print "<form method=post action=formmail.cgi>\n";
		if ($cc ne '') { print "<input type=hidden name=cc value=\"$cc\">\n"; }
		if ($bcc ne '') { print "<input type=hidden name=bcc value=\"$bcc\">\n"; }
		print "<table border width=80%><tr>\n";
			print "<td align=center>項目</td>\n";
			print "<td align=center>内容</td></tr>\n";
			foreach (0..$count-1) {
				if ($VALUE[$_] ne '') {
					print "<input type=hidden name=\"$NAME[($_)]\" value=\"$VALUE[($_)]\">\n";
					print "<tr><td>$NAME[($_)]</td>\n";
					if ($VALUE[($_)] =~ /\n$/) { chop($VALUE[($_)]); }
					print "<td>$VALUE[($_)]</td></tr>\n";
				}
			}
		print "</table>\n";
	print "<p><input type=hidden name=flags value=1>\n";
	print "<input type=submit value='確認 OK メールに送信'><p>\n";
	print "</form>\n";
	print "<hr><i>送信先：<a href=\"mailto:$mailto\">$mailto</a><i>\n";
	print "</body></html>\n";
	exit;
}
#=======================================================================================
sub sendmail {
	local($subject, $from, $to, $cc, $bcc, $body) = @_;
	local(@TO) = split(/\,/, $to);
	local(@CC) = split(/\,/, $cc);
	local(@BCC) = split(/\,/,$bcc);
	local($attach_file) = '';
	local($mailto) = '';
	local($i);
	$i = 1;
	foreach $ml (@TO, @CC, @BCC) {
		if ($ml =~ /([#-9A-~\-\_]+\@[#-9A-~\-\_\.]+)/) {
			if ($i == 1) { $mailto = "$1"; }
			else { $mailto .= "\,$1"; }
		}
		$i++;
	}
	if (!$mailto) { return(1); }
	if (!open(MAIL,"| $sendmail -t -n -oi $mailto")) { return(1); }
	print MAIL "FormMailer: FormMail v1.5\n";
	if (!$bcc) { print MAIL "To: $to\n"; }
	print MAIL "From: $from\n";
	print MAIL "CC: $cc\n" if $cc;
	print MAIL "Subject: $subject\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "Content-Type: text/plain;\n\n";
	print MAIL $body;
	print MAIL "\n";
	close(MAIL);
	0;
}

#=======================================================================================


#送信完了あるいはエラーメッセージを変更する場合、下記$msg='xxxxxxxx'の#xxxxxxxxを変更して下さい。

#=======================================================================================

sub error {
	$error = $_[0];
	if ($error eq 'no_error')	{ $msg = 'お問合せありがとうございました。正常に送信しました。'; }
	elsif ($error eq 'bad_email')	{ $msg = '<p><b>ＥＲＲＯＲ</b></p>メールアドレスが不正です。'; }
	elsif ($error eq 'bad_data')	{ $msg = '<p><b>ＥＲＲＯＲ</b></p>最低限度必要な項目が記入されていません。'; }
	elsif ($error eq 'send_mail')	{ $msg = '<p><b>ＥＲＲＯＲ</b></p>メールの送信に失敗しました。'; }
	else { $msg = '<p><b>ＥＲＲＯＲ</b></p>原因不明のエラーで処理を継続できません。'; }
	print "Content-type: text/html\n\n";
	print "<html><head><title>formmail</title></head>\n";
	print "<body bgcolor=#FFFFFF>\n";
	print "<div align=center><center>\n";
	print "<p>　</p><p>　</p>\n";
	print "<table border=5 width =70%><tr>\n";
		print "<td align=center><p>　</p>\n";
		print "<p><font size=6><b><i>$msg</i></b></font></p>";
		print "<p><a href=$homepage>[ホームに戻る]</font></a></p><p>　</p></td>\n";
	print "</tr></table>\n";
	print "</center></div>\n";
	print "<p align=right><font size=2><a href=http://www2.inforyoma.or.jp/~terra/>Formmail v1.5 Terra</a></font></p>\n";
	print "</body></html>\n";
	exit;
}
