#!/usr/local/bin/perl
#┌─────────────────────────────────
#│ POST-MAIL v4.12 (2007/04/24)
#│ copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'postmail v4.12';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 送信フォームのHTMLページの作成に関しては、HTML文法の範疇
#│ となるため、サポート対象外となります。
#│ 3. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問はお受けいたしておりません。
#└─────────────────────────────────
#
# [ 送信フォーム (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 + 半角スペース ...」
# (例)
#
# ・コマンドタグ (2)
# → 2つの入力内容が同一かをチェックする
# → name値を「match」、value値を「項目1 + 半角スペース + 項目2」
# (例)
#
# ・コマンドタグ (3)
# → メール件名を指定する
# → この場合、設定で指定する $subject より優先されます。
# (例)
#
# [ 簡易チェック ]
# http://〜〜/postmail.cgi?mode=check
#
# [ 設置例 ]
#
# public_html / index.html (トップページ等)
# |
# +-- postmail / postmail.cgi [705]
# | postmail.html
# |
# +-- lib / jcode.pl [604]
# | mimew.pl [604] ... 任意
# | io-socket.pl [604]
# |
# +-- tmpl / body.txt
# conf.html
# err1.html
# err2.html
# thx.html
#-------------------------------------------------
# ▼基本設定
#-------------------------------------------------
# 文字コード変換ライブラリ
require './lib/jcode.pl';
# MIMEエンコードライブラリを使う場合(推奨)
# → メールヘッダの全角文字をBASE64変換する機能
# → mimew.plを指定
$mimew = './lib/mimew.pl';
# 送信先メールアドレス
$mailto = 'mizumai@kotobuki-p.co.jp';
# 入力フィールドあたりの最大容量(バイト)
# *参考 : 全角1文字 = 2バイト
$max_field = 400;
# 送信前確認
# 0 : no
# 1 : yes
$preview = 1;
# メールタイトル
$subject = '注文書テスト';
# 本体プログラム【URLパス】
$script = './postmail.cgi';
# 確認画面テンプレート【サーバパス】
$tmp_conf = './tmpl/conf.html';
# 一般エラー画面テンプレート【サーバパス】
$tmp_err1 = './tmpl/err1.html';
# 入力エラー画面テンプレート【サーバパス】
$tmp_err2 = './tmpl/err2.html';
# 送信後画面テンプレート【サーバパス】
$tmp_thx = './tmpl/thx.html';
# 送信「本文」テンプレート【サーバパス】
$tmp_body = './tmpl/body.txt';
# 送信後の形態
# 0 : 完了メッセージを出す.
# 1 : 戻り先 ($back) へ自動ジャンプさせる.
$reload = 0;
# 送信後の戻り先【URLパス】
# → http://から記述する
$back = 'http://www.denkaisui.com/';
# 送信は method=POST 限定 (0=no 1=yes)
# → セキュリティ対策
$postonly = 1;
# アラーム色
$alm_col = "#dd0000";
# ホスト取得方法
# 0 : gethostbyaddr関数を使わない
# 1 : gethostbyaddr関数を使う
$gethostbyaddr = 0;
# アクセス制限(複数あれば半角スペースで区切る、アスタリスク可)
# → 拒否ホスト名又はIPアドレスの記述例
# (前方一致は先頭に ^ をつける)【例】^210.12.345.*
# (後方一致は末尾に $ をつける)【例】*.anonymizer.com$
$denyhost = '';
# 禁止ワード
# → 投稿時禁止するワードをコンマで区切る
$no_wd = '';
# 送信元へ控え (CC) を送る
# 0=no 1=yes
# *セキュリティ上この機能は推奨しません.
# *name="email" のフィールドへの入力が必須となります.
$cc_mail = 0;
# メール送信形式
# 1 : sendmail送信(sendmailが利用可能なサーバ)
# 2 : IO:Socketモジュール送信(ソケット関連のモジュールが利用可能なサーバ)
$send_type = 1;
## sendmail送信のとき ##
# sendmailのパス
$sendmail = '/usr/lib/sendmail';
##【注】sendmail送信の方は設定はここまでで終了。これより下は設定不要です。
## IO:Socketモジュール送信のとき ##
# io-socket.plのパス
$io_socket = './lib/io-socket.pl';
# SMTPサーバ
$server = "mail.server.xx.jp";
# SMTPポート番号(通常は25)
$port = 25;
# POP before SMTPを使用する
# 0 : no
# 1 : yes
$pop_bef_smtp = 0;
# POP3サーバ【POP before SMTPのとき】
$pop3sv = 'mail.server.xx.jp';
# POP3ポート番号(通常は110)【POP before SMTPのとき】
$pop3port = 110;
# 接続ID【POP before SMTPのとき】
$user = 'user_id';
# 接続パスワード【POP before SMTPのとき】
$pass = 'password';
## ↑SMTPサーバへの接続情報ここまで
#-------------------------------------------------
# ▲設定完了
#-------------------------------------------------
# フォームデコード
$ret = &decode;
# 基本処理
if (!$ret) { &error("不明な処理です"); }
elsif ($in{'mode'} eq "check") { ✓ }
# POSTチェック
if ($postonly && !$postflag) { &error("不正なアクセスです"); }
# 汚染チェック
if ($in{'subject'} =~ /\r|\n/) { &error("メール件名が不正です"); }
$in{'subject'} =~ s/\@/@/g;
$in{'subject'} =~ s/\././g;
$in{'subject'} =~ s/\+/+/g;
$in{'subject'} =~ s/\-/−/g;
$in{'subject'} =~ s/\:/:/g;
$in{'subject'} =~ s/\;/;/g;
$in{'subject'} =~ s/\|/|/g;
# 著作権表記(削除不可)
$copy = <
EOM
# 禁止ワード
if ($no_wd) {
local($flg);
foreach (@key) {
foreach $nowd ( split(/,/, $no_wd) ) {
if (index($in{$_},$nowd) >= 0) {
$flg = 1; last;
}
}
if ($flg) { &error("禁止ワードが含まれています"); }
}
}
# ホスト取得&チェック
&get_host;
# 必須入力チェック
if ($in{'need'}) {
local(@tmp, @uniq, %seen);
# needフィールドの値を必須配列に加える
@tmp = split(/\s+/, $in{'need'});
push(@need,@tmp);
# 必須配列の重複要素を排除する
foreach (@need) {
push(@uniq,$_) unless $seen{$_}++;
}
# 必須項目の入力値をチェックする
foreach (@uniq) {
# フィールドの値が投げられてこないもの(ラジオボタン等)
if (!defined($in{$_})) {
$check++;
push(@key,$_);
push(@err,$_);
# 入力なしの場合
} elsif ($in{$_} eq "") {
$check++;
push(@err,$_);
}
}
}
# 入力内容マッチ
if ($in{'match'}) {
($match1,$match2) = split(/\s+/, $in{'match'}, 2);
if ($in{$match1} ne $in{$match2}) {
&error("$match1と$match2の再入力内容が異なります");
}
}
# 入力チェック確認画面
if ($check || $max_flg) { &err_check; }
# E-Mail書式チェック
if ($in{'email'} =~ /\,/) {
&error("メールアドレスにコンマ ( , ) が含まれています");
}
if ($in{'email'} && $in{'email'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
&error("メールアドレスの書式が不正です");
}
# プレビュー
if ($preview && $in{'mode'} ne "send") {
local($cp_flag,$flag,$cell,$tmp,$hidden);
open(IN,"$tmp_conf") || &error("Open Error: $tmp_conf");
print "Content-type: text/html\n\n";
while () {
if (//) {
$flag = 1;
next;
}
if (//) {
$flag = 0;
local($key,$bef,$tmp);
$hidden .= "\n";
foreach $key (@key) {
next if ($bef eq $key);
if ($key eq "need" || $key eq "match" || ($in{'match'} && $key eq $match2)) {
next;
} elsif ($key eq "subject") {
$hidden .= "\n";
next;
}
$in{$key} =~ s/\0/ /g;
$in{$key} =~ s/\r\n/
/g;
$in{$key} =~ s/\r/
/g;
$in{$key} =~ s/\n/
/g;
if ($in{$key} =~ /
$/) {
while ($in{$key} =~ /
$/) {
$in{$key} =~ s/
$//g;
}
}
$tmp = $cell;
$tmp =~ s/\$left/$key/;
$tmp =~ s/\$right/$in{$key}/;
print "$tmp\n";
$hidden .= "\n";
$bef = $key;
}
next;
}
if ($flag) {
$cell .= $_;
next;
}
s/\$script/$script/;
s//$hidden/;
if (/(<\/body([^>]*)>)/i) {
$cp_flag = 1;
$tmp = $1;
s/$tmp/$copy\n$tmp/;
}
print;
}
close(IN);
if (!$cp_flag) { print "$copy\n