#!/usr/bin/perl $| = 1; # # RCS Infomation. # 削除変更禁止 ----------------------------------------------------------------------------------------- # $CGI{'RCS_ID'} = "$Id: form_submit.pl 1.14 2002/04/05 06:24:39 Administrator Exp Administrator $damy"; $CGI{'RCS_SOURCE'} = "$Source: D:/Users/administrator/projects/works/salut/C-007_tkcontactform1/visit\\RCS/form_submit.pl $damy"; # ------------------------------------------------------------------------------------------------------ # # 以下,情報の変更・削除を禁じます --------------------------------------------------------------------- # # TKContactForm1 v1.1:お問い合せフォーム:受付プログラム # Copyright(C) NTTPC Communications, Inc. 2001 # Programmed by Tomonori Kamitaki # # [注意事項] # スクリプト中の削除変更禁止やそれに関するコメントがあるコードは, # 著作権保護の為に一切の変更を認めません。 # # [利用規程および規約] # スクリプト配布元であるSalut!(サリュ)のホームページをご覧下さい。 # Salut!(サリュ)ホームページ => http://www.salut.ne.jp/ # # --------------------------------------------------------------------------------------------- ここまで # # 以下,情報の変更・削除を禁じます --------------------------------------------------------------------- # $CGI{'TITLE'} = "TKContactForm1"; $CGI{'COPYRIGHT'} = "Copyright(C) NTTPC Communications, Inc. 2001"; $CGI{'COPYRIGHT_URL'} = "http://www.nttpc.co.jp/"; $CGI{'VERSION'} = "Ver. 1.10"; $CGI{'REVISION'} = "Rev. $Revision: 1.14 $damy"; $CGI{'PROG_BY'} = "Tomonori Kamitaki"; $CGI{'PROG_MAIL'} = ""; $CGI{'INFOMATION'} = $CGI{'TITLE'}." by Salut! Web Master's Heaven"; $CGI{'INFOMATION_URL'} = "http://www.salut.ne.jp/"; $CGI{'SUPPORT_MAIL'} = ""; $CGI{'COOKIE_AUTHOR'} = $CGI{'TITLE'}."VISIT"; # --------------------------------------------------------------------------------------------- ここまで # # 変数の設定 1(環境に応じて設定します)---------------------------------------------------------------- # # 文字エンコード指定:( jis | sjis | euc )から選択。(通常変更不要) # 文字コード変換へは,jcode.plを使用します。 $g_char_encoding = "sjis"; # ※省略時は,変換を省きます。 # ----------------------------------------------------------------------------------------- 変数の設定 1 # # 変数の設定 2(通常は変更不要:変更した場合の動作保証はありません)------------------------------------ # # ロックファイル保存用パス $g_lock_file = "../tmp/global.lok"; # ロックのタイプ( lock_type : lockWithOpen = 0, lockWithSym = 1 ) $g_lock_type = 1; # form_submit.pl の設定ファイル $g_usr{'local_config'} = "../visit/form_submit.cfg"; $g_usr{'global_config'} = "../share/global.cfg"; # HTMLテンプレートファイル $g_html{'subm_form'} = "../share/tpl/fsub_subm_form_tpl.html"; # 入力フォーム用テンプレート $g_html{'subm_conf'} = "../share/tpl/fsub_subm_conf_tpl.html"; # 確認用テンプレート $g_html{'subm_comp'} = "../share/tpl/fsub_subm_comp_tpl.html"; # 受付完了用テンプレート $g_html{'xxxx_erro'} = "../share/tpl/fsub_xxxx_error_tpl.html"; # エラー用テンプレート # メールテンプレート $g_mail{'send_ownr'} = "../share/tpl/fsub_mail_to_owner_tpl.txt"; # 受付メール(設置車向け)テンプレート $g_mail{'send_visi'} = "../share/tpl/fsub_mail_to_visitor.txt"; # 受付メール(質問者向け)テンプレート # データ保存用テンプレート $g_usr{'save_tpl'} = "../share/tpl/fsub_save_to_disk_tpl.txt"; # データ保存先 $g_usr{'curr_data'} = "../admin/log/form_current.log"; # 問い合わせ番号保存先 $g_usr{'curr_num'} = "../admin/log/form_current_num.log"; # セパレータ文字 $g_sep = "<>"; # ----------------------------------------------------------------------------------------- 変数の設定 2 # # メール機能(開発・デバッグ用 1 = ON, 0 = OFF) $enable_mail = 1; # デモ機能(デモ用 1 = ON, 0 = OFF) $enable_demo = 0; # 開発・デバッグ用 $enable_debug = 0; if($enable_debug) { open (DEBUG, ">debug_form_submit.txt") or die "debug log error!"; } #ライブラリをロード require '../share/tk_util4.pl'; require '../share/tkcontactform1_slib.pl'; #グローバル変数 %g_in; # メイン処理 &main(); sub main { my($error, $proc_ref); my(%usr_cfg, %proc_mode); my(%command_referer); # 入力内容を解析・取得 &tk_util4::parseInput(\%g_in, $g_char_encoding); # 設定ファイルの読込 my(@usr_cfg_file) = ($g_usr{'local_config'}, $g_usr{'global_config'}); if($error = &tk_util4::readConfigFile(\@usr_cfg_file, \%usr_cfg)) { &error($error); } # 設定内容のチェック &check_usr_config(\%usr_cfg); # CGI内部情報を設定 &tk_util4::set_cgi_info(\%g_in, \%usr_cfg); # ディスク空き容量チェック &tkcontactform1_slib::check_disk_availability(\%usr_cfg); # ファイルロックの開始 if($error = &tk_util4::lock_start($g_lock_file, $g_lock_type)) { &error($error, 0, 1); } # Command Refererテーブル作成 %command_referer = ( "FORM" , "FORM", "CONFIRM" , "FORM", "SUBMIT" , "CONFIRM", ); # コマンド指定はあるか? if($g_in{'COMMAND'}) { # ある:処理関数のリファレンス・テーブル作成 %proc_mode = ( "FORM" , \&process_form, "CONFIRM" , \&process_confirm, "SUBMIT" , \&process_submit, ); # 指定された処理関数は,存在するかな? if(exists $proc_mode{$g_in{'COMMAND'}}) { # あり # 処理関数へのリファレンスを取り出し $proc_ref = $proc_mode{$g_in{'COMMAND'}}; # リファレンスをセット $g_in{'COMMAND_REFERER'} = $command_referer{$g_in{'COMMAND'}}; # 処理関数を実行 &$proc_ref(\%usr_cfg); } else { # 未定義処理:エラー表示を行う &error("プログラムは,未定義な処理コマンド内容をリクエストされました。
処理は続行不能\です。URLや入力フォーム等が間違っていないか確かめてから再度アクセスしてみて下さい。".$g_in{'COMMAND'}); } } else { # ない:デフォルト処理処理 # コマンドをセット $g_in{'COMMAND'} = "FORM"; # リファレンスをセット $g_in{'COMMAND_REFERER'} = $command_referer{$g_in{'COMMAND'}}; # 処理関数を実行 &process_form(\%usr_cfg); } # ロックファイル終了 &tk_util4::lock_end($g_lock_file); } # フォームの処理 sub process_form { my($usr_cfg_ref) = @_; my($error); my(%cookie); my(%tpl_html); my($key); foreach $key (sort keys %g_in) { $g_in{$key} =~ s/
/\n/gi; } # テンプレートHTMLの読込 if($error = &tk_util4::readDataFile($g_html{'subm_form'}, $tk_util4::k_tpl_html, \%tpl_html)) { &error($error); } # HTMLを表示 &tk_util4::show_view(\%g_in, \%tpl_html, $usr_cfg_ref); } # 内容確認の処理 sub process_confirm { my($usr_cfg_ref) = @_; my($error, $gd_kind_num); my(%cookie); my(%tpl_html); # 入力フォームのチェック &check_input_form($usr_cfg_ref); # テンプレートHTMLの読込 if($error = &tk_util4::readDataFile($g_html{'subm_conf'}, $tk_util4::k_tpl_html, \%tpl_html)) { &error($error); } # HTMLを表示 &tk_util4::show_view(\%g_in, \%tpl_html, $usr_cfg_ref); } # 受付の処理 sub process_submit { my($usr_cfg_ref) = @_; my($error, $gd_kind_num, $tpl_html_file); my(%cookie); my(%tpl_html); my($mail_visit, $mail_owner); # 入力フォームのチェック &check_input_form($usr_cfg_ref); # 受付番号の処理 $g_in{'CONTACT_NUM'} = &add_contact_number(); # 質問者用メール送信文作成 &create_contact_mail_string($usr_cfg_ref, \%cookie, $g_mail{'send_visi'}, \$mail_visit); # 設置者用メール送信文作成 &create_contact_mail_string($usr_cfg_ref, \%cookie, $g_mail{'send_ownr'}, \$mail_owner); # デモモード? if($enable_demo) { # デモ: $g_in{'MAIL_VISIT'} = $mail_visit; $g_in{'MAIL_OWNER'} = $mail_owner; } else { # 通常: # データを蓄える &save_contact_data($usr_cfg_ref, \%cookie); # デバッグ・開発時用分岐 if($enable_mail) { # 顧客へ受付メールを送信 if($error = &tk_util4::send_mail(\$mail_visit, $usr_cfg_ref->{'global-OWNER_EMAIL'})) { &error($error); } # 店主へメール送信するのか? if($usr_cfg_ref->{'form_submit-SEND_MAIL_EVERY_CONTACT'}) { # 店主へ受付メールを送信 if($error = &tk_util4::send_mail(\$mail_owner, $usr_cfg_ref->{'global-OWNER_EMAIL'})) { &error($error); } } } else { if($enable_debug) { print DEBUG $mail_visit; print DEBUG $mail_owner; } } } # テンプレートHTMLの読込 if($error = &tk_util4::readDataFile($g_html{'subm_comp'}, $tk_util4::k_tpl_html, \%tpl_html)) { &error($error); } # HTMLを表示 &tk_util4::show_view(\%g_in, \%tpl_html, $usr_cfg_ref); } # 受付番号処理 sub add_contact_number { my($num); if(-e $g_usr{'curr_num'}) { open(READ, $g_usr{'curr_num'}) or die &error("受付番号処理に失敗しました。READ $!"); chop($num = ); close(READ); } else { $num = "00000000"; } $num++; open(WRITE, ">$g_usr{'curr_num'}") or die &error("受付番号処理に失敗しました。WRITE $!"); print WRITE $num."\n"; close(WRITE); return $num; } # メール送信文作成 sub create_contact_mail_string { my($usr_cfg_ref, $cookie_ref, $tpl_mail_file, $mail_data_ref) = @_; # sub関数用の引数取得 my($error, $mail_data); my(%tpl); my(%od_sel); my(@gd_replace_dst); # テンプレートの読込 if($error = &tk_util4::readDataFile($tpl_mail_file, $tk_util4::k_tpl, \%tpl, 1)) { &error($error); } # テンプレート初期化 &tk_util4::setup_tpl(\%g_in, \%tpl, $usr_cfg_ref, $cookie_ref); # メール・ヘッダをセット $$mail_data_ref = $tpl{'MAIL_HEAD'}; # メイン・ヘッダ(頭側)をセット $$mail_data_ref .= $tpl{'MAIN_HEAD'}; # メイン・フッタをセット $$mail_data_ref .= $tpl{'MAIN_FOOT'}; # リファレンス返値 return $mail_data_ref; } # データ保存 sub save_contact_data { my($usr_cfg_ref, $cookie_ref) = @_; # sub関数用の引数取得 my($error, $save_data); my(%tpl); my(%od_sel); my(@gd_replace_dst); # テンプレートの読込 if($error = &tk_util4::readDataFile($g_usr{'save_tpl'}, $tk_util4::k_tpl, \%tpl, 1)) { &error($error); } # テンプレート初期化 &tk_util4::setup_tpl(\%g_in, \%tpl, $usr_cfg_ref, $cookie_ref); # メイン・ヘッダ(頭側)をセット $save_data = $tpl{'MAIN_HEAD'}; # メイン・フッタをセット $save_data .= $tpl{'MAIN_FOOT'}; # HTML文字を元に戻す &tk_util4::convert_char_html2std(\$save_data); open(SAVE_ADD, ">>$g_usr{'curr_data'}") or die &error("データの保存に失敗しました。\nお問い合せはキャンセルされます。\n\nこのエラーが頻繁に発生する場合は,管理者またプログラム配布者にご連絡お願い致します。"); print SAVE_ADD $save_data; close(SAVE_ADD); } # 入力フォームのチェック sub check_input_form { my($usr_cfg_ref) = @_; my($ret); my($error_std); my($error_ext); my($error_tmp); # 入力フォームチェック項目:通常 $ret = &tk_util4::check_input_form(\%g_in, \($usr_cfg_ref->{'form_submit-CHECK_INPUT_FORM_ITEM_LIST'}), \$error_tmp); if($error_tmp) { # エラー $error_std .= $error_tmp; } # 入力フォームチェック項目:数字 $ret += &tk_util4::check_input_form(\%g_in, \($usr_cfg_ref->{'form_submit-CHECK_INPUT_FORM_ITEM_LIST_WITH_NUM'}), \$error_tmp, 1); if($error_tmp) { # エラー $error_std .= "\n".$error_tmp; } # 入力フォームチェック項目:通常 $ret = &tk_util4::check_input_form(\%g_in, \("EMAIL<>メールアドレス"), \$error_tmp); if($error_tmp) { # エラー $error_std .= "\n".$error_tmp; } # エラーはあったか? if($error_std) { # あり:エラー表示 &error($error_std); } # メールアドレスのチェック(書式的に) if(length($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-EMAIL_ITEM_NAME"}})) { if($error_tmp = &tk_util4::check_email_address(\($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-EMAIL_ITEM_NAME"}}))) { # エラー:エラー表示 &error($error_tmp); } } } # 設定内容のチェック sub check_usr_config { my($config_ref) = @_; # ホストのデータ・アイテム名のチェック if(!($config_ref->{$config_ref->{'id-0'}."-HOST_ITEM_NAME"})) { # デフォルト設定:HOST $config_ref->{$config_ref->{'id-0'}."-HOST_ITEM_NAME"} = "HOST"; } # 日時のデータ・アイテム名のチェック if(!($config_ref->{$config_ref->{'id-0'}."-DATE_ITEM_NAME"})) { # デフォルト設定:DATE $config_ref->{$config_ref->{'id-0'}."-DATE_ITEM_NAME"} = "DATE"; } # メールのデータ・アイテム名のチェック if(!($config_ref->{$config_ref->{'id-0'}."-EMAIL_ITEM_NAME"})) { # デフォルト設定:EMAIL_ITEM_NAME $config_ref->{$config_ref->{'id-0'}."-EMAIL_ITEM_NAME"} = "EMAIL"; } } # エラー処理関数 # $error_type:auto_text = 0; plain_text = 1; gif = 10 # $error_lock:解除 = 0; 放置 = 1; # ※auto_text は,HTMLテンプレートがある時は HTML ない時は plain でエラーを表示します。 sub error { my($errorStr, $error_type, $error_lock, $error_level) = @_; my(%tpl_html, %usr_cfg); # ロック解除あり? unless($error_lock) { # ロック解除: &tk_util4::lock_end($g_lock_file); } # エラーの種類は? if($error_type < 10) { # text:タイプは?auto || plain if($error_type == 0) { # auto:エラー用テンプレートHTMLは存在するか? if(!(-e $g_html{'xxxx_erro'})) { # 存在しない(plain text):HTMLヘッダを出力 &tk_util4::out_html_header(); #
を改行へ $errorStr =~ s/
/\n/g; # エラーメッセージを出力 print "Error : $errorStr\n"; } else { # 存在する(HTML) # エラー文字をセット $g_in{'ERROR'} = $errorStr; # 設定ファイルの読込 my(@usr_cfg_file) = ($g_usr{'local_config'}, $g_usr{'global_config'}); if($error = &tk_util4::readConfigFile(\@usr_cfg_file, \%usr_cfg)) { # 読込エラー:HTMLヘッダを出力 &tk_util4::out_html_header(); #
を改行へ $errorStr =~ s/
/\n/g; # エラーメッセージを出力 print "Error : $errorStr\nError : $error\n"; } else { # 設定内容のチェック &check_usr_config(\%usr_cfg); # エラーレベル指定有り? unless($error_level) { $error_level = "0"; } $usr_cfg{$usr_cfg{'id-0'}.'-ERROR_LEVEL-'.$error_level} = "enable"; # テンプレートHTMLの読込 if($error = &tk_util4::readDataFile($g_html{'xxxx_erro'}, $tk_util4::k_tpl_html, \%tpl_html)) { # 読込エラー:HTMLヘッダを出力 &tk_util4::out_html_header(); #
を改行へ $errorStr =~ s/
/\n/g; # エラーメッセージを出力 print "Error : $errorStr\nError : $error\n"; } else { $g_in{'ERROR'} =~ s/\n/
/g; # HTMLを表示 &tk_util4::show_view(\%g_in, \%tpl_html, \%usr_cfg); } } } } else { # plain text:HTMLヘッダを出力 &out_html_header(); # エラーメッセージを出力 print "Error : $errorStr\n"; } # エラー時のデバッグ用にフォーム変数の内容を出力 &tk_util4::testHashOut("g_in", \%g_in); } else { # gif:ERROR GIF IMAGE を作成 my(@err_gif) = ( '47', '49', '46', '38', '39', '61', '2d', '00', '0f', '00', '80', '00', '00', '00', '00', '00', 'ff', 'ff', 'ff', '2c', '00', '00', '00', '00', '2d', '00', '0f', '00', '00', '02', '49', '8c', '8f', 'a9', 'cb', 'ed', '0f', 'a3', '9c', '34', '81', '7b', '03', 'ce', '7a', '23', '7c', '6c', '00', 'c4', '19', '5c', '76', '8e', 'dd', 'ca', '96', '8c', '9b', 'b6', '63', '89', 'aa', 'ee', '22', 'ca', '3a', '3d', 'db', '6a', '03', 'f3', '74', '40', 'ac', '55', 'ee', '11', 'dc', 'f9', '42', 'bd', '22', 'f0', 'a7', '34', '2d', '63', '4e', '9c', '87', 'c7', '93', 'fe', 'b2', '95', 'ae', 'f7', '0b', '0e', '8b', 'c7', 'de', '02', '00', '3b' ); # gif イメージヘッダを出力 print "Content-type: image/gif\n\n"; foreach (@err_gif) { my($data) = pack('C*',hex($_)); print $data; } } exit(1); } #EOF 1;