#!/usr/bin/perl #******************************************************************************* # # メールフォームCGI # #******************************************************************************* #_______________________________________________________________________________ # モジュール、ライブラリの呼び出し require 'lib/epl.cgi'; # eoeo Perl Library #******************************************************************************* # 定数 #******************************************************************************* #====================================== # 設定 #====================================== %chCONF = ( MAIL => { # メール関連 to => 'eizen@jasmine.ocn.ne.jp', # 送信先(管理者) from => 'eizen@jasmine.ocn.ne.jp', # 送信元 }, finish_url => 'finish.html', # メール送信後リダイレクトURL ); #====================================== # フォーム関連 #====================================== %chFORM = ( items => [ # 入力項目設定 # name フォームのname値 # input 必須入力 1:必須入力項目 0:任意入力項目 # input_err_msg 未入力時のエラーメッセージ # input_err_id 未入力時のエラーリンク先ID # multi_line 改行制御 1:改行制御有 0:改行制御無 # cnvert_num 数値の全角→半角変換 # option_list プルダウンリストボックスの項目(表示名) # option_value プルダウンリストボックスの項目(値) # option_default プルダウンリストボックスのデフォルト選択項目 # radio_list ラジオボタンの項目 # radio_default ラジオボタンのデフォルト選択項目 # check_list チェックボックスの項目 { name => 'name_kana', }, { name => 'name', input => 1, input_err_msg => 'お名前が未入力です。', input_err_id => 'name', }, { name => 'email', input => 1, input_err_msg => 'メールアドレスが未入力です。', input_err_id => 'email', }, { name => 'email_confirm', input => 1, input_err_msg => 'メールアドレス(確認用)が未入力です。', input_err_id => 'email_confirm', }, { name => 'inq', input => 1, input_err_msg => 'お問い合わせ内容が未入力です。', input_err_id => 'inq', multi_line => 1, }, ], ); #====================================== # プログラム関連 #====================================== %chPGM = ( CGI => { # CGIスクリプト関連 form => 'index.cgi', # フォームCGI }, PATH => { # パス関連 sendmail => '/usr/sbin/sendmail', # sendmailへのパス # sendmail => 'C:\sendm\sendmane.exe', # sendmaneへのパス(local) }, ); #====================================== # テンプレート関連 #====================================== %chTMPL = ( Input => '_tmpl_form.html', # ログイン Conf => '_tmpl_form.html', # メニュー Send => '_tmpl_form.html', # クーポン誌管理 PutError => '_tmpl_form.html', # システムエラー ); #******************************************************************************* # グローバル変数 #******************************************************************************* # システム関連 %ghSys = (); %ghForm = (); #******************************************************************************* # フレームワーク #******************************************************************************* # 初期処理 &Initialize(); # メイン処理 eval( '&' . $ghSys{'MODE'} . '()' ); exit; #******************************************************************************* # 初期処理 # Initialize 初期処理 #******************************************************************************* #_______________________________________________________________________________ # 初期処理 sub Initialize { # フォームデータを読み込み &eoForm::Get( \%ghForm, $eoChr::csUTF8 ); # 改行、記号制御 foreach my $sKey( keys( %ghForm ) ) { if( ref($ghForm{$sKey}) ne 'ARRAY' ) { $ghForm{$sKey} = &eoStr::RetToBr( &eoStr::TextToHtml( $ghForm{$sKey} ) ); } else { # チェックボックスで複数選択された場合 foreach my $sItem( @$ghForm{$sKey} ) { $sItem = &eoStr::RetToBr( &eoStr::TextToHtml( $sItem ) ); } } } # 入力補完チェック foreach my $rhItem( @{$chFORM{items}} ) { if( $$rhItem{convert_num} ) { # 数値の半角変換 $ghForm{$$rhItem{name}} = &CnvNum( $ghForm{$$rhItem{name}} ); } } # 入力内容チェック $ghSys{ERR} = &checkInput(); # モードの取得(デフォルト:Input) if( $ghForm{MODE} eq '' ) { # 旧モードが未指定の場合はエラー情報を消去 $ghSys{MODE} = 'Input'; $ghSys{ERR} = ''; } elsif( $ghSys{ERR} ) { # モード指定があるが、入力エラーの場合は再入力へ $ghSys{MODE} = 'Input'; } else { # モード指定があり、入力エラーがない場合 $ghSys{MODE} = $ghForm{MODE}; } } # Initialize End #******************************************************************************* # メイン処理 # Input 入力 #******************************************************************************* #_______________________________________________________________________________ # 入力 sub Input { my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{$ghSys{MODE}}, die_on_bad_params => 0 ); # 固定テンプレート値をセット $sTmpl->param( CGI_FORM => $chPGM{CGI}{form} ); # 条件セット $sTmpl->param( CND_ . $ghSys{MODE} => 1 ); if( $ghForm{MODE} eq '' ) { # 初回表示時 $sTmpl->param( CND_First => 1 ); } # エラー値セット if( $ghSys{ERR} ) { $sTmpl->param( Err => $ghSys{ERR} ); } # 入力値セット &setTemplate( \$sTmpl, \%ghForm ); # 表示 &eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 ); } # Input End #_______________________________________________________________________________ # 確認 sub Conf { my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{$ghSys{MODE}}, die_on_bad_params => 0 ); # 固定テンプレート値をセット $sTmpl->param( CGI_FORM => $chPGM{CGI}{form} ); # 条件セット $sTmpl->param( CND_ . $ghSys{MODE} => 1 ); # 入力値セット &setTemplate( \$sTmpl, \%ghForm ); # 表示 &eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 ); } # Conf End #_______________________________________________________________________________ # 送信 sub Send { my( $sErr ); # 記号制御 foreach my $rhItem( @{$chFORM{items}} ) { if( ref($ghForm{$$rhItem{name}}) ne 'ARRAY' ) { $ghForm{$$rhItem{name}} = &eoStr::BrToRet( &eoStr::HtmlToText( $ghForm{$$rhItem{name}} ) ); } else { # チェックボックスで複数選択された場合 foreach my $sItem( @$ghForm{$$rhItem{name}} ) { $sItem = &eoStr::BrToRet( &eoStr::HtmlToText( $sItem ) ); } } } # 管理者宛にメール送信 &MailSend( $chCONF{MAIL}{to}, \%ghForm, 'txt_admin.cgi' ); # ユーザへの返信確認 # if( $ghForm{Mail} ne '' ) # { # &MailSend( $ghForm{Mail}, \%ghForm, 'txt_user.cgi' ); # } # 完了画面へリダイレクト &eoHtml::Jump( $chCONF{finish_url} ); } # Send End #******************************************************************************* # 入力内容処理 # setTemplate 入力値をテンプレートにセット # checkInput 入力内容をチェック #******************************************************************************* #_______________________________________________________________________________ # 入力値をテンプレートにセット sub setTemplate { my( $rsTmpl, $rhForm ) = @_; # セット foreach my $rhItem( @{$chFORM{items}} ) { if( ref($$rhForm{$$rhItem{name}}) ne 'ARRAY' ) { $$rsTmpl->param( $$rhItem{name} => $$rhForm{$$rhItem{name}} ); } else { # チェックボックスで複数選択された場合 my( @aParam ) = (); foreach my $sItem( @{$$rhForm{$$rhItem{name}}} ) { push( @aParam, $sItem ); } $$rsTmpl->param( $$rhItem{name} => join( '、', @aParam ) ); } } # 各種制御 foreach my $rhItem( @{$chFORM{items}} ) { # チェックボックスソースを取得 if( $$rhItem{check_list} ) { $$rsTmpl->param( $$rhItem{name}.'_CHECK_LIST' => &GetCheckSrc( $$rhForm{$$rhItem{name}}, $rhItem ) ); $$rsTmpl->param( $$rhItem{name}.'_CHECK_LIST_HIDDEN' => &GetCheckHiddenSrc( $$rhForm{$$rhItem{name}}, $rhItem ) ); } # ラジオボタンソースを取得 if( $$rhItem{radio_list} ) { $$rsTmpl->param( $$rhItem{name}.'_RADIO_LIST' => &GetRadioSrc( $$rhForm{$$rhItem{name}}, $rhItem ) ); } # プルダウンリストボックスソースを取得 if( $$rhItem{option_list} ) { $$rsTmpl->param( $$rhItem{name}.'_OPTION_LIST' => &GetOptionSrc( $$rhForm{$$rhItem{name}}, $rhItem ) ); } # 改行制御 if( $$rhItem{multi_line} ) { $$rsTmpl->param( $$rhItem{name}.'_RET' => &eoStr::BrToRet( $$rhForm{$$rhItem{name}} ) ); } } } # setTemplate End #_______________________________________________________________________________ # 入力内容チェック sub checkInput { my( @aErr ) = (); # スパム対策チェック if( $ghForm{'eoAntiSpam'} eq '' ) { push( @aErr, { ID => '', Msg => 'Javascriptが無効になっている可能性があります。' } ); return \@aErr; } # 必須入力エラーチェック foreach my $rhItem( @{$chFORM{items}} ) { if( $$rhItem{input} ) { if( $ghForm{$$rhItem{name}} eq '' ) { # エラーメッセージをストック push( @aErr, { ID => $$rhItem{input_err_id}, Msg => $$rhItem{input_err_msg} } ); } } } # その他のエラーチェック if( $ghForm{email} ne '' ) { if( $ghForm{email} !~ /.+\@.+\..+/ ) { push( @aErr, { ID => 'email', Msg => 'メールアドレスの形式を確認してください。' } ); } } if( $ghForm{email_confirm} ne '' ) { if( $ghForm{email_confirm} !~ /.+\@.+\..+/ ) { push( @aErr, { ID => 'email_confirm', Msg => 'メールアドレス(確認用)の形式を確認してください。' } ); } } if( ( $ghForm{email} ne '' && $ghForm{email_confirm} ne '' ) && $ghForm{email} ne $ghForm{email_confirm} ) { push( @aErr, { ID => 'email', Msg => 'メールアドレスが確認用と一致しません。' } ); } if( @aErr ) { return \@aErr; } else { return ''; } } # checkInput End #******************************************************************************* # その他 # MailSend メール送信 # GetListSrc プルダウンリストボックスソースを取得 # PutError エラー表示 #******************************************************************************* #_______________________________________________________________________________ # メール送信 sub MailSend { my( $sMailTo, $rhForm, $sTxtSrc ) = @_; my( $sTmpl ); # メール雛形を読み込み require $sTxtSrc; # ソースコード変換 $sTmpl = HTML::Template->new( scalarref => \$gsMAIL_BODY, die_on_bad_params => 0 ); # 入力値セット &setTemplate( \$sTmpl, $rhForm ); # メールの送信 if( $sErr = &eoMail::Send( $sMailTo, $chCONF{MAIL}{from}, $gsMAIL_SBJ, $sTmpl->output, '', $chPGM{PATH}{sendmail} ) ) { # 送信エラー &PutError( $sErr ); } } # MailSend End #_______________________________________________________________________________ # SJIS全角数字→半角数字変換 sub CnvNum { my( $sNum ) = @_; $sNum =~ s/(?:[\x82]([\x4F-\x58]))/pack(H2,sprintf("%X",ord($1)-31))/eg; return $sNum; } # CnvNum End #_______________________________________________________________________________ # チェックボックスソースを取得 sub GetCheckSrc { my( $sSel, $rhItem ) = @_; my( @aSel ) = (); my( $sSrc ) = ''; # 選択配列を生成 if( ref($sSel) ne 'ARRAY' ) { push( @aSel, $sSel ); } else { @aSel = @$sSel; } # 一覧ソースを生成 for( my $i=0; $i<@{$$rhItem{check_list}}; $i++ ) { my( $sFlgSel ) = ''; # 選択判定 foreach my $sSelItem( @aSel ) { if( $$rhItem{check_list}[$i] eq $sSelItem ) { $sFlgSel = 1; last; } } if( $sFlgSel ) { $sSrc .= qq( ); } else { $sSrc .= qq( ); } } return $sSrc; } # GetCheckSrc End #_______________________________________________________________________________ # チェックボックスソース(hidden用)を取得 sub GetCheckHiddenSrc { my( $sSel, $rhItem ) = @_; my( @aSel ) = (); my( $sSrc ) = ''; # 選択配列を生成 if( ref($sSel) ne 'ARRAY' ) { push( @aSel, $sSel ); } else { @aSel = @$sSel; } # 一覧ソースを生成 for( my $i=0; $i<@{$$rhItem{check_list}}; $i++ ) { # 選択判定 foreach my $sSelItem( @aSel ) { if( $$rhItem{check_list}[$i] eq $sSelItem ) { $sSrc .= qq(); } } } return $sSrc; } # GetCheckHiddenSrc End #_______________________________________________________________________________ # ラジオボタンソースを取得 sub GetRadioSrc { my( $sSel, $rhItem ) = @_; my( $sSrc ) = ''; # 選択判定 if( $sSel eq '' ) { $sSel = $$rhItem{radio_default}; } # 一覧ソースを生成 for( my $i=0; $i<@{$$rhItem{radio_list}}; $i++ ) { if( $$rhItem{radio_list}[$i] eq $sSel ) { $sSrc .= qq( ); } else { $sSrc .= qq( ); } } return $sSrc; } # GetRadioSrc End #_______________________________________________________________________________ # プルダウンリストボックスソースを取得 sub GetOptionSrc { my( $sSel, $rhItem ) = @_; my( $sSrc ) = ''; # 選択判定 if( $sSel eq '' ) { $sSel = $$rhItem{option_default}; } # 一覧ソースを生成 for( my $i=0; $i<@{$$rhItem{option_list}}; $i++ ) { if( $$rhItem{option_list}[$i] eq $sSel ) { $sSrc .= qq(); } else { $sSrc .= qq(); } } return $sSrc; } # GetOptionSrc End #_______________________________________________________________________________ # エラー表示 sub PutError { my( $sMsg ) = @_; my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{PutError}, die_on_bad_params => 0 ); # 条件セット $sTmpl->param( CND_PutError => 1 ); # エラーメッセージセット $sTmpl->param( Msg => $sMsg ); # 表示 &eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 ); # 終了 exit; } # PutError End