#!/usr/local/bin/perl # このPostMailは、「鷹の巣」より改造されています。(2002年6月14日) # 改造箇所の詳細は、「鷹の巣」の自宅サーバーの下記のページに表示しています。 # http://sakaguch.com/sendmailCGI.html # 不具合が生じた場合は、下記の「鷹の巣」の自宅サーバー掲示板にご投稿願います。 # http://sakaguch.com/cgi/bbs/ # #┌───────────────────────────────── #│ PostMail v1.8 (2002/05/22) #│ Copyright(C) Kent Web 2002 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'PostMail v1.8'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 勝手ながら、BlatJを使った送信に関する質問はサポート対象外 #│ とさせていただきます。 #│ 3. 送信フォームのHTMLページの作成に関しては、HTML文法の範疇 #│ となるため、サポートの対象外となります。 #│ 4. それ以外の設置に関する質問はサポート掲示板にお願いいたし #│ ます。直接メールによる質問はお受けいたしておりません。 #└───────────────────────────────── # # [ 送信フォーム (HTML) の記述例 ] # # ・タグの記述例 (1) # おなまえ # → このフォームに「山田太郎」と入力して送信すると、 # 「name = 山田太郎」という形式で受信します # # ・タグの記述例 (2) # お好きな色 # → このラジオボックスにチェックして送信すると、 # 「color = 青」という形式で受信します # # ・タグの記述例 (3) # E-mail # → name値に「email」という文字を使うとこれはメールアドレス # と認識し、アドレスの書式を簡易チェックします # → (○) abc@xxx.co.jp # → (×) abc.xxx.co.jp → 入力エラーとなります # # ・タグの記述例 (4) # E-mail # → name値の先頭に「アンダーバー 」を付けると、その入力値は # 「入力必須」となります。 # 上記の例では、「メールアドレスは入力必須」となります。 # # ・name値への「全角文字」の使用は可能です(ただし一部のブラウザでは # ごくまれに文字化けする可能性もあり、できれば「半角英数字」を使う方 # が無難ではあります) # (例) # → 上記のラジオボックスにチェックを入れて送信すると、 # 「年齢 = 20歳代」という書式で受け取ることができます。 # # ・mimew.pl使用時、name値を「name」とするとこれを「送信者名」と認識 # して送信元のメールアドレスを「送信者 <メールアドレス>」という # フォーマットに自動変換します。 # (フォーム記述例) # (送信元アドレス) 太郎 # # [ 簡易チェック ] # http://〜〜/postmail.cgi?mode=check # # [ 設置例 ] # # public_html / index.html (トップページ等) # | # +-- postmail / postmail.cgi [755] # jcode.pl [644] # mimew.pl [644] ... 任意 # postmail.html #------------# # 基本設定 # #------------# # 文字コード変換ライブラリ $jcode = './jcode.pl'; # MIMEエンコードライブラリを使う場合(推奨) # → メールヘッダの全角文字をBASE64変換する機能 # → mimew.plを指定 $mimer = './mimew.pl'; # メールソフトまでのパス # → sendmailの例 :/usr/lib/sendmail # → BlatJの例 :c:\blatj\blatj.exe # $mailprog = '/usr/lib/sendmail'; $mailprog = 'D:/Perl/bin/Perl.exe D:/WWW/public_html/cgi/sendmail/sendmail.cgi'; #$mailprog = 'D:/WWW/public_html/cgi/sendmail/sendmail.cgi'; #<--- postmail.cgi?mode=check時に使用。 # 送信先メールアドレス $mailto = 'webmaster@example.com'; # 送信前確認 # 0 : no # 1 : yes $preview = 1; # メールタイトル $subject = "フォームメール"; # スクリプト名 $script = './postmail.cgi'; # 送信後の戻り先 $back = '/index.html'; # method形式 (POST or GET) $method = 'POST'; # 送信は method=POST 限定 (0=no 1=yes) # → セキュリティ対策 $postonly = 1; # bodyタグ $body = ''; # プレビュー画面の枠の色 $tbl_col1 = "#800040"; # プレビュー画面の下地の色 $tbl_col2 = "#FFFFFF"; # ------- 追加改造開始 ------- # LAN 内のプライベートセグメントアドレス(192.168.1.0)を設定して、 # LAN 内からのアクセス(192.168.1.*)に対して、gethostbyaddr関数が実行されないようにします。 # わかない場合は、LAN 内のクライアント機のプライベートアドレスを設定して下さい。 $PrivateSegAddr = '192.168.1.0'; # ------- 追加改造終了 ------- #------------# # 設定完了 # #------------# # デコード処理 require $jcode; &decode; # ------- 改造開始 ------- # チェックモード # if ($in{'mode'} eq "check") { ✓ } # ------- 改造終了 ------- # POSTチェック if ($postonly && !$postflag) { &error("不正なアクセスです"); } # ------- 改造開始 ------- # メールプログラムのパスチェック/種類チェック # unless (-e $mailprog) { &error("メールプログラムのパスが不正です"); } # ------- 改造終了 ------- if ($mailprog =~ /blat/i) { $prog_type=2; } else { $prog_type=1; } # 入力モレエラー if ($flag) { $key2 =~ s/^\_//; &error("$key2の入力は必須です"); } # E-Mail書式チェック if ($in{'email'} =~ /\,/) { &error("メールアドレスにコンマ「\,」が含まれています"); } if ($in{'email'} ne "" && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,5}$/) { &error("メールアドレスの書式が不正です"); } # プレビュー if ($preview && $in{'mode'} ne "send") { &header; print "
\n"; print "

