#!/usr/bin/perl
#+------------------------------------------------------+
#|≪BooMail ver.1.4≫                                   |
#|Copyright : ＣＧＩブー                                |
#|URL       : http://boocgi.org/                        |
#|modified  : 2008/03/30                                |
#+------------------------------------------------------+
#|★注意事項                                            |
#|１．このスクリプトはフリー素材です。                  |
#|２．このスクリプトを使用したことによって生じる        |
#|    いかなる損害に対して作者は一切の責任を負いません。|
#+------------------------------------------------------+
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$Cgi            = 'boomail.cgi';
$CgiName        = 'boomail';
$LayoutFile     = 'layout.html';
$MailFormData   = 'mailformdata.txt';
$DesignData     = 'design.txt';
$NecessaryMark  = '☆';
$TextLimit1     = '200';
$TextLimit2     = '1000';
$SubjectLimit   = '40';
$FromMailLimit  = '100';
$TabooTag       = '<|>|{|}'; #禁止タグ
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$Copyright      = "<a href=\"http://boocgi.org/\">$CgiName by ブーＣＧＩ</a>";
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
use CGI;
$qu = new CGI;
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$mission    = $qu->param('mission');
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#print"Content-type:text/html\n\n";
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#スパム対策チェック
#POSTのみ受付ならOK
if($ENV{'REQUEST_METHOD'} ne 'POST'){
	&mailform_view;
	exit;
}
if($mission eq 'mail_go'){&mail_go;}
else                     {&mailform_view;}
exit;
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub mailform_view{
	#------------------------
	my($flag,$mes) = @_;
	#------------------------
	my($from_mail,$subject);
	if($flag == 1){#メール送信内容に不備があった場合
		$from_mail = $qu->param('from_mail');
		$subject   = $qu->param('subject');
	}
	#------------------------
	open(MFD,"<$MailFormData");
	my@mfd=<MFD>;
	close(MFD);
	#------------------------
	my($typ,$tom,$sep,$tit,$hou,$sub,$sul,$fml,$afm,$taw,$lit) = split(/<>/,@mfd[0]);
	#------------------------
	my$title = $tit;
	#------------------------
	#各種設定データ
	my$co;
	my$mailform;
	$mailform .= "<form action=\"$Cgi\" method=\"post\" name=\"mailform\">\n";
	$mailform .= "<BR><BR><BR>\n";
	$mailform .= "<h2>$NecessaryMark は必須項目です。</h2>\n";
	$mailform .= "<table align=\"center\">\n";
	if(!$sub){#デフォルトの件名がなければ件名記入は必須
		$mailform .= "<tr>\n";
		$mailform .= "<td>$NecessaryMark 件名</td>\n";
		$mailform .= "<td><input type=\"text\" name=\"subject\" size=\"40\" maxlength=\"$sul\" value=\"$subject\"></td>\n";
		$mailform .= "</tr>\n";
	}
	#送信者のメールアドレスも必須
	$mailform .= "<tr>\n";
	$mailform .= "<td>$NecessaryMark メールアドレス</td>\n";
	$mailform .= "<td><input type=\"text\" name=\"from_mail\" size=\"40\" maxlength=\"$fml\" value=\"$from_mail\"></td>\n";
	$mailform .= "</tr>\n";
	for($co=1;$co<@mfd;$co++){
		my($rank,$question,$koumoku,$limit,$necessary,$text_or_area,$size,$default_value,$text_limit) = split(/<>/,@mfd[$co]);
		my@kou = split(/<br>/,$koumoku);
		#...........................
		#メール送信内容に不備があった場合パラメータ取得
		my($que,@ques);
		if($flag == 1){
			if($limit > 1){#checkboxの場合。（複数選択可能）
				@ques = $qu->param("question_$co");
			}else{#checkbox以外
				$que  = $qu->param("question_$co");
			}
		}
		#...........................
		my$ko;
		if(!$koumoku){
			#...........................
			if($flag == 1){
				$default_value = $que;
			}
			#...........................
			if($text_or_area == 1){#text
				$ko .= "<input type=\"text\" name=\"question_$co\" size=\"$size\" value=\"$default_value\">\n";
			}elsif($text_or_area == 2){#textarea
				my($cols,$rows) = split(/,/,$size);
				$default_value =~s/<br>/\n/g;
				$ko .= "<textarea name=\"question_$co\" cols=\"$cols\" rows=\"$rows\">$default_value</textarea>\n";
			}
		}else{
			if($limit == 1){
				if(@kou > 5){#select
					$ko .= "<select name=\"question_$co\">\n";
					$ko .= "<option value=\"\">▼選択</option>\n";
					foreach(@kou){
						#...........................
						my$sel;
						chomp($_);
						if(quotemeta($_) eq quotemeta($que)){
							$sel = ' selected';
						}
						#...........................
						$ko .= "<option value=\"$_\"$sel>$_</option>\n";
					}
					$ko .= "</select>\n";
				}else{#radio
					foreach(@kou){
						#...........................
						my$che;
						chomp($_);
						if(quotemeta($_) eq quotemeta($que)){
							$che = ' checked';
						}
						#...........................
						$ko .= "<input type=\"radio\" name=\"question_$co\" value=\"$_\"$che>：$_<br>\n";
					}
				}
			}elsif($limit > 1 || !$limit){#checkbox
				foreach(@kou){
					#...........................
					my$che;
					my$cc;
					for($cc=0;$cc<@ques;$cc++){
						#my$cw = @ques[$cc];
						my$cw = quotemeta(@ques[$cc]);
						if($_ =~/$cw/){
							$che = ' checked';
						}
					}
					#...........................
					$ko .= "<input type=\"checkbox\" name=\"question_$co\" value=\"$_\"$che>：$_<br>\n";
				}
			}
		}
		#必須項目マーク
		my$mark;
		if($necessary == 1){
			$mark   = $NecessaryMark;
		}
		$mailform .= "<tr>\n";
		$mailform .= "<td>$mark $question</td>\n";
		$mailform .= "<td>$ko</td>\n";
		$mailform .= "</tr>\n";
	}
	my$cou = @mfd;
	$mailform .= "<input type=\"hidden\" name=\"forScore\" value=\"$cou\">\n";
	#
	$mailform .= "</table>\n";
	$mailform .= "<p>\n";
	$mailform .= "<input type=\"hidden\" name=\"mission\" value=\"mail_go\">\n";
	$mailform .= "<input type=\"submit\" value=\"メール送信\">&nbsp;&nbsp;\n";
	$mailform .= "<input type=\"reset\" value=\"リセット\">\n";
	$mailform .= "</p>\n";
	$mailform .= "</form>\n";
	#------------------------
	print "Content-type:text/html\n\n";
	#------------------------
	open(LA,"<$LayoutFile");
	my@lay=<LA>;
	close(LA);
	#------------------------
	my$layout = join("",@lay);
	#
	my($typ,$tom,$sep,$tit,$hou,$sub,$sul,$fml,$afm,$taw,$lit) = split(/<>/,@mfd[0]);
	my$Mailform;
	  $Mailform .= "<h1>$title</h1>\n";
	  if($mes){
	  	$Mailform .= "<div class=\"mes\">\n";
	  	$Mailform .= "$mes\n";
	  	$Mailform .= "</div>\n";
	  }
	  $Mailform .= "$mailform\n";
	  $Mailform .= "<p><a href=\"$hou\">HOME<\/a></p>\n";
	#title
	$layout =~s/<!--title-->/$title/g;
	#メールフォーム
	$layout =~s/<!--mailform-->/$Mailform/g;
	if($layout =~/<!--copyright-->/){
		$layout =~s/<!--copyright-->/$Copyright/i;
	}else{
		$layout =~s/<\/body>/$Copyright\n<\/body>/i;
	}
	#スタイルシート
	my$StyleSheet = &stylesheet;
	$layout =~s/<!--stylesheet-->/$StyleSheet/g;
	#5秒後にHOMEに移動(多重送信防止のため)
	if($flag == 2){
		my$Meta = "<meta http-equiv=\"refresh\" content=\"5;url=$hou\">";
		$layout =~s/<!--meta-->/$Meta/g;
	}
	#------------------------
	print $layout;
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub mail_go{
	#------------------------
	use Jcode;
	#------------------------
	open(MFD,"<$MailFormData");
	my@mfd=<MFD>;
	close(MFD);
	#------------------------
	my($typ,$tom,$sep,$tit,$hou,$sub,$sul,$fml,$afm,$taw,$lit) = split(/<>/,@mfd[0]);
	#------------------------
	my$from_mail = $qu->param('from_mail');
	my$subject   = $qu->param('subject');
	#受け取った件名の文字制限数チェック*******************#
	my($check,$me) = &text_limit_check($subject,$sul);    #
	my$mes = '「件名」の欄 ： ' . $me;                    #
	if($check == 1){                                      #
		&mailform_view(1,$mes);                           #
		exit;                                             #
	}                                                     #
	#受け取ったメールアドレスの文字制限数チェック*********#
	my($check,$me) = &text_limit_check($from_mail,$fml);  #
	my$mes = '「メールアドレス」の欄 ： ' . $me;          #
	if($check == 1){                                      #
		&mailform_view(1,$mes);                           #
		exit;                                             #
	}                                                     #
	#受け取った件名をチェック*****************************#
	my($check,$me) = &taboo_check($subject,1);            #
	my$mes = '「件名」の欄 ： ' . $me;                    #
	if($check == 1){                                      #
		&mailform_view(1,$mes);                           #
		exit;                                             #
	}                                                     #
	#受け取ったメールアドレスをチェック*******************#
	my($check,$me) = &mail_check($from_mail,1);           #
	my$mes = '「メールアドレス」の欄 ： ' . $me;          #
	if($check == 1){                                      #
		&mailform_view(1,$mes);                           #
		exit;                                             #
	}                                                     #
	#*****************************************************#
	#各種設定データ
	my$co;
	my$message;
	for($co=1;$co<@mfd;$co++){
		my($rank,$question,$koumoku,$limit,$necessary,$text_or_area,$size,$default_value,$text_limit) = split(/<>/,@mfd[$co]);
		my$que;
		if($limit > 1){#checkboxの場合。（複数選択可能）
			my@ques = $qu->param("question_$co");
			$que = join(' / ',@ques);
		}else{#checkbox以外
			$que = $qu->param("question_$co");
		}
		#受け取った項目のデータの文字制限数チェック***********#
		my$limit = $text_limit;                               #
		if(!$text_limit){                                     #
			if($text_or_area == 1){                           #
				$limit = $TextLimit1;                         #
			}elsif($text_or_area == 2){                       #
				$limit = $TextLimit2;                         #
			}else{                                            #
				$limit = $TextLimit2;                         #
			}                                                 #
		}                                                     #
		my($check,$me) = &text_limit_check($que,$limit);      #
		if($check == 1){                                      #
			$mes = '「' . $question . '」の欄 ： ' . $me;     #
			&mailform_view(1,$mes);                           #
			exit;                                             #
		}                                                     #
		#受け取った項目のデータをチェック*********************#
		my($check,$me,$mes);                                  #
		if($text_or_area == 1){                               #
			if($default_value =~/^http:\/\//){                #
				($check,$me) = &url_check($que,$necessary);   #
				$mes = $me;                                   #
			}else{                                            #
				($check,$me) = &taboo_check($que,$necessary); #
				$mes = '「' . $question . '」の欄 ： ' . $me; #
			}                                                 #
		}else{                                                #
			($check,$me) = &taboo_check($que,$necessary);     #
			$mes = '「' . $question . '」の欄 ： ' . $me;     #
		}                                                     #
		if($check == 1){                                      #
			&mailform_view(1,$mes);                           #
			exit;                                             #
		}                                                     #
		#*****************************************************#
		$question =~s/<br>/\n/g;
		$message .= "----------------------------------------\n";
		$message .= "[$question]\n$que\n";
	}
	#------------------------
	#IP
	my$ip = $ENV{'REMOTE_ADDR'};
	$message .= "----------------------------------------\n";
	$message .= "[送信ホスト]\n$ip\n";
	$message .= "----------------------------------------\n";
	#------------------------
	#Cookieを取得（一定時間送信禁止のため）*************************************#
		my$cookie = &get_cookie;                                                #
		#Cookie 検査                                                            #
		if($cookie){#boomail=limit のcookieがあったらexit                       #
			my$mes = "一定時間内($lit分)のメール送信は禁止されています。\n";    #
			&mailform_view(1,$mes);                                             #
			exit;                                                               #
		}                                                                       #
	                                                                            #
	#クッキーをセット（一定時間送信禁止のため）                                 #
		my$cookie  = "boomail=limit;";                                          #
		&set_cookie($lit,$cookie);                                              #
	#***************************************************************************#
	#
	my($typ,$tom,$sep,$tit,$hou,$sub,$sul,$fml,$afm,$taw,$lit) = split(/<>/,@mfd[0]);
	if(!$subject){
		$subject = $sub;
	}
	#------------------------
	$subject = jcode($subject)->mime_encode();
	$message = jcode($message)->jis;
	#メール送信
	if(!open(MAIL,"| $sep -t")){
		&mailform_view(1,"メールを送信できませんでした。");
		exit;
	}
	print MAIL "To: $tom\n";
	print MAIL "From: $from_mail\n";
	print MAIL "Subject: $subject\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n\n";
	print MAIL "$message\n";
	close(MAIL);
	#------------------------
	my$mes = "メールを送信しました。<br>$afm\n";
	&mailform_view(2,$mes);
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub set_cookie{
	my($limit_min,$cookie) = @_;
	my($se,$mi,$ho,$da,$mo,$ye,$we) = gmtime(time + ($limit_min * 60));
	my@mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	my@wee = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	#有効期限のフォーマットに従って、$expires を作成
	my$expires = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",$wee[$we],$da,$mon[$mo],$ye+1900,$ho,$mi,$se);
	#Cookieの作成
	print "Set-Cookie: $cookie expires=$expires\n";

}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub get_cookie{
	my@cook = split(/;/,$ENV{'HTTP_COOKIE'});
	my%cookie;
	foreach my$coo(@cook){
		my($key,$val) = split(/=/,$coo);
		$cookie{$key} = $val;#連想配列にセット
	}
	return $cookie{'boomail'};
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub mail_check{
	#メールアドレスチェック
	my($mail,$nes) = @_;
	my$mes;
	my$check = 0;
	if(!$mail && $nes ==1){
		$check = 1;
		$mes   = 'メールアドレスが空白です。';
	}elsif($mail !~/^[\w@\.\-]+$/){#^[\w@\.\-]+$
		$check = 1;
		$mes   = 'メールアドレスが不自然です。';
	}
	return ($check,$mes);
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub url_check{
	#URL文字列チェック
	my($url,$nes) = @_;
	my$mes;
	my$check = 0;
	if($nes == 1){
		if(!$url || $url eq 'http://'){
			$check = 1;
			$mes   = 'URLが空白です。';
		}elsif($url !~/^http:\/\/[\w\@\.\$\,\;\:\&\=\?\!\*\~\@\#\(\)\-\/]+$/ || $url =~/[<>\|`\[\]\{\}'"\^\\]+/){
			$check = 1;
			$mes   = 'URLが不自然です。';
		}
	}else{
		if($url && $url ne 'http://' && ($url !~/^http:\/\/[\w\@\.\$\,\;\:\&\=\?\!\*\~\@\#\(\)\-\/]+$/ || $url =~/[<>\|`\[\]\{\}'"\^\\]+/)){
			$check = 1;
			$mes   = 'URLが不自然です。';
		}
	}
	return ($check,$mes);
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub taboo_check{
	#禁止ワードチェック
	#------------------------
	open(MFD,"<$MailFormData");
	my@mfd=<MFD>;
	close(MFD);
	#------------------------
	my($typ,$tom,$sep,$tit,$hou,$sub,$sul,$fml,$afm,$taw,$lit) = split(/<>/,@mfd[0]);
	my$Taboo = $taw;
	$Taboo =~s/<br>/\|/g;
	#------------------------
	my($str,$nes) = @_;
	my$mes;
	my$check = 0;
	if(!$str && $nes ==1){
		$check = 1;
		$mes   = '空白です。';
	}elsif($str =~ /$Taboo|$TabooTag/){
		#禁止ワードチェック無効 2008-06-16 T.Horimoto
		$check = 0;
		$mes   = '禁止ワードが含まれています。';
	}
	return ($check,$mes);
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub text_limit_check{
	#文字制限数チェック
	my($str,$limit) = @_;
	my$mes;
	my$check = 0;
	if(length($str) > $limit){
		$check = 1;
		$mes   = '文字制限数がオーバーしています。';
	}
	return ($check,$mes);
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub stylesheet{
	#------------------------
	open(DE,"<$DesignData");
	my@de=<DE>;
	close(DE);
	#
	$title_size         = @de[0]; #タイトルの文字サイズ
	$title_color        = @de[1]; #タイトルの文字の色
	$back_color         = @de[2]; #背景色
	$back_image         = @de[3]; #背景画像
	$form_line1         = @de[4]; #外枠の線の色
	$form_line2         = @de[5]; #内枠線の色
	$form_line1_width   = @de[6]; #外枠の線の太さ
	$form_line2_width   = @de[7]; #内枠線の太さ
	$form_back_color    = @de[8]; #背景色
	$form_font_color    = @de[9]; #文字の色
	$form_font_size     = @de[10];#文字サイズ
	$link_color         = @de[11];#未訪問
	$link_visited_color = @de[12];#訪問済
	$link_hover_color   = @de[13];#アクティブ
	$mes_line           = @de[14];#送信後メッセージ外枠の線の色
	$mes_line_width     = @de[15];#送信後メッセージ外枠の線の太さ
	$mes_back_color     = @de[16];#送信後メッセージの背景色
	$mes_font_color     = @de[17];#送信後メッセージの文字色
	$mes_font_size      = @de[18];#送信後メッセージの文字サイズ
	#
	$title_size         =~s/\n//g;
	$title_color        =~s/\n//g;
	$back_color         =~s/\n//g;
	$back_image         =~s/\n//g;
	$form_line1         =~s/\n//g;
	$form_line2         =~s/\n//g;
	$form_line1_width   =~s/\n//g;
	$form_line2_width   =~s/\n//g;
	$form_back_color    =~s/\n//g;
	$form_font_color    =~s/\n//g;
	$form_font_size     =~s/\n//g;
	$link_color         =~s/\n//g;
	$link_visited_color =~s/\n//g;
	$link_hover_color   =~s/\n//g;
	$mes_line           =~s/\n//g;
	$mes_line_width     =~s/\n//g;
	$mes_back_color     =~s/\n//g;
	$mes_font_color     =~s/\n//g;
	$mes_font_size      =~s/\n//g;
	#------------------------
	my$style=<<SCR;
<style type="text/css"><!--
	body{
	 background-color:$back_color;
	 background-image:url($back_image);
	 margin:10px 10px 20px 10px;
	}
	h1{
	 font-size:$title_size;
	 color:$title_color;
	 margin:10px 2px 20px 2px;
	 padding:2px;
	 text-align:center;
	}
	h2{
	 font-size:85%;
	 color:$back_color;
	 margin:2px;
	 padding:2px;
	 font-weight:normal;
	 text-align:center;
	}
	p{
	 font-size:85%;
	 margin:2px;
	 padding:2px;
	 font-weight:normal;
	 text-align:center;
	}
	/*レイアウト(位置)*/
	div.mailform{
	 width:100%;
	 margin:10px 20px 5px 20px;
	 padding:2px;
	 text-align:center;
	}
	/*メールフォーム テーブル*/
	table{
	 border-collapse:collapse;
	 margin:0px;
	 background-color:$form_back_color;
	 border:solid $form_line1_width $form_line1;
	}
	td{
	 font-size:85%;
	 padding:3px 5px 3px 5px;
	 border:solid $form_line2_width $form_line2;
	 color:$form_font_color;
	 font-size:$form_font_size;
	}
	/*送信後のメッセージ*/
	div.mes{
	 width:400px;
	 height:50px;
	 margin:10px 20px 5px 20px;
	 padding:10px 2px 10px 2px;
	 text-align:center;
	 border:solid $mes_line_width $mes_line;
	 background-color:$mes_back_color;
	 font-size:$mes_font_size;
	 color:$mes_font_color;
	}
	/*リンク*/
	a:link{
	 color:$link_color;
	 text-decoration:none;
	}
	a:visited{
	 color:$link_visited_color;
	 text-decoration:none;
	}
	a:hover{
	 color:$link_hover_color;
	 text-decoration:none;
	}
	/*著作権表示*/
	p.c{
	 font-size:30%;
	 margin:10px 2px 10px 2px;
	 padding:2px;
	 font-weight:normal;
	 text-align:center;
	}
--></style>
SCR
	return $style;
}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
