#!/usr/bin/perl # Copyright (c) GNA Inc. 2003 # Do not remove copyright notice. # Customized for Japanese Shift_JIS encoding. # Note on naming convention: # Variables in ALL_CAPS are global variables # use CGI; # Global Path Variables $SENDMAIL_COMMAND='/usr/sbin/sendmail -t -i'; $DATA_DIRECTORY='../cgidata/'; $ACTION_URL=$ENV{'SCRIPT_NAME'}; # grab file name without extension ($ACTION_SHORT_NAME)=$ACTION_URL=~/\/([^\/]+)?\.\w*$/; $DATA_FILE="$DATA_DIRECTORY/$ACTION_SHORT_NAME.csv"; $CGI_QUERY=new CGI; # BEGIN HTML DATA $WEBFORM_HEAD=<<'__END_OF_WEBFORM_HEAD__'; JPホスト-追加オプションお申込フォーム
 オンライン 追加オプションお申込フォーム

下記、追加オプションお申込フォームに必要事項をご記入の上、次の画面にお進みください。
赤字の項目は必須項目です。

__END_OF_WEBFORM_HEAD__ $WEBFORM_BODY=<<'__END_OF_WEBFORM_BODY__';
■ お客様情報

ドメイン名

半角英字 例) jphost.com
会社名/団体名

全角 例) 株式会社ジーエヌエー
※個人の方は不要です。
氏名(担当者名) 全角 例) ウェブ花子
Eメールアドレス 半角英小文字 例) info@jphost.com
電話番号 半角数字 例) 03-0000-0000
現在のご利用プラン名  

■ 追加オプションをお選びください。
ディスク容量
追加したいディスク容量   (5MBごと +500円/月)
MB
メールアカウント
追加したいメールアカウント数     1アカウントごと +200円/月)
メールボックス容量
追加したいメールボックス容量    (5MBごと +200円/月)
MB
メール転送
追加したいメール転送数    (10個ごと +500円/月)
メーリングリスト
(majordomo使用)
メーリングリスト名: @お客様のドメイン名
半角英小文字 例) mail-list@お客様のドメイン名

メーリングリストのオーナー: @お客様のドメイン名
半角英小文字 例) owner@お客様のドメイン名

メーリングリストのタイプ:

◆ニュースタイプ
参加者に対しての一方通行的な一斉配信タイプ。
◆フォーラムタイプ
参加者間の意見交換が可能なタイプ。
登録ユーザーを追加したい場合
ユーザー
100ユーザー追加毎/1ML +1000円/月
1000ユーザー追加毎/1ML +3000円/月
FTPアカウント
追加したいFTPアカウント     (1アカウントごと +500円/月)
CGIビルダー
追加したいCGIビルダー    (1個ごと +200円/月)
ショッピングカート
データベース
独自SSL認証
検索エンジン登録代行

■ 備考欄
その他、ご要望、確認事項がございましたら、こちらにご記入ください。

内容を再度ご確認の上、次の画面にお進みください

__END_OF_WEBFORM_BODY__ $WEBFORM_TAIL=<<'__END_OF_WEBFORM_TAIL__';

__END_OF_WEBFORM_TAIL__ $ACKNOWLEDGE_HTML=<<'__END_OF_ACKNOWLEDGE_HTML__'; 送信完了
 オンライン お申込申請フォーム


JPホスト ホスティングサービスへお申込いただき、誠にありがとうございます。

内容を確認させていただき、担当よりEメールにてご確認の連絡をさせていただきます。

不明な点がございましたら、何なりとお問い合せ下さい。
今後ともよろしくお願い申し上げます。

お問合せは下記までお気軽にどうぞ

電話サポート

098-972-2302  (平日10時〜18時)
FAXサポート 098-972-2304  (24時間受付)
Eメールサポート

 info@jphost.com


