#!/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... EOD } exit; } #*****************************************************************************