- 以下の内容でよろしければ送信ボタンを押して下さい -

\n"; print "
\n"; print "\n"; print "
\n"; print "\n"; print "\n"; foreach (@key) { next if ($bef eq $_); $in{$_} =~ s//>/g; $in{$_} =~ s/\"/"/g; $in{$_} =~ s/\0/ /g; $in{$_} =~ s/\r\n/
/g; $in{$_} =~ s/\r/
/g; $in{$_} =~ s/\n/
/g; if ($in{$_} =~ /
$/) { while ($in{$_} =~ /
$/) { $in{$_} =~ s/
$//g; } } print ""; print "\n"; $bef = $_; } print "
項目内容
$_$in{$_}\n"; print "
\n

\n"; print "
\n"; print "

\n"; print "\n\n\n"; exit; } # 時間・ホストを取得 &get_time; &get_host; # blatj送信 if ($prog_type == 2) { # 一時ファイルを書き出し $tempfile = "./$$\.tmp"; open(TMP,">$tempfile") || &error("Write Error : $tempfile"); print TMP "「$subject」よりメールの発信がありました.\n\n"; print TMP "送信日時:$date\n"; print TMP "ブラウザ:$ENV{'HTTP_USER_AGENT'}\n"; print TMP "ホスト名:$host\n\n"; foreach (@key) { next if ($_ eq "mode"); next if ($bef eq $_); $in{$_} =~ s/<//g; $in{$_} =~ s/"/\"/g; $in{$_} =~ s/
/\n/g; $in{$_} =~ s/\.\n/\. \n/g; if ($in{$_} =~ /\n/) { print TMP "$_ = \n\n$in{$_}\n"; } else { print TMP "$_ = $in{$_}\n"; } $bef = $_; } close(TMP); # 送信処理 open(MAIL,"| $mailprog $tempfile -t $mailto -s \"$subject\" -q") || &error("メール送信に失敗しました"); close(MAIL); # 一時ファイル削除 unlink($tempfile); } # sendmail送信 else { $mail_body .= "「$subject」よりメールの発信がありました.\n\n"; $mail_body .= "送信日時:$date\n"; $mail_body .= "ブラウザ:$ENV{'HTTP_USER_AGENT'}\n"; # ------- 追加改造開始 ------- # $mail_body .= "ホスト名:$host\n\n"; $mail_body .= "ホスト名:$host ($addr)\n"; $mail_body .= "[ 元IPアドレス:$ENV{'FORWARDED_FOR'} - $ENV{'HTTP_X_FORWARDED_FOR'} ]\n\n"; # ------- 追加改造終了 ------- foreach (@key) { next if ($_ eq "mode"); next if ($bef eq $_); $in{$_} =~ s/<//g; $in{$_} =~ s/"/\"/g; $in{$_} =~ s/
/\n/g; $in{$_} =~ s/\.\n/\. \n/g; if ($in{$_} =~ /\n/) { $mail_body .= "$_ = \n\n$in{$_}\n"; } else { $mail_body .= "$_ = $in{$_}\n"; } $bef = $_; } # JISコード変換 &jcode'convert(*mail_body,'jis'); # メールアドレスがない場合は送信先に置き換え if ($in{'email'} eq "") { $email = $mailto; } else { $email = $in{'email'}; } # MIMEエンコード if (-e $mimer) { require $mimer; $subject2 = &mimeencode($subject); if ($in{'name'}) { $email = "\"$in{'name'}\" <$email>"; $email = &mimeencode($email); } } else { $subject2 = $subject; &jcode'convert(*subject2,'jis'); } open(MAIL,"| $mailprog -t") || &error("メール送信に失敗しました"); print MAIL "To: $mailto\n"; print MAIL "From: $email\n"; print MAIL "Subject: $subject2\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$mail_body\n"; close(MAIL); } # 完了メッセージ &header; print <<"EOM";

ありがとうございました.

送信は正常に完了しました.




Copyright (C) Kent Web 2002
$ver
EOM exit; #----------------# # デコード処理 # #----------------# sub decode { 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); $flag=0; @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'); # 必須項目 if ($key =~ /^\_/) { if ($val eq "") { $flag=1; $key2=$key; last; } } $key =~ s/^\_//; $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; push(@key,$key); } } #--------------# # HTMLヘッダ # #--------------# sub header { $headflag=1; print <<"EOM"; Content-type: text/html $subject $body EOM } #--------------# # エラー処理 # #--------------# sub error { unlink($tempfile) if (-e $tempfile); &header if (!$headflag); print <<"EOM";

ERROR !

$_[0]
EOM exit; } #--------------# # 時間を取得 # #--------------# sub get_time { $ENV{'TZ'} = "JST-9"; local($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); local(@week) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; # ------- 追加改造開始 ------- # LAN 内からのアクセスに対して、gethostbyaddr関数が実行されないようにします。 if (pack("C3", split(/\./, $addr)) eq pack("C3", split(/\./, $PrivateSegAddr))) { $host = $addr; } elsif ($host eq "" || $host eq $addr) { # if ($host eq "" || $host eq $addr) { # ------- 追加改造終了 ------- $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr; } } #----------------# # ホスト名取得 # #----------------# sub check { &header; print "

Check Mode

\n\n\n"; exit; }