package CommonLib; #CGI用共通ライブラリ # # use lib ('./lib'); # use CommonLib; # my $CommonLib = CommonLib->new(); # CommonLib->ShowPage(\%FDATA); ############################## # 枠取りしている箇所変更必要 # ############################## use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Session; use Data::Dumper; use FileHandle; use Fcntl; use Cwd; use DBI; use HTML::FillInForm; use HTML::Template; use MIME::Base64 qw(encode_base64); use Encode qw(encode decode_utf8); use Net::SMTP; use JSON qw/encode_json/; # Settings ########################## # 利用するクライアント名 # ########################## my $ClientName = "公益財団法人実中研"; ############################ # お客様受信メールアドレス # ############################ my $ClientMailAddress = 'science_camp@ciea.or.jp'; # my $ClientMailAddress = 'ddg2@dova.co.jp'; # test #################################################### # ユーザーあて差出人情報※ドメインと同じにすること # #################################################### my $ClientSender = 'science_camp@ciea.or.jp'; # my $ClientSender = 'ddg2@dova.co.jp'; # test ################# # テストの時は0 # ################# # SMTP認証が必要かどうかのフラグ 0:未使用 1:使用 # my $USE_SASL = 0; my $USE_SASL = 1; # DB使用フラグ 0:未使用 1:使用 my $use_db = 0; # セッション使用フラグ 0:未使用 1:使用 my $use_session = 0; my $DBSetting = { 'user' => '', 'pass' => '', 'db_name' => '', }; my $MAIL_SETTING = { ######################################### # ドメインに変更する テストと本番で変更 # ######################################### 'MAIL_HOST' => 'localhost', # テスト ### 'MAIL_HOST' => 'お客様のドメインに変更[例]sample.co.jp', # 本番 # info宛件名 'SUBJECT_TO_INFO' => sprintf(" 様】 実中研サイエンスキャンプ2025へ申込みのキャンセルがありました", $ClientName), # ユーザ宛件名 'SUBJECT_TO_USER' => sprintf(" さま、申込みのキャンセルを受付ました", $ClientName), # info宛送信先情報 'MAIL_TO' => [ {'EMAIL' => $ClientMailAddress}, ], # ユーザ宛差出人情報 'MAIL_FROM' =>{ 'EMAIL' => $ClientSender, }, ########################### # メールのuser,passを登録 # ########################### # 'MAIL_AUTH' => { # 'USER' => 'info', 'PASSWORD' => 'pass12345', # }, }; my $templateDir = './templates/'; my $dbh; #------------------------------------------------------------------------------ # 画面初期化 #------------------------------------------------------------------------------ sub new(){ my $class = shift; my $current = Cwd::getcwd(); my $q = new CGI; my $Session = ''; my $header = ''; if($use_session == 1){ $Session = new CGI::Session("driver:File", $q, {Directory=>$current. '/session'})||die $CGI::Session::errstr; $header = $Session->header(-charset=>'utf-8', -pragma=>'no-cache', -Cache_Control=>'no-cache')||die $CGI::Session::errstr; }else{ $header = $q->header(-charset=>'utf-8', -pragma=>'no-cache', -Cache_Control=>'no-cache'); } my $self = { 'q' => $q, # CGIオブジェクト 'header' => $header, # ヘッダー 'Session' => $Session, # SESSIONオブジェクト 'DBsetting' => $DBSetting, # DBSETTING 'dbh' => undef, # データベースハンドラ 'ClientName' => $ClientName, # 顧客名 'templateDir' => $templateDir, 'MAIL_SETTING' => $MAIL_SETTING, # メール設定 'current' => $current, # カレントディレクトリ @_, }; $dbh = &DBConnect() if ($use_db == 1); $self->{'dbh'} = $dbh; return bless $self, $class; } #------------------------------------------------------------------------------ # DB接続 #------------------------------------------------------------------------------ sub DBConnect(){ my $dbh; my $DB_NAME = $DBSetting->{'db_name'}; my $DB_USER = $DBSetting->{'user'}; my $DB_PASS = $DBSetting->{'pass'}; eval{ $dbh = DBI->connect("dbi:mysql:".$DB_NAME, $DB_USER, $DB_PASS, {'RaiseError' => 1, 'AutoCommit' => 0}) || die $dbh->errstr; $dbh->do("set names utf8;"); #die 'error'; }; if($@){ warn(Dumper($@)); exit; } return $dbh; } #------------------------------------------------------------------------------ # テンプレートオブジェクトの初期化 # # IN:表示するテンプレートファイル名 #------------------------------------------------------------------------------ sub InitTemplate(){ my $self = shift; my $templateFile = shift; $templateFile = $templateDir. $templateFile; $self->{'template'} = HTML::Template->new(filename => $templateFile, die_on_bad_params => 0 ); #HTML::Templateオブジェクト return $self; } sub SetTemplate(){ my $self = shift; my $Template = shift; $self->{'template'} = $Template; return $self; } #------------------------------------------------------------------------------ # 画面表示 # HTML::Templateを利用して画面生成 # IN:FillInFromに渡すデータ #------------------------------------------------------------------------------ sub ShowPage(){ my $self = shift; my $dataRef = shift; my %data = (defined $dataRef ? %{$dataRef} : ''); my $template = $self->{'template'}; $template->param(title => $ClientName); my $fif = new HTML::FillInForm; print $self->{'header'}; if(keys(%data) >= 1){ print $fif->fill(scalarref => \$template->output, fdat => \%data); }else{ print $template->output; } } #------------------------------------------------------------------------------ # メール送信用サブルーチン #------------------------------------------------------------------------------ sub SendMail(){ my $self = shift; my $MAIL_DATA_REF = shift; my $MAIL_DATA = ${$MAIL_DATA_REF}; # use Data::Dumper; #----- メール送信情報の生成 ----- # メールサーバ情報の生成 my $MAIL_HOST = $MAIL_DATA->{'MAIL_HOST'}; # -> 件名の生成 my $MAIL_SUBJECT = encode('cp932', decode_utf8($MAIL_DATA->{'SUBJECT'})); $MAIL_SUBJECT = '=?Shift_JIS?B?'. MIME::Base64::encode_base64($MAIL_SUBJECT, ''). '?='; # -> 送信先情報の生成 my @MAIL_TO = @{$MAIL_DATA->{'MAIL_TO'}}; my @MAIL_TO_LIST = (); my @TO_HEADER = (); foreach my $HASH (@MAIL_TO){ my $TO_NAME = ''; my $TO_MAIL = $HASH->{'EMAIL'}; #----- 配信リストに登録 ----- push(@MAIL_TO_LIST, $TO_MAIL); #----- ヘッダ情報を作成 ------ if($TO_NAME ne ''){ push(@TO_HEADER, "${TO_MAIL}"); } else{ push(@TO_HEADER, "${TO_MAIL}"); } } # -> 差出人情報の生成 my $FROM_NAME = ''; my $FROM_MAIL = $MAIL_DATA->{'MAIL_FROM'}->{'EMAIL'}; my $FROM_HEADER = ''; if($FROM_NAME ne ''){ $FROM_HEADER .= "${FROM_MAIL}"; } else{ $FROM_HEADER .= "${FROM_MAIL}"; } # -> メール本文の生成 my $MAIL_BODY = $MAIL_DATA->{'MAIL_BODY'}; $MAIL_BODY = encode('cp932', decode_utf8($MAIL_BODY)); $MAIL_BODY = encode_base64($MAIL_BODY, ""); #----- メール送信処理開始 ----- # SMTPサーバへ接続 my $ssl = 'starttls'; # 'ssl' / 'starttls' / undef # my $smtp = Net::SMTP->new( # $MAIL_HOST, # Debug=>1, # Port => 587, # doSSL => $ssl # ); # if($USE_SASL == 1){ # my $auth_method = 'LOGIN'; # $smtp->auth($MAIL_DATA->{'MAIL_AUTH'}->{'USER'}, $MAIL_DATA->{'MAIL_AUTH'}->{'PASSWORD'}); # } my $smtp = Net::SMTP->new($MAIL_HOST); # mail from: 送信 $smtp->mail($FROM_MAIL); # rcpt to: 送信 foreach my $TO_ADDRESS (@MAIL_TO_LIST){ $smtp->to($TO_ADDRESS); } # data 送信 $smtp->data(); # Return-Path: 送信 $smtp->datasend('Return-Path: ' . "${FROM_HEADER}\n"); # FROMヘッダ送信 $smtp->datasend('From: ' . "${FROM_HEADER}\n"); # TOヘッダ送信 my $BCC_FLAG = 0; foreach my $TO_ADDRESS (@TO_HEADER){ if($BCC_FLAG){ $smtp->datasend('bcc: ' . "${TO_ADDRESS}\n"); } else{ # $smtp->datasend('to: ' . "${TO_ADDRESS}\n"); $BCC_FLAG = 1; } } $smtp->datasend('to: ' . join(', ', @TO_HEADER)."\n"); # SUBJECTヘッダ送信 $smtp->datasend('Subject: ' . "${MAIL_SUBJECT}\n"); # MIMEバージョン送信 $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Content-type: text/plain; charset=Shift-JIS\n"); $smtp->datasend("Content-Transfer-Encoding: base64\n"); # ヘッダ終了送信 $smtp->datasend("\n"); # data 送信 $smtp->datasend("${MAIL_BODY}\n"); # . 送信 $smtp->dataend(); # 切断処理 $smtp->quit(); } #------------------------------------------------------------------------------ # MIMEエンコード文字列の生成 #------------------------------------------------------------------------------ sub MakeMimeStr(){ my $self = shift; my $STR = shift; #----- S_JISにエンコード ----- $STR = encode( '7bit-jis', decode_utf8( $STR) ); #----- BASE64にエンコード ----- $STR = encode_base64($STR, ""); #----- ISO-2022-JP文字列を設定 ----- $STR = "=?ISO-2022-JP?B?${STR}?="; #----- 処理済文字列を返す ----- return $STR; } #------------------------------------------------------------------------------ # 空白チェック # I N: String str # OUT: Boolean 1:true 0:false #------------------------------------------------------------------------------ sub IsNullOrEmpty(){ my $self = shift; my $str = shift; if($str ne ''){ return 1; }else{ return 0; } } #------------------------------------------------------------------------------ # 電話番号/FAX番号の形式Valildate # I N: String telNumber # OUT: Boolean 1:true 0:false #------------------------------------------------------------------------------ sub isTelNumber(){ my $self = shift; my $telNumber = shift; # 電話番号かどうかのチェック ###if (($telNumber =~ /^(0(?:[1-9]|[1-9]{2}\d{0,2}))-([2-9]\d{0,3})-(\d{4})$/ ### && length($1) + length($2) + length($3) == 10) ### || $telNumber =~ /^0[57-9]0-\d{4}-\d{4}$/) { ### return 1; ###}else{ ### return 0; ###} # if ($telNumber =~ /^(0(?:[1-9]\d{0,3}))-([0-9]\d{0,3})-(\d{4})$/ if ($telNumber =~ /^(0{1}\d{9,10})$/ && length($1) + length($2) + length($3) <= 11){ return 1; }else{ return 0; } } #------------------------------------------------------------------------------ # メールアドレスの形式Valildate # I N: String mailaddress # OUT: Boolean 1:true 0:false #------------------------------------------------------------------------------ sub isMailAddress(){ my $self = shift; my $mailarress = shift; #前後の空白を除く $mailarress =~ s/^\s+|\s+$//g; #アットマークが一つだけ含まれ、 #その前後に文字列がある事をチェック my @parts = split(/\@/, $mailarress); scalar @parts == 2 or return 0; #@ 無しまたは2つ以上 #@ の前後とも文字列長さがある事をチェック grep { length $_ } @parts or return 0; #ユーザ名部分 $parts[0] =~ m/^[\w~+.=-]+$/ or return 0; #ドメイン名部分 #アルファベット、ダッシュ、数字をドットで連結したもの。 #ただし、末尾はアルファベットのみで 2-13文字。 $parts[1] =~ m/^([a-zA-Z\d-]+\.)+[a-zA-Z]{2,13}$/ or return 0; #ただし、先頭にダッシュは許可しない $parts[1] =~ m/^-/ and return 0; #全てエラーにならなかったらOK return 1; } #------------------------------------------------------------------------------ # メールアドレスの形式Valildate # I N: String mailaddress1, mailaddress2 # OUT: Boolean 1:true 0:false #------------------------------------------------------------------------------ sub EqualMailAddress(){ my $self = shift; my $mail1 = shift; my $mail2 = shift; return ($mail1 eq $mail2 ? 1 : 0 ); } #------------------------------------------------------------------------------ # JSON形式にエンコード # I N: String # OUT: String #------------------------------------------------------------------------------ sub uencode_json(){ my $self = shift; my $str = shift; my @json = ($str); return Encode::decode('utf8', encode_json(\@json)); } 1;