#!/usr/local/bin/perl #↑Perlのパスをサーバに合わせて記述して下さい。 # ↓設定 #-----------------------------------------------------------------------------# package AppsPage::Mailpro; my $define = {}; #++++++++++++++++++++++++++++# # 設定目次 #++++++++++++++++++++++++++++# # 1:プログラム情報 # 2:ファイル構成図 # 3:基本設定 # 4:設置環境設定 #++++++++++++++++++++++++++++# #【1:プログラム情報】 #-----------------------------------------------------------------------------# # # 著作権表示を残していただける範囲内であれば、 # 商用、非商用問わず、無料でお使いいただけ、改造も自由です。 # # (C) Apps Page. # http://apps.cside.com/ # $define->{'THIS_NAME'} = '郵便受職人'; $define->{'VERSION'} = '1.22'; $define->{'LICENSE'} = 'FREE'; #【2:ファイル構成図】 #-----------------------------------------------------------------------------# # # mailpro/ …………………………… (755) プログラムディレクトリ # │ # ├ index.cgi …………………… (755) 実行ファイル/このファイル # │ # ├ data/ ………………………… (777) データ記録ディレクトリ # │ └ 各データファイル ……… (666) 全て同じパーミッション # │ # ├ lock/ ………………………… (777) ロックディレクトリ # │ └ flock.cgi ……………… (666) ロックファイル # │ # └ lib/ ………………………… (755) ライブラリディレクトリ # ├ def/ …………………… (755) 標準データディレクトリ # │ └ 各ファイル ……… (644) 全て同じパーミッション # ├ imgs/ …………………… (755) イメージディレクトリ # │ └ 各ファイル ……… (644) 全て同じパーミッション # ├ modus/ ………………… (755) モジュールディレクトリ # │ └ 各ファイル ……… (644) 全て同じパーミッション # └ tmpl/ …………………… (755) テンプレートディレクトリ # └ 各ファイル ……… (644) 全て同じパーミッション # # # ★簡単に設置するツボ★ # 通常「lib/」以下のディレクトリやファイルは、 # サーバへ転送した時点で、755または644のパーミッションに設定されるので、 # パーミッション変更なしで設置できます。 # # ★簡単にデザイン改造するツボ★ # 「lib/tmpl/」以下のテンプレートファイルを改造することで、 # 比較的簡単に、デザイン改造できます。 # #【3:基本設定】 #-----------------------------------------------------------------------------# # ■管理用パスワード(記号を除く半角英数) $define->{'ADMIN_PASSW'} = 'jcahpass'; # ■ファイルロック方法 # '0' mkdir関数 / *標準 # '1' flock関数 / より安全で、実行効率のよい設定 # '2' ロックしない $define->{'LOCK_METHOD'} = '1'; # ■カラーチャートの表示方法 # '0' 直接表示 / *標準 # '1' CGIで表示 / cgi-binなど制限付きサーバ対策 $define->{'COLOR_CHART'} = '0'; # ※基本的に以上の設定で、サーバへ転送可能です。 #【4:設置環境設定】 #-----------------------------------------------------------------------------# # # 以下のの設定項目で、セキュリティ強化や、設置環境特有の状態に変更できますが、 # 分からない場合、変更しない方が無難です。 # # ▼ディレクトリ構成(ファイル構成図参照) # ■index.cgi(このファイル名) # index.cgiがデフォルトファイルに設定されているサーバでは、 # → './' と変更することも可能です。 $define->{'INDEX_CGI'} = './index.cgi'; # ■ライブラリディレクトリ(このファイルからのパス) # ※2項目とも同じ設定 $define->{'LIB_DIR'} = './lib/'; # ■データ記録ディレクトリ(このファイルからのパス) $define->{'DATA_DIR'} = './data/'; # ■ロックディレクトリ(このファイルからのパス) $define->{'LOCK_DIR'} = './lock/'; # ■作業用ディレクトリ(このファイルからのパス) # 通常、データ記録ディレクトリと同じ。 $define->{'TMP_DIR'} = './data/'; # ▼セキュリティ強化 # ■暗号化に使う文字列(半角英数2文字) $define->{'SALT'} = 'PW'; # ■セッション変数発行に使う文字列(半角英数8文字まで) $define->{'SESS_CHAR'} = 'SESSION'; # ■参照元アドレスによる一部機能のアクセス制限 # 例1:設置アドレスが、http://www.yourserver.com/script/ の場合 # '' → 'http://www.yourserver.com/' # 例2:設置アドレスが、http://www.hoge.com/~name/script/ の場合 # '' → 'http://www.hoge.com/~name/' $define->{'HTTP_REF'} = ''; # ■suExec環境オプション('0'#標準 / '1' suExec環境限定) # '0'#標準の場合、データファイルパーミッションは常に666です。 # '1'を設定した場合、更新時、元のパーミッションを引継ぐか、644です。 # ※分からない方、suExec環境でない方は、『絶対に』変更しないで下さい。 $define->{'SU_MODE'} = '0'; # ■管理画面へのキー(記号を除く半角英数) # 例: 'admin' → 'seclet' とした場合、 # 管理画面へのアドレスは # http://設置アドレス/index.cgi?m=admin から、 # http://設置アドレス/index.cgi?m=seclet へ変更されます。 $define->{'ADMIN_KEY'} = 'admin'; # ■管理画面へのリンク('0'非表示 / '1'表示#標準) # ※非表示にした場合、上記の"管理画面へのキー"を参考にアクセスして下さい。 $define->{'ADMIN_LINK'} = '1'; # ▼クッキー # ■クッキー発行元パス(ウェブサーバルートパスからの記述) # 設定するとセキュリティが向上します。 # 例1:設置アドレスが、http://www.hoge.com/script/ の場合 # '/' → '/script/' # 例2:設置アドレスが、http://www.hoge.com/~name/script/ の場合 # '/' → '/~name/script/' $define->{'CK_PATH'} = '/'; # ■クッキーネーム(記号を除く半角英数) # 複数設置する場合に、適当な名前を付けて区別できます。 # 例: 'mailpro' → 'mailpro2' $define->{'CK_NAME'} = 'mailpro'; # ■クッキー有効日数(半角数字) $define->{'CK_DAYS'} = '30'; # ▼flock関数の因数(通常変更不要) # ■共有ロック $define->{'LOCK_SH'} = '1'; # ■排他ロック $define->{'LOCK_EX'} = '2'; # ■アンロック $define->{'LOCK_UN'} = '8'; #=============================================================================# # # これ以下は、変更の必要ありません。 # #=============================================================================# sub new { return bless $define; } # ↓主なクラス #-----------------------------------------------------------------------------# package AppsPage::Mailpro::Main; #use strict; my $this = new(); $this->start; $this->stop; # →コンストラクタ sub new { my $this = new AppsPage::Mailpro::; return bless $this; } # →処理開始 sub start { my $this = shift; $this->{'input'} = {}; $this->{'cookie'} = {}; $this->{'config'} = {}; $this->{'recs'} = []; $this->{'fields'} = {}; $this->{'tmpl'} = {}; #ライブラリ require($this->{'LIB_DIR'}.'modus/l_mylib1.cgi'); require($this->{'LIB_DIR'}.'modus/l_mylib2.cgi'); #ファイルロック $this->{'lock'} = new AppsPage::Mailpro::Filelock::( $this->{'LOCK_METHOD'}, $this->{'LOCK_DIR'}, 'flock', $this->{'LOCK_EX'}, $this->{'LOCK_SH'}, $this->{'LOCK_UN'} ); #データファイル $this->{'data'} = new AppsPage::Mailpro::Datafile::( $this->{'DATA_DIR'}, $this->{'TMP_DIR'}, '.cgi', $this->{'SU_MODE'} ); #設定ファイル $this->{'data'}->composeClass( 'config', 'Config', 'config' ); #CGI関係 $this->{'funcs'} = new AppsPage::Mailpro::CGIFuncs::; $this->{'funcs'}->setHeader( 'Content-Type: text/html;accept-charset=Shift_JIS' ); ########## 区切 ########## #入力値解析 $this->{'req_method'} = $this->{'funcs'}->parseInput($this->{'input'}); #入力 if($this->{'input'}->{'m'} eq 'step1') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi'); require($this->{'LIB_DIR'}.'modus/m_step1.cgi'); $this->processStep1; } #内容確認 elsif($this->{'input'}->{'m'} eq 'step2') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); $this->{'subtitle'} = '内容確認'; require($this->{'LIB_DIR'}.'modus/jcode.pl'); require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi'); require($this->{'LIB_DIR'}.'modus/l_incheck.cgi'); require($this->{'LIB_DIR'}.'modus/m_step2.cgi'); $this->processStep2; } #送信 elsif($this->{'input'}->{'m'} eq 'step3') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); $this->{'subtitle'} = '送信完了'; require($this->{'LIB_DIR'}.'modus/jcode.pl'); require($this->{'LIB_DIR'}.'modus/mimew.pl'); require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi'); require($this->{'LIB_DIR'}.'modus/l_incheck.cgi'); require($this->{'LIB_DIR'}.'modus/l_writelib.cgi'); require($this->{'LIB_DIR'}.'modus/m_step3.cgi'); $this->processStep3; } #使い方 elsif($this->{'input'}->{'m'} eq 'usage') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); $this->{'subtitle'} = '使い方'; require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi'); require($this->{'LIB_DIR'}.'modus/m_usage.cgi'); $this->processUsage; } #管理用(1) elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}) { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); require($this->{'LIB_DIR'}.'modus/m_admin.cgi'); AppsPage::Mailpro::Main::Admin::processAdmin($this); } #管理用(2) elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}.'.2') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); require($this->{'LIB_DIR'}.'modus/m_admin.cgi'); AppsPage::Mailpro::Main::Admin::processAdmin2($this); } #管理用(3) elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}.'.m') { $this->{'funcs'}->setHeader('Pragma: content="no-cache'); $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); require($this->{'LIB_DIR'}.'modus/m_admin.cgi'); AppsPage::Mailpro::Main::Admin::processAdmin3($this); } #その他 elsif($this->{'input'}->{'m'} eq 'chart') { require($this->{'LIB_DIR'}.'modus/m_chart.cgi'); $this->outColorChart; } elsif($this->{'input'}->{'m'} eq 'license') { $this->{'funcs'}->sendHeader; $this->{'funcs'}->verify($this->{'LICENSE'}); } elsif($this->{'input'}->{'m'} eq '') { require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi'); require($this->{'LIB_DIR'}.'modus/m_step1.cgi'); $this->{'input'}->{'m'} = 'step1'; $this->processStep1; } else { $this->error('Q'); } } # →終了 sub stop { my $this = shift; $this->{'lock'}->unlock; if($ENV{'MOD_PERL'}) { Apache::exit(0); } exit(0); } # →エラー sub error { my $this = shift; $this->{'data'}->settle; $this->{'lock'}->unlock; $this->{'funcs'}->setHeader( 'Cache-Control: no-cache' ); $this->{'funcs'}->sendHeader; my(@err) = @_; $this->{'funcs'}->outErrMsgs(\@err); $this->stop; } sub getHTTPDate { my( $time ) = @_; if( !$time ) { $time = time(); } my @mon = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ); my @week = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ); my @tinfo = gmtime(time + (60 * 60 * 24 * $exp)); my $ret .= ""; $ret .= sprintf( "%s, %02d %s %04d %02d:%02d:%02d GMT", $week[$tinfo[6]], $tinfo[3], $mon[$tinfo[4]], $tinfo[5]+1900, $tinfo[2], $tinfo[1], $tinfo[0] ); return $ret; } 0;