#!/usr/bin/perl
# *****************************************************************************
# *	プログラム名	:	メール送信処理
# *	プログラムＩＤ	:	mail_send.pl
# *	機能概要		:	フォームに入力された内容を送信する
# *					:	 [mail設定]
# *					:	  送信元：入力されたメールアドレス
# *					:	  送信先：
# *					:	  件名  ：
# *	作成日			:	2002.12.22
# *	作成者			:	Y.Mikami(BHW)
# *----------------------------------------------------------------------------
# *	修正日			:
# *	修正者			:
# *****************************************************************************
#===========================================================
# モジュールの追加
#===========================================================
use strict;
use CGI ;

#===========================================================
# ライブラリのrequire
#===========================================================
require './jcode.pl' ;
require './base64.pl' ;

#===========================================================
# グローバル変数宣言
#===========================================================
use vars qw($s_mail $ok_f $err_f);
use vars qw(%FORM $key $value $fromaddr $toaddr $subject $body);

#===========================================================
# sendmail設定
#===========================================================
$s_mail="/usr/lib/sendmail";

#===========================================================
# フォームデータ取得
#===========================================================
&CGI::ReadParse(\%FORM);

#===========================================================
# メール情報設定
#===========================================================
$fromaddr=$FORM{'email'};
if($FORM{'FORM'} eq 'A'){
	$toaddr='daisuke-nozaki@tac-school.co.jp';
	$subject="アルバイト【エントリー】";
}else{
	$toaddr='daisuke-nozaki@tac-school.co.jp';
	$subject="中途採用【エントリー】";
}

#===========================================================
# 完了・エラーページPATH取得
#===========================================================
$ok_f=$FORM{'OK_F'};
$err_f=$FORM{'ERR_F'};

#===========================================================
# HTTPヘダー出力
#===========================================================
print qq(Content-type: text/html\n\n);

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# % main処理
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#===========================================================
# 必須入力チェック
#===========================================================
&Chk_Input();

#===========================================================
# フォームデータ取得
#===========================================================
&Get_Data();

&Mail_Send();
&Disp_Ok();

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# % サブルーチン
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# *****************************************************************************
# *  処理名称       :  メール送信フォーム入力チェック処理
# *  機能概要       :  メール送信内容入力フォームの入力チェックを行う
# *  戻り値         :  なし
# *----------------------------------------------------------------------------
# *  修正日         :
# *  修正者         :
# *****************************************************************************
sub Chk_Input {
	my $msg="";
	if($FORM{'simei'} eq ""){
		$msg  = qq(● 氏名 が入力されていません<br>\n);
	}
	if($FORM{'kana'} eq ""){
		$msg .= qq(● フリガナ が入力されていません<br>\n);
	}
	if(!&Mail_Check($FORM{'email'})){
		$msg .= qq(● メールアドレスを正しく記入して下さい<br>\n);
	}
	if($FORM{'zip'} eq ""){
		$msg .= qq(● 郵便番号 が入力されていません<br>\n);
	}
	if($FORM{'add'} eq ""){
		$msg .= qq(● 住所 が入力されていません<br>\n);
	}
	if($FORM{'tel'} eq ""){
		$msg .= qq(● ご自宅TEL が入力されていません<br>\n);
	}
	if($FORM{'sikaku'} eq ""){
		$msg .= qq(● 取得資格 が入力されていません<br>\n);
	}
	if($FORM{'gakureki'} eq ""){
		$msg .= qq(● 最終学歴 が入力されていません<br>\n);
	}
	if($FORM{'kibou'} eq ""){
		$msg .= qq(● 希望職種 が入力されていません<br>\n);
	}
	if($FORM{'douki'} eq ""){
		$msg .= qq(● 志望動機 が入力されていません<br>\n);
	}
	if($msg){
		my $content;
		open(READ,"$err_f") || die "Can't read HTML file: $err_f";
		read(READ,$content,-s "$err_f");
		close(READ);
		$content =~ s/<!##MSG##>/$msg/s;
		print $content;
		exit;
	}
}

