#!/usr/local/bin/perl #┌───────────────────────────────── #│ PostMail v2.1 (2003/04/23) #│ Copyright (c) KentWeb 2003 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'PostMail v2.1'; #┌───────────────────────────────── #│ [注意事項] #│ 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」とするとこれを「送信者名」と認識 # して送信元のメールアドレスを「送信者 <メールアドレス>」という # フォーマットに自動変換します。 # (フォーム記述例) # (送信元アドレス) 太郎 # # ・コマンドタグ (1) # → 入力必須項目を強制指定する(半角スペースで複数指定可) # → ラジオボタン、チェックボックス対策 # → name値を「need」、value値を「必須項目1 + 半角スペース +必須項目2 + 半角スペース ...」 # (例) # # [ 簡易チェック ] # 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/sbin/sendmail'; # 送信先メールアドレス $mailto = 'tatsu@psueda.sakura.ne.jp access@mx21.tiki.ne.jp'; # 送信前確認 # 0 : no # 1 : yes $preview = 0; # メールタイトル $subject = 'P.Sメール'; # スクリプト名 $script = './postmail.cgi'; # 送信後の形態 # 0 : 完了メッセージを出す. # 1 : 戻り先 ($back) へ自動ジャンプさせる. $reload = 0; # 送信後の戻り先 # → http://から記述する $back = 'http://ww21.tiki.ne.jp/~access/renraku.html'; # 送信は method=POST 限定 (0=no 1=yes) # → セキュリティ対策 $postonly = 1; # bodyタグ $body = ''; # プレビュー画面の枠の色 $tbl_col1 = "#003399"; # プレビュー画面の下地の色 $tbl_col2 = "#FFFFFF"; # プレビュー画面の項目下地の色 $tbl_col3 = "#EBECF5"; #------------# # 設定完了 # #------------# # デコード処理 require $jcode; &decode; # チェックモード if ($in{'mode'} eq "check") { ✓ } # POSTチェック if ($postonly && !$postflag) { &error("不正なアクセスです"); } # メールプログラムのパスチェック/種類チェック unless (-e $mailprog) { &error("メールプログラムのパスが不正です"); } if ($mailprog =~ /blat/i) { $pgType = 2; } else { $pgType = 1; } # 入力モレエラー if ($flag) { $key2 =~ s/^\_//; &error("$key2の入力は必須です"); } # 必須入力 if ($in{'need'}) { local($f); foreach $need ( split(/\s+/, $in{'need'}) ) { $f=0; foreach $key (@key) { if ($need eq $key) { $f=1; if ($in{$key} eq "") { &error("$needは入力必須です"); } } } if (!$f) { &error("$needは入力必須です"); } } } # E-Mail書式チェック if ($in{'email'} =~ /\,/) { &error("メールアドレスにコンマ「\,」が含まれています"); } if ($in{'email'} ne "" && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) { &error("メールアドレスの書式が不正です"); } # プレビュー if ($preview && $in{'mode'} ne "send") { &header; print <<"EOM";

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

EOM foreach (@key) { next if ($bef eq $_); if ($_ eq "need") { print "\n"; next; } $in{$_} =~ s//>/g; $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 = $_; $messe = "$in{$_}"; } print <<"EOM";
$_ :   $in{$_}\n"; print "

EOM exit; } # 時間・ホストを取得 ($date,$dat2) = &get_time; &get_host; # blatj送信 if ($pgType == 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 ($_ eq "need"); next if ($bef eq $_); $in{$_} =~ s/<//g; $in{$_} =~ s/"/"/g; $in{$_} =~ s/&/&/g; $in{$_} =~ s/\0/ /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"; foreach (@key) { next if ($_ eq "mode"); next if ($_ eq "need"); next if ($bef eq $_); $in{$_} =~ s/<//g; $in{$_} =~ s/"/\"/g; $in{$_} =~ s/&/&/g; $in{$_} =~ s/\0/ /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' ,'sjis'); # メールアドレスがない場合は送信先に置き換え 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 "Date: $dat2\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$mail_body\n"; close(MAIL); } # リロード if ($reload) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $back\n\n"; exit; # 完了メッセージ } else { &header; print <<"EOM";


























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

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




EOM exit; } #----------------# # デコード処理 # #----------------# sub decode { local($key, $val, $buf); if ($ENV{'REQUEST_METHOD'} eq "POST") { $postflag=1; read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $postflag=0; $buf = $ENV{'QUERY_STRING'}; } $flag=0; @key=(); %in=(); foreach ( split /&/, $buf ) { ($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'); # タグ排除 $key =~ s/&/&/g; $key =~ s/"/"/g; $key =~ s//>/g; $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; # 必須項目 if ($key =~ /^\_/ && $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 "Content-type: text/html\n\n"; print <<"EOM"; $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(@w) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); local(@m) = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); # 日時のフォーマット local($d1) = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$w[$wday],$hour,$min); local($d2) = sprintf("%s, %02d %s %04d %02d:%02d:%02d", $w[$wday],$mday,$m[$mon],$year+1900,$hour,$min,$sec) . " +0900"; return ($d1,$d2); } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_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; } __END__