#!/usr/local/bin/perl
#********************************************************************
#mail.cgi - MailForm Ver.1.21
#
#Version :1.21
#modified :2001/04/19
#Copyright :The Room
#E-Mail :dream@lib.net
#URL :http://dream.lib.net/room/
#
#これはフリー素材です。
#転載・商用目的の利用の際には、メールをお願いします。
#
#******************************************************************************
#1行目のperlのディレクトリ指定は、サーバによって異なります。
#詳しくは、管理者にお聞きください。
#******************************************************************************
#jcode.pl のパス(相対パス指定)
$jcode = './jcode.pl';
#sendmail のパス(要変更)
$sendmail = '/usr/sbin/sendmail';
#一時保存用ファイルのパス(相対パス指定)
$tempfile = './tempfile.dat';
#メールを受け取るアドレス
$getmail = 'aches@hyper.cx';
#******************************************************************************
#送信完了画面のパス(http://〜の絶対パス指定)
$complete = 'http://aches.s3.xrea.com/cgi-bin/mailform/complete.html';
#送信確認用テンプレートのパス(相対パス指定)
$checktemplete = './check.html';
#エラー表示用テンプレートのパス(相対パス指定)
$errortemplete = './error.html';
#******************************************************************************
#メールのタイトル
# 入力させる場合には、値を設定しないでください。
$titleinput = '';
#メールのサブタイトル
# メールフォームから発信されたことを示すために、タイトルに追加されます。
$subtitle = 'From Mail Form';
#名前の入力を必須にするなら 1 を設定。しないなら 0 を。
$nameinput = 1;
#メールアドレスの入力を必須にするなら 1 を設定。しないなら 0 を。
# コピーメールを送信する場合は、自動的に必須になります。
$mailinput = 1;
#URLの入力を必須にするなら 1 を設定。しないなら 0 を。
$urlinput = 0;
#メッセージの入力を必須にするなら 1 を設定。しないなら 0 を。
$messageinput = 1;
#******************************************************************************
#表示デリミタ
# 自由設定の入力項目で、複数選択された時の、
# Web上で表示するデータの区切り記号を設定します。
$indidelimita = "
";
#メールデリミタ
# 表示デリミタと同じですが、こちらはメールの文章内に使用するものです。
# 改行を設定したい時は \n と設定してください。
$maildelimita = "/";
#******************************************************************************
#送信確認を行うなら 1 を設定。しないなら 0 を設定。
$mailcheck = 1;
#******************************************************************************
#コピーメールを送信するなら 1 を設定。しないかユーザーに選択させるなら 0 を。
$copymail = 1;
#コピーメール送信有無の表示
# 送信確認時に表示するものです。
$copymailmessage[1]= 'Receive';#コピーメールを受け取る時
$copymailmessage[0]= 'Deny';#受け取らないとき
#コピーメールであることを示すメッセージ
# ここで設定した文章が、コピーメールの最上部に表示されます。
$copymailsig = <<'EOD';
このメールは、Ache's Room 〜 Mail Form より送信されたメールのコピーです。
------------------------------------------------------------
EOD
#コピーメールの送信者名
$copymailfrom = 'aches@anet.ne.jp';
#******************************************************************************
#投稿を禁止するワードを設定
# ここで設定した文字がメッセージ内に入っているメールは送信できなくなります。
# 例:@denyword = ('死','殺');
@denyword = ();
#投稿を禁止するホスト名/IP
# ここで指定した文字を含むホスト名またはIPからの投稿は出来なくなります。
# 例:@denyhost = ('127.0.0.1','anony');
@denyhost = ();
#同一IPからの連続投稿を禁止するなら 1 を。しないなら 0 を設定。
$denydouble = 0;
#******************************************************************************
#他サイトからの投稿を禁止するなら 1 を設定。
# 1 にすると、以下で指定する2つのアドレス以外からは投稿できなくなります。
# サーバによってはうまく動かない場合もあります。
# 投稿しようとした場合、入力フォームのアドレスに飛びます。
$denyother = 1;
#入力フォームのアドレス(http://〜の絶対パス)
$enterformurl = 'http://aches.s3.xrea.com/cgi-bin/mailform/form.html';
#このCGIのアドレス(http://〜の絶対パス)
$ownurl = 'http://aches.s3.xrea.com/cgi-bin/mailform/mail.cgi';
#******************************************************************************
#METAタグを使用してページジャンプを行う場合は 1 を。しないなら 0 を設定。
# 基本的には 0 のまま使用します。
# 送信完了画面がうまく表示されない場合のみ 1 を設定してください。
$metajump = 1;
#******************************************************************************
require $jcode;
$cl = $ENV{"CONTENT_LENGTH"};
if( $cl > 0 ){
read(STDIN, $qs, $cl );
}else{
$qs = $ENV{"QUERY_STRING"};
}
@contents = split(/&/,$qs);
foreach $i (0 .. $#contents) {
local($key,$text)= split(/=/,$contents[$i]);
$text =~ s/\+/ /g;
$text =~ s/%(..)/pack("c",hex($1))/ge;
$text =~ s/\r\n/\n/g;
$text =~ s/\r/\n/g;
&jcode'convert(*text,"sjis");
$act = $text if $key eq 'act';
$name = $text if $key eq 'name';
$mail = $text if $key eq 'mail';
$url = $text if $key eq 'url';
$title = $text if $key eq 'title';
$message = $text if $key eq 'message';
$copymailcheck = $text if $key eq 'copymailcheck';
$datatitle[$1] = $text if $key =~ /^datatitle(\d+)/i;
$datacheck[$1] = $text if $key =~ /^datacheck(\d+)/i;
if ($key =~ /^data(\d+)/i){
$data[$1] .= "<>" if $data[$1] ne "";
$data[$1] .= $text;
}
}
$copymailcheck = 0 if $copymailcheck != 1;
$ip = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2);
$host = $ENV{'REMOTE_HOST'} if $host eq "";
$host = $ip if $host eq "";
$useragent = $ENV{'HTTP_USER_AGENT'};
if (($mailcheck == 0) && ($act eq "check")){$act = "send";}
if (($act eq "") || (($denyother) && (($ENV{'HTTP_REFERER'} !~ /$enterformurl/i) && ($ENV{'HTTP_REFERER'} !~ /$ownurl/)))){
&jump($enterformurl);
}
elsif ($act eq "check"){✓}
elsif ($act eq "send"){&send;}
exit;
#*****************************************************************************
sub datacheck{
#入力データチェック
while(1){last if (!(chomp($message)))}
if ($titleinput ne ""){$title = $titleinput;}
elsif ($title eq ""){&error("件名を入力してください。");}
if (($nameinput) && ($name eq "")){&error("お名前を入力してください。");}
if ((($mailinput) || ($copymail+$copymailcheck)) && ($mail eq "")){
&error("メールアドレスを入力してください。");
}
if (($urlinput) && ($url eq "")){&error("URLを入力してください。");}
if (($messageinput) && ($message eq "")){&error("メッセージを入力してください。");}
if (($url ne "") && ($url !~ /^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+$/i)){&error("URLが間違っています。");}
if (($mail ne "") && ($mail !~ /[\w\.\-\&]+\@[\w\.\-\&]+\.[\w\.\-\&]/)){&error("メールアドレスが間違っています。");}
if ($denyword[0]){foreach(@denyword){&error("このメッセージは送信できません。") if index($message,$_) != -1;}}
if ($denyhost[0]){foreach(@denyhost){&error("あなたの接続元からは送信できません。") if (index($host,$_) != -1) || (index($ip,$_) != -1);}}
for(1 .. 99){
last if $datatitle[$_] eq "";
&error("$datatitle[$_]のデータを入力してください。") if ($datacheck[$_]) && ($data[$_] eq "");
}
}
#*****************************************************************************
sub send{
&datacheck;
my ($temp,$mailbody,$mailbody2,$mailhead);
if ($denydouble){
open (IO,"+<$tempfile");
eval{flock(IO,2)};
$temp=;
if ($temp eq $ip){
close(IO);
&error("連続投稿は禁止されています。");
}else{
truncate(IO,0);
seek(IO,0,0);
print IO $ip;
close(IO);
}
}
$mailhead .= "Subject: $title($subtitle)\n";
$mailhead .="Content-Transfer-Encoding: 7bit\n";
$mailhead .="Content-Type: text/plain; charset=ISO-2022-JP\n";
$mailhead .="X-Mailer: Mail Form by The Room\n\n";
$mailbody .= "お名前:$name\n" if $name ne "";
$mailbody .= "URL:$url\n" if $url ne "";
$mailbody .= "メールアドレス:$mail\n" if $mail ne "";
$mailbody .= "\n" if ($title ne "") || ($message ne "");
$mailbody .= "件名:$title\n" if $title ne "";
$mailbody .= "メッセージ:\n$message\n" if $message ne "";
if ($datatitle[1] ne ""){
$mailbody .= "\n";
for (1 .. 99){
last if $datatitle[$_] eq "";
$data[$_] =~ s/<>$//i;
$data[$_] =~ s/<>/$maildelimita/ig;
$mailbody.="$datatitle[$_]:$data[$_]\n";
}
}
$mailbody .= "\n";
$mailbody2 .= <){$buffer2.=$_;}
close(IN);
$temp = $message;
$temp =~ s/\n/$indidelimita/ig;
$buffer2 =~ s//$title/ig;
$buffer2 =~ s//$name/ig;
$buffer2 =~ s//$mail/ig;
$buffer2 =~ s//$url/ig;
$buffer2 =~ s//$temp/ig;
$buffer2 =~ s//$copymailmessage[$copymailcheck]/ig;
$buffer = <
EOD
for(1 .. 99){
last if $datatitle[$_] eq "";
$data[$_] =~ s/<>$//ig;
$buffer.=<
EOD
$temp = $data[$_];
$temp =~ s/<>/$indidelimita/ig;
$buffer2 =~ s//$temp/ig;
}
$buffer2 =~ s//$buffer/ig;
print "Content-type:text/html; charset=shift_jis\n\n".$buffer2;
exit;
}
#*****************************************************************************
sub error{
#エラー表示
print "Content-type:text/html; charset=shift_jis\n\n";
open (IN,"$errortemplete");
while(){
$_ =~ s//$_[0]/ig;
print;
}
close(IN);
exit;
}
#*****************************************************************************
sub jump{
#ページジャンプ
if ($metajump == 0){
print "Location: $_[0]\n\n";
}else{
print <
Waiting...