# *****************************************************************************
# *  処理名称       :  送信内容取得処理
# *  機能概要       :  メール送信内容を取得する
# *  戻り値         :  なし
# *----------------------------------------------------------------------------
# *  修正日         :
# *  修正者         :
# *****************************************************************************
sub Get_Data {
	$body  = qq(氏名：$FORM{'simei'}\n);
	$body .= qq(フリガナ：$FORM{'kana'}\n);
	$body .= qq(E-MAIL：$FORM{'email'}\n);
	$body .= qq(郵便番号：$FORM{'zip'}\n);
	$body .= qq(住所：$FORM{'add'}\n);
	$body .= qq(ご自宅TEL：$FORM{'tel'}\n);
	$body .= qq(生年月日： 19$FORM{'birth_y'}年);
	$body .= qq($FORM{'birth_m'}月$FORM{'birth_d'}日\n);
	$body .= qq(取得資格：$FORM{'sikaku'}\n);
	$body .= qq(最終学歴：$FORM{'gakureki'}\n);
	$body .= qq(職歴１：$FORM{'syoku1_y_f'}年$FORM{'syoku1_m_f'}月);
	$body .= qq(〜 $FORM{'syoku1_y_t'}年$FORM{'syoku1_m_t'}月\n);
	$body .= qq(職歴１（会社名・部署）：$FORM{'syoku1'}\n);
	$body .= qq(職歴２：$FORM{'syoku2_y_f'}年$FORM{'syoku2_m_f'}月);
	$body .= qq(〜 $FORM{'syoku2_y_t'}年$FORM{'syoku2_m_t'}月\n);
	$body .= qq(職歴２（会社名・部署）：$FORM{'syoku2'}\n);
	$body .= qq(職歴３：$FORM{'syoku3_y_f'}年$FORM{'syoku3_m_f'}月);
	$body .= qq(〜 $FORM{'syoku3_y_t'}年$FORM{'syoku3_m_t'}月\n);
	$body .= qq(職歴３（会社名・部署）：$FORM{'syoku3'}\n);
	$body .= qq(職歴４：$FORM{'syoku4_y_f'}年$FORM{'syoku4_m_f'}月);
	$body .= qq(〜 $FORM{'syoku4_y_t'}年$FORM{'syoku4_m_t'}月\n);
	$body .= qq(職歴４（会社名・部署）：$FORM{'syoku4'}\n);
	$body .= qq(希望職種：$FORM{'kibou'}\n);
	$body .= qq(志望動機：$FORM{'douki'}\n);
	if($FORM{'FORM'} eq 'A'){
		$body .= qq(要望項目：$FORM{'youbou'}\n);
	}else{
		$body .= qq(自己PR書：$FORM{'pr'}\n);
	}
	&jcode::convert(\$body,'sjis','','z');
}
# *****************************************************************************
# *  処理名称       :  メール送信処理
# *  機能概要       :  入力内容をメール送信する
# *  引数           :  なし
# *  戻り値         :  なし
# *----------------------------------------------------------------------------
# *  修正日         :
# *  修正者         :
# *****************************************************************************
sub Mail_Send
{
	#---------------------------------------------
	#	sendmail用ハンドルOPEN
	#---------------------------------------------
	open(SM,"|$s_mail -t") || die "sendmail not found: $?";

	#---------------------------------------------
	#	送信データ文字コード変換
	#---------------------------------------------
	#	ヘダー部(MIMEエンコード)
	&jcode::convert(\$subject,'jis');
	$subject = &base64::encode($subject); 
	chomp($subject); 
	$subject = "=?ISO-2022-JP?B?$subject?="; 

	#	本文
	&jcode::convert(\$body,'jis');

	#---------------------------------------------
	#	メール送信
	#---------------------------------------------
	print SM "From: ".$fromaddr."\n";
	print SM "To: ".$toaddr."\n";
	print SM "Subject: ".$subject."\n";
	print SM $body."\n";
	close(SM);
}

# *****************************************************************************
# *  処理名称       :  送信完了ページ表示処理
# *  機能概要       :  送信完了ページを出力する
# *  戻り値         :  なし
# *----------------------------------------------------------------------------
# *  修正日         :
# *  修正者         :
# *****************************************************************************
sub Disp_Ok {
	my $content;
	open(READ,"$ok_f") || die "Can't read HTML file: $ok_f";
	read(READ,$content,-s "$ok_f");
	close(READ);
	print $content;
	exit;
}

# *****************************************************************************
# *  処理名称       :  メールアドレス妥当性チェック処理
# *  機能概要       :  メールアドレスとして妥当か否かをチェックする
# *  引数           :  メールアドレス
# *  戻り値         :  メールアドレス
# *----------------------------------------------------------------------------
# *  修正日         :
# *  修正者         :
# *****************************************************************************
sub Mail_Check {
	#--------------------------------------------
	# ローカル変数宣言
	#--------------------------------------------
	my $mail_address = shift;

	#--------------------------------------------
	# '＠'、及びその前後の文字列入力チェック
	#--------------------------------------------
	my @parts = split(/\@/,$mail_address);
	return if (@parts != 2);
	return if (!$parts[0]) ;
	return if (!$parts[1]) ;

	#--------------------------------------------
	# 入力文字列チェック
	#--------------------------------------------
	return if (grep(/[\x80-\xFF]/,@parts));		# ASCII以外
	return if (grep(/[\x00-\x1F]/,@parts));		# 制御文字 \x00-\x1F
	return if (grep(/\x20/,@parts));			# スペース \x20
	return if (grep(/\x22/,@parts));			# 特殊 "   \x22
	return if (grep(/\x28/,@parts));			# 特殊 (   \x28
	return if (grep(/\x29/,@parts));			# 特殊 )   \x29
	return if (grep(/\x2C/,@parts));			# 特殊 ,   \x2C
	return if (grep(/\x3A/,@parts));			# 特殊 :   \x3A
	return if (grep(/\x3B/,@parts));			# 特殊 ;   \x3B
	return if (grep(/\x3C/,@parts));			# 特殊 <   \x3C
	return if (grep(/\x3E/,@parts));			# 特殊 >   \x3E
	return if (grep(/\x5B/,@parts));			# 特殊 [   \x5B
	return if (grep(/\x5C/,@parts));			# 特殊 \   \x5C
	return if (grep(/\x5D/,@parts));			# 特殊 ]   \x5D
	return if (grep(/\x7F/,@parts));			# 制御文字 \x7F
	return if (grep(/\x2E\x2E/,$parts[0]));		# ドットの連続
	return if (grep(/\x2E\x2E/,$parts[1]));		# ドットの連続
	return if ($parts[1] =~ /^\x2E/);			# domain 先頭のドット
	return if ($parts[1] =~ /\x2E$/);			# domain 末尾のドット

	($mail_address);
}


