#!/usr/bin/perl #/////////////////////////////////////////////////////////////////////////////// # メールフォーム Easy Mail Form Ver.1.00 # ----- 2007(C) WEB INVENTOR(Solve) ----- # solve@wb-i.net # http://wb-i.net/ # #/////////////////////////////////////////////////////////////////////////////// #================================ [注意事項] =================================== # このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に対して # も作者は一切の責任を負いません。 #====================================使用法===================================== # 次のようにして呼び出してください。 # http://・・/form.cgi #=============================================================================== # ▼設定▼ #=============================================================================== # jcode.plへのパス require './jcode.pl'; # MIMEコード変換ライブラリ require './mimew.pl'; # =============================================================================== # ▲設定終了▲ # =============================================================================== @kenmei=('-都道府県-','北海道','青森県','岩手県','秋田県','宮城県','山形県','福島県','東京都','神奈川県','埼玉県','千葉県','茨城県','栃木県','群馬県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄'); local($key, $val, $buf, @in); if ($ENV{'REQUEST_METHOD'} eq "POST") { $postflag=1; read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $postflag=0; $buf = $ENV{'QUERY_STRING'}; } @in = split(/&/, $buf); @key=(); foreach (@in) { ($key, $val) = split(/=/); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*key, 'sjis'); &jcode'convert(*val, 'sjis'); $in{$key} = $val; push(@key_data,$key); } # 設定ファイル==================================== require './fset.pl'; #===== 戻り先===================================== $save_data="$script_ssl?f=$in{'f'}"; #===============入り口====================== if ( $in{'mode'} eq 'adm1' ) { &adm1; exit;} elsif ( $in{'mode'} eq 'adm_menu' ) { &adm_menu; exit;} elsif ( $in{'mode'} eq 'send' ) { &send_famil; exit;} elsif ( $in{'mode'} eq 'sure' ) { &ask_sure; exit;} else{&Mform;} exit; #=============デフォルト設定= sub default{ $f_no =$field_no; if($field_no > 15){$f_no = 2;} @info = split(/\<\>/,$FIELD[$f_no]); @d_info = split(/\<\>/,$FIELD[2]); $i =0; while($i < 11){ if($info[$i] eq ''){$info[$i] =$d_info[$i];} $i ++; } ($member_type,$shop_name,$shop_mail,$shop_mail2,$check_list,$mail_check_list,$sure_title,$end_title,$end_msg,$mail_title,$mail_msg,$ask_table) = @info; if($field_no > 15){$ask_table = '
(ここに問合せフォームを記述してください)
';} elsif($ask_table eq ''){$ask_table = "(問合せフォーム$in{'f'}を記述してください)";} $mail_msg =~ s/
/\n/g; $ask_table =~ s/
/\n/g; } #/////////////////問合せ//////////////////// sub Mform{ #=================ニ重送信防止============= print &setCookie_0("COMPLETE_END", ""); #========================================== unless($in{'f'}){$in{'f'} =1;} $field_no =$in{'f'}+5; &default(); # 会員制 if($member_type eq '3'){ $ask_table = "(問合せフォーム$in{'f'}−工事中)"; } foreach (@kenmei){ if ($_ ne $mem_ken){ $ken_set .=""; }else{ $ken_set .=""; } } $input_ken =""; $ask_table =~ s/text-area/textarea/gi; $input_puls =""; $input_puls .=""; $input_puls .=""; $ask_table =~ s/\<\/form\>/$input_puls/gi; $ask_table =~ s/\/\/gi; $ask_table =~ s/\$input_ken/$input_ken/g; &html_header_make(); $html_data .=$ask_table; $html_data .="$foot" ; #====HTMLの書き込み if($in{'html'} eq 'yesterday'){ $no =1000 +$in{'f'}; $no =substr("$no",1,3); $html_file_name ='./form'."$no".'.html'; &html_write(); print "Location: $html_file_name\n\n"; #====画面表示 }else{ print "Content-type: text/html\n\n"; print "$html_data"; } } #============HTMLの書き出し sub html_write{ open(OUT,"> $html_file_name") || &error("HTMLの書き込みに失敗しました","$html_file_name[$in{'f'}]"); print OUT "$html_data\n"; close(OUT); } #//////////////問合せの確認////////////// sub ask_sure(){ if($right_free<49999 || $right_free>69999 || $right_free =~ /[^0-9]/){ $http ='http://wb-i.net/'; if($foot !~ /$http/){&error("error");} } unless($in{'f'}){$in{'f'} =1;} $field_no =$in{'f'}+5; &default(); @check_tb = split(/\,/, $check_list); @mail_check_tb = split(/\,/, $mail_check_list); foreach(@check_tb){ $mess =&mean($_); if($in{"$_"} eq ""){&error("ブラウザの [戻る] ボタンで戻って、$messを確認してください。");} if($_ eq 'ken' && $in{"ken"} eq "-都道府県-"){ $mess =&mean(ken); &error("ブラウザの [戻る] ボタンで戻って、$messを確認してください。"); } } foreach(@mail_check_tb){ $mess =&mean($_); if($in{"$_"} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,5}$/){&error("ブラウザの [戻る] ボタンで戻って、$messを確認してください。");} } &html_header(); print <<"EOF"; EOF foreach(@key_data){ if($_ eq 'mode'){next;} $in{"$_"} =~ s/\&/&/g; #特殊文字の変換 $in{"$_"} =~ s/\/>/g; $in{"$_"} =~ s/\"/"/g; #ダブルクォーテーションの変換 $form_data .=<<"EOF"; EOF if($_ eq 'f'){next;} #=====予約語の処理(price,amount,payment) if($_ eq 'price'){ $price_save =$in{"$_"}; 1 while $in{"$_"} =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理 $in{"$_"} =$in{"$_"}."円"; } if($_ eq 'amount'){ $amount_save =$in{"$_"}; $in{"$_"} =$in{"$_"}."個"; } if($_ eq 'payment'){$in{"$_"} =$payment_name[$in{"$_"}];} $mean_set =&mean($_); $in{"$_"} =~ s/\r\n//g; #改行の変換 $in{"$_"} =~ s/\r//g; $in{"$_"} =~ s/\n//g; print <<"EOF"; EOF #=====合計表示 if(($_ eq 'price' || $_ eq 'amount') && $amount_save > 0 && $price_save > 0){ $total =$price_save * $amount_save; $form_data .=<<"EOF"; EOF 1 while $total =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理 print <<"EOF"; EOF } } print <<"EOF"; EOF print <<"EOF";
$sure_title
$mean_set $in{"$_"}
合計 $total円
$form_data
EOF print "$foot" ; } #/////////////////メール送信////////////////// sub send_famil { # Cookieの値を得る &getCookie(); #===================二重送信エラー========== $complete_end = $COOKIE{'COMPLETE_END'}; if($complete_end eq 'ok'){ &error("二重送信エラー",'二重にお問合せすることは出来ません。'); } #============================================ unless($in{'f'}){$in{'f'} =1;} $field_no =$in{'f'}+5; &default(); $end_msg =~ s/\$name/$in{'name'}/g; $mail_msg =~ s/\$name/$in{'name'}/g; #====================================================== # タイムゾーンを日本時間に合わせる $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$day,$month,$year,$wday,$Days,$dmy) = localtime($times); $month = $month +1; $year = $year + 1900; $year_m_d = "$year"."年"."$month"."月"."$day"."日"; $year_m_d2 = "$year"."/"."$month"."/"."$day"."/"."$hour"; $mail_msg =~ s/\$date/$year_m_d/g; foreach(@key_data){ if($_ eq 'mode'){next;} if($_ eq 'f'){next;} if($_ eq 'price'){ $price_save =$in{"$_"}; 1 while $in{"$_"} =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理 $in{"$_"} =$in{"$_"}."円"; } if($_ eq 'amount'){ $amount_save =$in{"$_"}; $in{"$_"} =$in{"$_"}."個"; } if($_ eq 'total'){ $total_save =$in{"$_"}; 1 while $in{"$_"} =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理 $total_save2 =$in{"$_"}; $in{"$_"} =$in{"$_"}."円"; } if($_ eq 'item'){ $item_save =$in{"$_"}; } if($_ eq 'payment'){ $payment_no_save =$in{"$_"}; $in{"$_"} =$payment_name[$in{"$_"}]; $payment_name_save =$in{"$_"}; } $mean_set =&mean($_); $ask_data .="【$mean_set】 $in{\"$_\"}\n"; $in{"$_"} =~ s/\&/&/g; #特殊文字の変換 $in{"$_"} =~ s/\/>/g; $ask_data_br .="【$mean_set】 $in{\"$_\"}
"; } $ask_data_br =~ s/\r\n//g; #改行の変換 $ask_data_br =~ s/\r//g; $ask_data_br =~ s/\n//g; $payment_mess[$payment_no_save] =~ s/\$total/$in{'total'}/g; $payment_mess[$payment_no_save] =~ s/\$name/$in{'name'}/g; $payment_mail[$payment_no_save] =~ s/\$total/$in{'total'}/g; $payment_mail[$payment_no_save] =~ s/\$name/$in{'name'}/g; $order_info ="$in{'f'},$payment_no_save,$payment_name_save,$item_save,$price_save,$amount_save,$total_save"; if($right_free<49999 || $right_free>69999 || $right_free =~ /[^0-9]/){ $http ='http://wb-i.net/'; if($foot !~ /$http/){&error("error");} } #====問合せ番号取得(ファイルロックなし)==== &get_order_no(); #===============クライアントのIP&ホスト名=============== $rem_addr = $ENV{'REMOTE_ADDR'}; $rem_host = $ENV{'REMOTE_HOST'}; if ($rem_host eq "" || $rem_host eq $rem_addr) { $rem_host = gethostbyaddr(pack("C4", split(/\./, $rem_addr)), 2) || $rem_addr; } $reprot2 ="【問合せ日時】$year_m_d2"."\n"."【IPアドレス】$rem_addr"."\n"."【ホスト名】$rem_host"."\n\n"; $mailto =$in{'mail'}; $frommail =$shop_mail; $fromname =$shop_name; $subject =$in{"name"} . $mail_title; &mail_make(); &mail_send(); if($shop_mail){ $mailto =$shop_mail; $frommail =$in{'mail'}; $fromname =$in{'mail'}; $all_name =$in{'name'}; &jcode'h2z_sjis(*all_name, 'sjis'); #半角カタカナを全角カタカナに変換 $subject ='お問合せ控えNO.'."$order_no"."[$all_name]"; $report="NSSメールフォーム[$in{'f'}]\n\n"; $mailbody=$report.$reprot2.$mailbody2; &mail_send(); } if($shop_mail2){ $mailto =$shop_mail2; $frommail =$in{'mail'}; $fromname =$in{'mail'}; $all_name =$in{'name'}; &jcode'h2z_sjis(*all_name, 'sjis'); #半角カタカナを全角カタカナに変換 $subject ='お問合せ控えNO.'."$order_no"."[$all_name]"; $report="NSSメールフォーム[$in{'f'}]\n\n"; $mailbody=$report.$reprot2.$mailbody2; &mail_send(); } #===============二重送信防止=============== print &setCookie_0("COMPLETE_END", "ok"); #========================================== #注文完了メッセージ==== &html_header(); print <<"EOF";
$end_title

