#!/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__';
__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'=>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 } );
$DEFAULT_ERROR_MESSAGE='もう一度入力項目を確認し、再入力してください。';
$SEND_NOTIFICATION = 1;
@NOTIFY_MAILTO=('support@jphost.com');
$NOTIFY_FROM='"support@jphost.com" ';
$NOTIFY_SUBJECT='=?iso-2022-jp?B?GyRCJSolcyVpJSQlcyEhJCpMZDlnJDslVSUpITwlYBsoQigbJEI/NzUsJSslOSU/JV4hPBsoQik=?=';
$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?GyRCIVojSiNQJVslOSVIISElWyU5JUYlIyVzJTAlNSE8JVMlOSFbJCpMZDlnJDskIiRqJCwbKEI=?=
=?iso-2022-jp?B?GyRCJEgkJiQ0JDYkJCReJDkbKEI=?=';
$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_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;
}