package FFFF::Module::mail;

# --------------------------------------------------------------------
# FFFF::Module::mail 
# - メールの送信
#
#
# --------------------------------------------------------------------
use strict;
use base qw(FFFF::Module::Base);

use POSIX qw(strftime);
use LocalCGI;

# --------------------------------------------------------------------
# HEADER_FIELD
# - 設定ファイルで定義出来る項目数
#
# --------------------------------------------------------------------
use constant HEADER_FIELD => [qw(
	From
	Subject
	To
	Cc
	Bcc
	Reply-To
	Return-Path
)];




# --------------------------------------------------------------------
# 設定ファイルの解析
#
# CONFIG => {
#           DEBUG => 0,
#           SENDMAIL => '/usr/lib/sendmail -t',
#           TEMPLATE => 'example1_mail.txt',
#           TO => {
#              KEY  => 'q1',
#              DATA => {
#                     'cat' => 'tama@takefumi.com',
#                     'dog' => 'pochi@takefumi.com,
#              },
#           },
#           SUBJECT => {
#              KEY  => 'q1',
#              DATA => {
#                     'cat' => '猫好きのあなたへ送る言葉'
#                     'dog' => '犬好きのあなたへ送る言葉',
#              },
#           },
#           :
#           :
# }
#
# --------------------------------------------------------------------
sub config {
	my $self = shift;
	my ($config) = @_;
	my %config;

	#
	# ディレクティブの解析
	#
	for my $key (qw(sendmail template log debug)) {
		$config{uc $key} = $config->{$key}->[0]->[0];
	}

	#
	# DEBUG フラグ
	#
	$config{DEBUG} = ($config{DEBUG} =~ /^on$/i)? 1:0;


	#
	# HEADER_FIELD ディレクティブの解析
	#
	for my $header_field (map{@$_} HEADER_FIELD) {

		#
		# 定義されてなければ次
		#
		my $cf = $config->{lc $header_field};
		next if (ref $cf ne "HASH");
	
		#
		# 要素が2組以上なら設定ファイルのエラー
		#
		if (scalar(keys %{$cf}) >= 2) {
			die "$header_field is many setup.";
		}
		
		#
		# 設定ファイルの解析
		#
		my ($key, $data) = each %$cf;
		my %data = %{(@$data)[0]};
		while (my ($k, $v) = each %data) {
			$data{$k} = join ", ", map{@$_} @$v;
		}
		$config{uc $header_field} = {
			KEY  => $key,
			DATA => \%data
		};
	}

	#
	# sendmail が設定されていなかったら
	#
	if ($config{SENDMAIL} eq "") {
		for my $sendmail (qw (/usr/lib/sendmail /usr/bin/sendmail)) {
			if (-f $sendmail) {
				$config{SENDMAIL} = "$sendmail -t";
			}
		}
		if ($config{SENDMAIL} eq "") {
			die "can't locate sendmail program.";
		}
	}

	$self->{CONFIG} = \%config;
}

# --------------------------------------------------------------------
# execute
# - ログの出力
# - メールの送信
#
# --------------------------------------------------------------------
sub execute {
	my $self     = shift;
	my (%form) = @_;

	my $config = $self->{CONFIG};

	#
	# 設定ファイルからデータの抽出 
	#
	for my $header_field (map{@$_} HEADER_FIELD) {
		my $cf = $config->{uc $header_field};
		if (ref $cf eq "HASH") {
			$form{lc $header_field} = $cf->{DATA}->{$form{$cf->{KEY}}};
		}
	}


	#
	# テンプレートから展開
	#
	my $mail = $self->get_mail_source(%form);


	#
	# ログファイルに保存
	#
	if ($config->{LOG} ne "") {
		my $datetime = strftime("%Y-%m-%d %H:%M:%S", localtime());
		my $log = $config->{LOG};
		open(LOG, ">>$log") or die "Can't open log : $log";
		print LOG "-- START $datetime -------------------------------\n";
		print LOG "$mail\n";
		print LOG "-- END $datetime ---------------------------------\n";
		close(LOG);
		
	}

	#
	# メール送信
	#
	if ($config->{DEBUG} == 0) {
		open(MAIL, "| $config->{SENDMAIL}");
		print MAIL toJIS($mail);
		close(MAIL);
	}
}

# --------------------------------------------------------------------
# メール本文の取得
#
# --------------------------------------------------------------------
sub get_mail_source {
	my $self   = shift;
	my (%form) = @_;

	return OutputTemplate($self->{CONFIG}->{TEMPLATE}, %form);
}

1;
=head CHANGES
0.0.3   2002/05/22
	- モジュールのオブジェクト化

0.0.2   2002/05/15
	- Sendmailオプションが有効になってなかったバグ修正

0.0.1   2002/05/09
	- original version
=cut