$end_msg

$payment_mess[$payment_no_save]


EOF #============================================ print "$foot" ; } #=======注文ログファイルへの追加=============== sub get_order_no{ open (IN,"$NO_file") || &error('オープンエラー3',"問合せ番号ファイル($NO_file)が開けません。"); $order_max = ; close (IN); if($order_max eq ""){$order_max = 0;} $order_no = $order_max + 1; open (OUT,">$NO_file") || &error('オープンエラー4',"問合せ番号ファイル($NO_file)が開けません。"); print OUT "$order_no"; close (OUT); } #=======メールを作成する============= # sub mail_make{ $mailbody = < new( $SMTPserver, # SMTPサーバー名を指定 Hello => $SMTPserver, # SMTPドメイン名を指定 Timeout => 60); # 接続待ち許容時間(秒) #ヘッダ部の組み立て $SMTP -> mail($from); # 送信元メールアドレスを指定 $SMTP -> to($to); # 宛先メールアドレスを指定 # $SMTP -> cc($cc); # CC(カーボンコピー)先メールアドレスを指定 # $SMTP -> bcc($from); # ブラインドCC先メールアドレスを指定(送信元にもBccでメールを送る)Bcc不要時、コメント行にする。 #データ部の組み立て $SMTP -> data(); $SMTP -> datasend("From:$from\n"); # 送信元(データ部) $SMTP -> datasend("To:$to\n"); # 宛先(データ部) $SMTP -> datasend("Subject:$subj\n"); # 件名 $SMTP -> datasend("\n"); $SMTP -> datasend("$body\n"); # 本文 $SMTP -> dataend(); # データ終端、メール送信 $SMTP -> quit; # SMTP接続の終了 } #================================== sub mail_err { &error("メールの送信に失敗しました。ブラウザの [戻る] ボタンで戻ってください。"); } # ======================================================================================= sub adm1 { if($adm_pass eq "1234"){ $dis_closure = "
[パスワード = 1234]
"; } &html_header(); print <<"EOF";




