################################################################################
#			メール処理サブルーチン
#
#	Current Version = 1.00
#	Copyrigth(c) 2011 Kazuhiro WATANABE All Rights Reserved.
################################################################################
package send_mail_with_smtp;

use Encode;
use Net::SMTP;		# perl -MCPAN -e shellにて　install Net::SMTP
use Net::SMTP::SSL;	# perl -MCPAN -e shellにて　install Net::SSLeay, install IO::Socket::SSL, install Net::SMTP::SSL
use Net::SMTP::TLS;	# perl -MCPAN -e shellにて　install Net::SMTP::TLS
# モジュールが古い場合は　perl -MCPAN -e shellにて　upgrade でアップデートします
use strict;
use warnings;

#
# Active Perlの場合は、Net::SMTP::SSLのインストールは
#	> ppm install Net::SMTP::SSL
# でインストールできます。
#

################################################################################
#
#	メール送信サブルーチン
#		send_mail(
#			 	$mail_server,
#				$mail_from,
#				$mail_to,
#				$mail_cc,
#				$mail_bcc,
#				$subject,
#				$message,
#				$ssl,
#				$user,
#				$pass
#		)
#
#	引数
#		$mail_server	SMTPサーバアドレス
#		$mail_from	差出人メールアドレス
#		$mail_to	受取人メールアドレス(複数指定の場合は、","で区切る）
#		$mail_cc	カーボンコピー(複数指定の場合は、","で区切る）
#		$mail_bcc	ブラインドカーボンコピー(複数指定の場合は、","で区切る）
#		$mail_subject	題名
#		$message	本文
#		$ssl		0:sslを使用しない、1:sslを使用する、2:tlsを使用する
#		[$user]		ユーザ名(authを使用する)
#		[$pass]		パスワード(authを使用する)
#
#	戻り値
#		0:		正常
#		1,2,3..:	エラーコード
#
################################################################################
sub send_mail( $ $ $ $ $ $ $ $ ; $ $ )
{
	my $port = 25;
	my $auth_mode;
	my (
		$server,
		$header_from,
		$header_to,
		$header_cc,
		$header_bcc,
		$header_subject,
		$message,
		$ssl,
		$user,
		$pass
	  );
	if( @_ == 8 )
	{
		(
			$server,
			$header_from,
			$header_to,
			$header_cc,
			$header_bcc,
			$header_subject,
			$message,
			$ssl
		   ) = @_;
		$auth_mode = 0;
	}
	elsif( @_ == 10 )
	{
		(
			$server,
			$header_from,
			$header_to,
			$header_cc,
			$header_bcc,
			$header_subject,
			$message,
			$ssl,
			$user,
			$pass
		   ) = @_;
		$auth_mode = 1;
	}
	else
	{
		print( STDERR "引数の個数が不正です。" );
		resturn( 1 );
	}
		

	my $temp_from = $header_from;
	my @temp_to  = split( ',', $header_to ); 
	my @temp_cc  = split( ',', $header_cc ); 
	my @temp_bcc = split( ',', $header_bcc ); 

	# ヘッダのfrom,to,cc,bcc,subjectはJISコードに変換後Base64でエンコード
	if( $header_from ne "" )
	{
		Encode::from_to( $header_from, 'utf8', 'iso-2022-jp' );
		$header_from = Encode::encode( 'MIME-Header-ISO_2022_JP', $header_from );
	}

	if( $header_to ne "" )
	{
		Encode::from_to( $header_to, 'utf8', 'iso-2022-jp' );
		$header_to = Encode::encode( 'MIME-Header-ISO_2022_JP', $header_to );
	}

	if( $header_cc ne "" )
	{
		Encode::from_to( $header_cc, 'utf8', 'iso-2022-jp' );
		$header_cc = Encode::encode( 'MIME-Header-ISO_2022_JP', $header_cc );
	}

	if( $header_bcc ne "" )
	{
		Encode::from_to( $header_bcc, 'utf8', 'iso-2022-jp' );
		$header_bcc = Encode::encode( 'MIME-Header-ISO_2022_JP', $header_bcc );
	}

	if( $header_subject ne "" )
	{
		Encode::from_to( $header_subject, 'utf8', 'iso-2022-jp' );
		$header_subject = Encode::encode( 'MIME-Header-ISO_2022_JP', $header_subject );
	}

	# メールヘッダー設定
	# メールヘッダーとメール本体の境目に空行（改行）を入れる。
	#
	my $header = << "MAILHEADER";
From: $header_from
To: $header_to
Cc: $header_cc
Bcc: $header_bcc
Subject: $header_subject
X-Mailer: SendMail4Perl version 1.00 (Net::SMTP)
Mime-Version: 1.0
Content-Type: text/plain; charset = 'ISO-2022-JP"
Content-Trensfer-Encoding: 7bit

MAILHEADER


	# 本文は文字コードをJISに変換
	Encode::from_to( $message, 'utf8', 'iso-2022-jp' );

	#メール送信オブジェクト設定
	my $smtp;
	if( $ssl == 2 )
	{
		$smtp = Net::SMTP::TLS->new( $server, Port=>$port, User=>$user, Password=>$pass );
		if ( !$smtp )
		{
			print( STDERR "メールサーバーにアクセスできません！(TLS)" );
			return( 4 );
		}
	}
	elsif( $ssl == 1)
	{
		$smtp = Net::SMTP::SSL->new( $server, Port=>$port );
		if ( !$smtp )
		{
			printf( STDERR "メールサーバーにアクセスできません！(SSL)" );
			return( 3 );
		}
#		$smtp->SSL_verify_mode( SSL_VERIFY_NONE ); 
	}
	else
	{
		$smtp = Net::SMTP->new( $server, Port=>$port );
		if ( !$smtp )
		{
			print( STDERR "メールサーバーにアクセスできません！" );
			return( 2 );
		}
	}

	if( $auth_mode == 1 )
	{
		if( !$smtp->auth( $user, $pass ) )
		{
			print( STDERR "認証に失敗しました！" );
			return( 5 );
		}
	}

	#メール送信
	$smtp->mail($temp_from);
	$smtp->to(@temp_to);
	$smtp->cc(@temp_cc);
	$smtp->bcc(@temp_bcc);
	$smtp->data();
	$smtp->datasend($header);
	$smtp->datasend($message);
	$smtp->dataend();
	$smtp->quit;

	return( 0 );
}

1;
#############################################################################################
