SQLの窓 イラストAC フリー素材

2006年12月01日

PEARのMailパッケージによるメール送信

ほんとに pear.bat でインストールするとろくな事が無いです。今回、偶然以前に動くコードで試していたので事なきを得ましたが、でなきゃ、こんな原因解るわけ無いです

code: 535, response: 5.7.0 authentication failed
▼ その事情と実行可能なコードサンプル
<?php
set_include_path( "C:\php\PEAR" );
include('Mail.php');
include('Mail/mime.php');

# 内部コード指定
mb_language( "ja" );
mb_internal_encoding("UTF-8");

# メール送信環境
$mailServer = "localhost";
$mailPort = 25;
$mailFrom = "lightbox@localhost";
$mailTo = "lightbox@localhost";
$mailUser = "lightbox";
$mailAuth = true;	// true 認証有り、false 認証無し
$mailPass = "password";

print "<PRE>";

# **********************************************************
# 本文( テキスト )
# 30 文字程度で改行を入れて下さい
# **********************************************************
$text = mb_convert_encoding("日本語\n日本語", "JIS", "SJIS" );

# **********************************************************
# 本文( HTML )
# **********************************************************
$html = "<html><body><pre>$text</pre></body></html>";

# **********************************************************
# 添付ファイル( 必要ならば、$file にセットする )
# **********************************************************
#$file = './Book1.xls';
$crlf = "\n";

# **********************************************************
# FROM と TO を設定
# **********************************************************
$from    = mb_convert_encoding( "送信者", "JIS", "SJIS" );
$from    = "=?ISO-2022-JP?B?" . base64_encode($from) . "?= <$mailFrom>";
$to      = mb_convert_encoding( "宛先", "JIS", "SJIS" );
$to      = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <$mailTo>";

# **********************************************************
# ● 長い件名の処理
# **********************************************************
$subject = "改行する必要のある長い日本語を";
$subject .= "件名にセットしてテストしてみましょう。";
$subject .= "件名に「AあBいC」のように半角が交互に含まれると";
$subject .= "エンコード後の長さが増加するので、";
$subject .= "改行長は短めに設定しています。";

// SJIS として文字数を取得
$len = mb_strlen( $subject, "SJIS" );
// 10 文字以下ならそのまま処理
if ( $len <= 10 ) {
	$subject = mb_convert_encoding( $subject, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($subject) . "?=";
}
// 10 文字以上なら分解して処理
else {
	// 先頭から10文字取得
	$sub_str = mb_substr( $subject, 0, 10, "SJIS" );
	// JIS に変更
	$sub_str = mb_convert_encoding( $sub_str, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($sub_str) . "?=";
	// 次の処理の為に処理済みの文字列を削除
	$sub_work = mb_substr(
		$subject, 10, mb_strlen( $subject,"SJIS" ) - 10, "SJIS" );
	// 処理文字列が存在する間続ける
	while( 1 ) {
		// 改行とスペース
		$sub_str .= "\r\n ";
		// まだ 10 文字より長い場合
		if ( mb_strlen( $sub_work, "SJIS" ) > 10 ) {
			// 先頭から10文字取得
			$sub_left = mb_substr( $sub_work, 0, 10, "SJIS" );
			// JIS に変更
			$sub_left = mb_convert_encoding( $sub_left, "JIS", "SJIS" );
			// mime encode して追加
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_left) . 
				"?=";
			// 次の処理の為に処理済みの文字列を削除
			$sub_work = mb_substr(
				$sub_work,
				10,
				mb_strlen( $sub_work, "SJIS" ) - 10,
				"SJIS"
			);
		}
		// 10 文字以内の場合
		else {
			// JIS に変更
			$sub_work = mb_convert_encoding( $sub_work, "JIS", "SJIS" );
			// mime encode
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_work) . 
				"?=";
			// 終了
			break;
		}
	}
}
// 出来上がった文字列を件名として使用する
$subject = $sub_str;

# **********************************************************
# ● 準備された情報を元に、SMTP に渡す MIME 情報を
#    作成する
# **********************************************************
$mime = new Mail_mime($crlf);

# 本文( テキスト )
$mime->setTXTBody($text);
# 本文( HTML )
$mime->setHTMLBody($html);
# 添付ファイル
if ( $file != "" ) {
	$mime->addAttachment($file, 'application/octet-stream');
}
# パーツ別のキャラクタセット指定
$param = 
	array(
		'text_charset' => 'ISO-2022-JP',
		'html_charset' => 'ISO-2022-JP'
	);
# **********************************************************
# ヘッダと本文の作成
# **********************************************************
// ヘッダ情報の整理
$hdrs = 
	array(
		'Date' => date("r"),
		'From'    => $from,
		'To'    => $to,
		'Subject' => $subject
	);

$body = $mime->get( $param );
$hdrs = $mime->headers($hdrs);

# **********************************************************
# SMTP 環境の情報
# **********************************************************
if ( $mailAuth ) {
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => TRUE,
			'username' => $mailUser,
			'password' => $mailPass,
		);
}
else {
	# 以下は認証なし
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => FALSE,
			'username' => '',
			'password' => '',
		);
}

# メールオブジェクトを作成
$mail =& Mail::factory('smtp', $smtp );

# **********************************************************
# ● メール送信( ヘッダと本文 を引数として渡す )
# **********************************************************
$ret = $mail->send($mailTo, $hdrs, $body);
if ( $ret !== true ) {
	print $ret->getMessage() . "<br>";
}

print "</PRE>";
?>
Done



【PHP+Pearの最新記事】
posted by at 2006-12-01 17:10 | PHP+Pear | このブログの読者になる | 更新情報をチェックする