管理者用パスワードを入力してください。

$dis_closure


$foot EOF } # ======================================================================================= sub adm_menu { if($in{'pass'} eq ''){ # $in{'pass'} = $COOKIE{'PASS'}; } if ( $in{'pass'} ne $adm_pass ) { print "Location: $script_ssl?mode=adm1\n\n"; exit; } #print &setCookie_0('PASS', $adm_pass); &html_header(); print <<"EOF";



◆管理メニュー◆

EOF print <<"EOF";
■システム設定\  System Manager

$foot EOF } #====================================================================== # Cookieに値を書き込むためのSet-Cookie:ヘッダを生成する # sub setCookie{ local($tmp, $val); $val = $_[1]; $val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $tmp = "Set-Cookie: "; $tmp .= "$_[0]=$val; "; $tmp .= "expires=Thu, 1-Jan-2050 00:00:00 GMT;\n"; return($tmp); } sub setCookie_0{ local($tmp, $val); $val = $_[1]; $val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $tmp = "Set-Cookie: "; $tmp .= "$_[0]=$val; "; $tmp .= ";\n"; return($tmp); } # # Cookieの値を読み出す # sub getCookie{ local($xx, $name, $value); for $xx (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $xx); $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } sub html_header{ print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$main_title\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$style"; print "$body$header\n"; } sub html_header_make{ $html_data = "\n"; $html_data .= "\n"; $html_data .= "\n"; $html_data .= "\n"; $html_data .= "$main_title\n"; $html_data .= "\n"; $html_data .= "\n"; $html_data .= "\n"; $html_data .= "\n"; $html_data .= "$style"; $html_data .= "$body$header\n"; } #=============================================================== sub error { &html_header(); print "

$_[0]
\n"; print "
$_[1]
\n"; print "
$foot"; exit; }