__END_OF_ACKNOWLEDGE_HTML__ $JAVASCRIPT_CONFIRM=<<'__JAVASCRIPT_CONFIRM__'; __JAVASCRIPT_CONFIRM__ # END HTML DATA %FORM_TAG=( 'method'=>'post' ); $USE_CONFIRM_PAGE=1; # 0=no 1=yes $CONFIRM_CAPTION='以上の内容でよろしければ「完了」ボタンを押してください。'; $USE_JAVASCRIPT=1; # 0=no 1=yes @FORM_ELEMENTS=( { 'name'=>'ドメイン名', 'type'=>1, 'min'=>1, 'max'=>60, 'msg'=>'「ドメイン名」は必ず入力してください' }, { 'name'=>'会社名/団体名', 'type'=>0 }, { 'name'=>'名前(担当者)', 'type'=>1, 'min'=>1, 'max'=>100, 'msg'=>'「氏名(担当者名)」は必ず入力してください' }, { 'name'=>'E-MAIL', 'type'=>5, 'msg'=>'「Eメールアドレス」は必ず入力してください ' }, { 'name'=>'TEL', 'type'=>1, 'min'=>1, 'max'=>20, 'msg'=>'「電話番号」は必ず入力してください' }, { 'name'=>'プラン名', 'type'=>0 }, { 'name'=>'ディスク容量', 'type'=>0 }, { 'name'=>'メールアカウント', 'type'=>0 }, { 'name'=>'メールボックス容量', 'type'=>0 }, { 'name'=>'メール転送', 'type'=>0 }, { 'name'=>'MLリスト名', 'type'=>0 }, { 'name'=>'MLオーナー', 'type'=>0 }, { 'name'=>'MLタイプ', 'type'=>0 }, { 'name'=>'MLユーザー', 'type'=>0 }, { 'name'=>'FTP', 'type'=>0 }, { 'name'=>'CGIビルダ', 'type'=>0 }, { 'name'=>'CGIビルダ数量', 'type'=>0 }, { 'name'=>'OP_ショッピングカート', 'type'=>0 }, { 'name'=>'OP_データベース', 'type'=>0 }, { 'name'=>'OP_独自SSL', 'type'=>0 }, { 'name'=>'OP_検索登録', 'type'=>0 }, { 'name'=>'備考', 'type'=>0 } ); $DEFAULT_ERROR_MESSAGE='もう一度入力項目を確認し、再入力してください。'; $SEND_NOTIFICATION = 1; @NOTIFY_MAILTO=('op_order@jphost.com'); $NOTIFY_FROM='"op_order@jphost.com" '; $NOTIFY_SUBJECT='=?iso-2022-jp?B?GyRCJSolVyU3JWclcyQqPz05fiVVJSkhPCVgGyhCKBskQjR7QjglKyU5JT8lXiE8GyhCKQ==?='; $NOTIFY_MESSAGE=<<'__END_OF_MESSAGE__'; ------------------------------------ 既存カスタマーからオプションお申込 ------------------------------------ --=DATAENTRY=-- __END_OF_MESSAGE__ $RESPONDER=2; $RESPONDER_MAILTO_FIELD='E-MAIL'; $RESPONDER_FROM='"support@jphost.com" '; $RESPONDER_SUBJECT='=?iso-2022-jp?B?GyRCIVojSiNQJVslOSVIISElWyU5JUYlIyVzJTAlNSE8JVMlOSFbJCo/PTl+TS1GcSQmJDQbKEI=?= =?iso-2022-jp?B?GyRCJDYkJCReJDkbKEI=?='; $RESPONDER_MESSAGE=<<'__END_OF_MESSAGE__'; ------------------------------------------------------ このメールは「JPホスト」より自動的に送信されています ------------------------------------------------------ この度は【JPホスト ホスティングサービス】へ お申込いただき、誠にありがとうございます。 今回お申込いただいた内容は以下の通りです。 内容のご確認をお願い致します。 -------------------------------------------- --=DATAENTRY=-- -------------------------------------------- のちほど、担当よりEメールにてご連絡させていただきます。 不明な点がございましたら、何なりとお問い合せ下さい。 今後ともよろしくお願い申し上げます。 ━━━━━━━━━━━━━━━━━━━━━━ GNA, Inc. ホスティング部 http://jphost.com 【ホスティングサービス】 http://gna.jp  【株式会社ジーエヌエー】 tel : 098‐972-2302 fax : 098-972-2304 email : info@jphost.com ━━━━━━━━━━━━━━━━━━━━━━ __END_OF_MESSAGE__ $SAVE_DATA_STATE=2; # 0=none 1=input only 2=all data # set cookie according to file name $COOKIE_NAME="FM_$ACTION_SHORT_NAME"; # only allow alphanum + underbar _ $COOKIE_NAME=~s/\W/_/g; %COOKIE_DATA = $CGI_QUERY->cookie($COOKIE_NAME); %COOKIE_DATA=() unless (defined %COOKIE_DATA); $CURRENT_DATE=&GetDate; $COOKIE_DATA{'LastVisit'}=$CURRENT_DATE; # CONSTANT %HTML_ESC_TABLE=( '<'=>'<', '>'=>'>', '&'=>'&', '"'=>'"', "\r"=>' ', "\n"=>' ' ); $ACCEPTS_COOKIES=1; # Variables used only in Main Logic block # BEGIN LOCAL my($errorMessage,$confirm,$saveOK); # END LOCAL #===================================================== # BEGIN MAIN LOGIC BLOCK #===================================================== # $confirm : 0=not yet submitted # 1=final confirmation # 2=confirmation required $confirm=$CGI_QUERY->param('__CONFIRM__')+0; # +0 forces numeric if($confirm>0) { # data was submitted # check input is valid $errorMessage=&CheckInput; if($errorMessage eq '') { #input valid # check if user accepted first cookie. unless(defined $COOKIE_DATA{'FirstVisit'}) { $ACCEPTS_COOKIES=0; } if($confirm==2) { # confirmation requred &PostHeader; &PostConfirmPage; } else { if($ACCEPTS_COOKIES==1) { if(defined $COOKIE_DATA{'Submitted'}) { $COOKIE_DATA{'Submitted'}++; } else { $COOKIE_DATA{'Submitted'}=1; } } $saveOK=1; if($SAVE_DATA_STATE>0) { $saveOK =&SaveData; } if($SEND_NOTIFICATION==1) { &SendNotification($saveOK); } if($RESPONDER==1) { $RESPONDER_FROM=$NOTIFY_FROM; $RESPONDER_SUBJECT=$NOTIFY_SUBJECT; $RESPONDER_MESSAGE=$NOTIFY_MESSAGE; } if($RESPONDER>0) { &SendAutoResponse; } &PostHeader; print $ACKNOWLEDGE_HTML; } } else { #input invalid &PostHeader; &PostForm($errorMessage); } } else { unless(defined $COOKIE_DATA{'FirstVisit'}) { $COOKIE_DATA{'FirstVisit'}=$CURRENT_DATE; } #input invalid &PostHeader; &PostForm; } exit; sub PostHeader { my($cookie)=undef; if($ACCEPTS_COOKIES==1) { unless(defined $COOKIE_DATA{'FirstVisit'}) { $COOKIE_DATA{'FirstVisit'}=$CurrentDate; } unless(defined $COOKIE_DATA{'Submitted'}) { $COOKIE_DATA{'Submitted'}=0; } $cookie = $CGI_QUERY->cookie(-name=>$COOKIE_NAME,-value=>\%COOKIE_DATA,-path=>'/',-expires=>'+1y',-secure=>0); } print $CGI_QUERY->header(-charset=>'Shift_JIS',-type=>'text/html',-cookie=>$cookie); } sub PostForm { my($err)=shift; my($key); print $WEBFORM_HEAD; if(defined $err) { print $err; } else { if($USE_JAVASCRIPT==1) { print $JAVASCRIPT_CONFIRM; $FORM_TAG{'onSubmit'} = "if(!FM_Confirm(this)){return false;}". $FORM_TAG{'onSubmit'}; } print "
"; print $WEBFORM_BODY; } print $WEBFORM_TAIL; } sub PostConfirmPage { my ($obj,$name,$value,@tmp); my ($row)=1; print $WEBFORM_HEAD; print ""; print "\n\n\n"; foreach $obj (@FORM_ELEMENTS) { if($obj->{'type'}<0) { next; } $name = $obj->{'name'}; @tmp = $CGI_QUERY->param($name); if(defined(@tmp)) { $value=HTMLEscape(\@tmp); # joins values in HTML Escaped string } else { $value=''; } print "\t\n\t\t\n", "\t\t\n\t\n"; $row++; } print "\t\n\t\t\n\t\n
$CONFIRM_CAPTION
$name", ($value =~ /\S/? $value:' '), "
"; foreach $obj (@FORM_ELEMENTS) { $name = $obj->{'name'}; @tmp = $CGI_QUERY->param($name); if(defined (@tmp) && scalar(@tmp)>0) { foreach $value (@tmp) { print ""; } } } print "    ", "
\n
"; print $WEBFORM_TAIL; } sub CheckInput { my $q=$CGI_QUERY; # short for convenience my $errmsg=''; my $useDefaultErr=0; my ($min,$max,$val,@vals,$obj); foreach $obj (@FORM_ELEMENTS) { my $e=0; if($obj->{'null'}==1) { $val=$q->param($obj->{'name'}); if($val!~/./) { next; } } # Text Validation (length of text) if($obj->{'type'}==1) { $val=$q->param($obj->{'name'}); $e=NumberCheck($obj,length($val)); } # Integer Validation elsif($obj->{'type'}==2) { $val=$q->param($obj->{'name'}); if($val!~/^\d+$/) { $e=1; } else { $e=NumberCheck($obj,$val); } } # Number Validation elsif($obj->{'type'}==3) { $val=$q->param($obj->{'name'}); if($length==0 || $val!~/^\d*(\.\d+){0,1}$/) { $e=1; } else { $e=NumberCheck($obj,$val); } } # YEN Validation elsif($obj->{'type'}==4) { $val=$q->param($obj->{'name'}); $val=~s/^\\//; if($length==0 || $val!~/^\d+$/) { $e=1; } else { $e=NumberCheck($obj,$val); } } # Email Validation elsif($obj->{'type'}==5) { $val=$q->param($obj->{'name'}); if($val!~/^(?:[\x21-\x2B\x2D-\x3F\x41-\x7E])+\@(?:[A-Za-z0-9\-]+\.)+(?:[A-Za-z]){2,}$/) { $e=1; } } # URL Validation elsif($obj->{'type'}==6) { $val=$q->param($obj->{'name'}); if($val!~/^(http(s)?:\/\/)?([\w\-]+\.)+\w+(:\d+)?(\/.*)*$/) { $e=1; } } # Telephone (JP) elsif($obj->{'type'}==7) { $val=$q->param($obj->{'name'}); if(length($val)==12) { if($val!~/^\d{2,5}\-\d{1,4}\-\d{4}$/) { $e=1; } } elsif(length($val)==13) { if($val!~/^\d{3}\-\d{4}\-\d{4}$/) { $e=1; } } else { $e=1; } } # Zipcode (JP) elsif($obj->{'type'}==8) { $val=$q->param($obj->{'name'}); if($val!~/^\d{3}\-\d{4}$/) { $e=1; } } # Other than check (for dropdown boxes w/ first selection being "--Make a Selection--") elsif($obj->{'type'}==9) { $val=$q->param($obj->{'name'}); if($val eq $obj->{'otherthan'}) { $e=1; } } # Values check (count how many choices user made) elsif($obj->{'type'}==10) { @vals=$q->param($obj->{'name'}); $val=scalar(@vals); $e=NumberCheck($obj,$val); } if($e==1) { if(defined $obj->{'msg'}) { $errmsg.=$obj->{'msg'} . "
\n"; } $useDefaultErr=1; } } if($useDefaultErr==1) { $errmsg.=$DEFAULT_ERROR_MESSAGE; } return($errmsg); } sub SendNotification { my $saveOK=shift; my %mail=('From'=>$NOTIFY_FROM, 'To'=>\@NOTIFY_MAILTO, 'Subject'=>$NOTIFY_SUBJECT ); my $msg=''; if($saveOK==0) { $msg=<<'__WARN__'; ************************************************************* ********************** データ保存エラー ********************** ************************************************************* __WARN__ $msg.=$DATA_FILE; $msg.=<<'__WARN__'; にデータを保存するのに失敗しました ファイルが存在し、書き込みが可能であることを確認してください NOTE: この警告は自動的にお客様へ送信されることはありません ************************************************************* __WARN__ } $msg.=$NOTIFY_MESSAGE; AddMessageData(\$msg); $mail{'Body'}=\$msg; SendMail(\%mail); } sub SendAutoResponse { my %mail=('From'=>$RESPONDER_FROM, 'To'=>[$CGI_QUERY->param($RESPONDER_MAILTO_FIELD)], 'Subject'=>$RESPONDER_SUBJECT ); my $msg=$RESPONDER_MESSAGE; AddMessageData(\$msg); $mail{'Body'}=\$msg; SendMail(\%mail); } sub AddMessageData { my $msg=shift; my $data=''; my($obj); foreach $obj (@FORM_ELEMENTS) { $name=$obj->{'name'}; @vals=$CGI_QUERY->param($name); $data.="$name: " . join(';',@vals) . "\n"; } $$msg=~s/--=DATAENTRY=--/$data/i; } sub SendMail { require 'jcode.pl'; my $mobj=shift; my $mailCmd =$SENDMAIL_COMMAND; $mailCmd=~s/\$FROM/$mobj->{'From'}/gi; if($mailCmd=~/\$TO/i) { my $to=join(" ",@{$mobj->{'To'}}); $mailCmd=~s/\$TO/$to/gi; } &jcode'convert($mobj->{'Body'}, 'jis','sjis'); open MAIL, "|$mailCmd" || return; print MAIL "To: ", join(",\n\t",@{$mobj->{'To'}}),"\n", "From: ", $mobj->{'From'}, "\n", "Reply-To: ", $mobj->{'From'}, "\n", "Subject: ",$mobj->{'Subject'} ,"\n", # put additional mail headers here (such as encoding : default is iso-2022-jp/7bit) "MIME-Version: 1.0\n", "Content-Type: text/plain;\n\tcharset=\"iso-2022-jp\"\n", "Content-Transfer-Encoding: 7bit\n", "\n", ${ $mobj->{'Body'} }; close(MAIL); } sub SaveData { my($obj,$val,@vals,$sz,$comma); use Fcntl qw/:flock/; $sz=(-s $DATA_FILE)+0; unless(open OUT, ">>$DATA_FILE") { return 0; } for(my $i=0;$i<10;$i++) { if(flock(OUT,LOCK_EX|LOCK_NB)) { last; } } seek(OUT,0,2); if($sz==0) { # If file is new, add element names to header. if($SAVE_DATA_STATE==2) { print OUT '"リモートアドレス","ブラウザ","日付","初回訪問日","送信回数",'; } print OUT join(",", map { $val=$_->{'name'}; $val=~s/(?:\r\n|\n)/\r/g; $val=~s/\"/\"\"/g; $val='"'.$val.'"' if($val=~/[^\w\.]/); $val; }@FORM_ELEMENTS), "\n"; } if($SAVE_DATA_STATE==2) { my($first,$submit); if($ACCEPTS_COOKIES==0) { $first=$CURRENT_DATE; $submit=0; } else { $first=$COOKIE_DATA{'FirstVisit'}; $submit=$COOKIE_DATA{'Submitted'}; } print OUT $ENV{'REMOTE_ADDR'},",",$ENV{'HTTP_USER_AGENT'}, ",", $CURRENT_DATE, ",",$first, ",",$submit, ","; } $comma=0; foreach $obj (@FORM_ELEMENTS) { if($comma==1) { print OUT ","; } $comma=1; @vals=$CGI_QUERY->param($obj->{'name'}); if(defined @vals) { $val=join(';',@vals); $val=~s/(?:\r\n|\n)/\r/g; $val=~s/\"/\"\"/g; $val='"'.$val.'"' if($val=~/[^\w\.]/); } else { $val=''; } print OUT $val; } print OUT "\n"; flock(OUT,LOCK_UN); close(OUT); } sub GetDate { my(@gmt)=gmtime(); # Format YYYY/MM/DD (Year, Month, Day) return sprintf("%04d/%02d/%02d",$gmt[5]+1900,$gmt[4]+1,$gmt[3]); } sub HTMLEscape { my ($rVals)=shift; my ($vals); if(ref $rVals) { $vals=join(', ',@$rVals); } else { $vals=$rVals; } $vals=~s/([<>&])/$HTML_ESC_TABLE{$1}/g; $vals=~s/(\r\n|\r|\n)/
/g; return $vals; } sub HTMLQEscape { my ($val)=shift; $val=~s/([<>&\"\r\n])/$HTML_ESC_TABLE{$1}/g; return $val; } sub NumberCheck { my ($obj,$val)=@_; if(defined($obj->{'min'})) { if($val+0<$obj->{'min'}) { return 1; } } if(defined($obj->{'max'})) { if($val+0<$obj->{'max'}) { $e=1; } } return 0; }