PHP のメール送信

  Windows 環境の mb_send_mail



  
日本語のメール送信は、マルチバイト文字列関数が利用可能でなければなりません。
php.ini で以下のようにして下さい

extension=php_mbstring.dll

また、プログラム中で以下のようにしてもかまいません。
if ( !extension_loaded( "mbstring" ) ) {
	dl("php_mbstring.dll");
}

※ 拡張モジュールの名前リストを得るには、php.ini で使用可能にして
※ コマンドラインより php.exe -m を実行します
  

PHP でのメール送信は、マルチバイト文字列関数の mb_send_mail を使用する事によって、subject での
内部エンコーディング → JIS → base64 といったエンコードを自動的に行なってくれます

もちろん、本文の JIS 変換も行なわれます。
但し、SHIFT_JIS のデータを扱う場合いくつかの注意事項があります。

mb_send_mail の日本語エンコーディングは、内部エンコーディングに基づいていますので、
subject と 本文は、いったん内部エンコーディングに変換する必要があります。
また、SHIFT_JIS は内部エンコーディングとして使用できないので EUC-JP 等を使用します。

以下は、SHIFT_JIS でメール送信するコードです

  
<?
	mb_language( "ja" );
	mb_internal_encoding("EUC-JP");

	$send = mb_convert_encoding( "表示", mb_internal_encoding(), "SJIS" );

	$to = "lightbox@sdc";

	$from = "lightbox@sdc";
	ini_set( "SMTP", "localhost" );
	ini_set( "sendmail_from", $from );

	mb_send_mail( $to, $send, $send );

	print "OK";
?>
  

上記コードは、localhost でメールサーバーが稼動しているという前提です。

※ ini_set( "smtp_port", ポート番号 );  は、PHP 4.3.0以降でのみ利用可能です。

メールサーバーは ウィズ98 メールサーバ でテストしています
  
ウィズ98 メールサーバ は設定が簡単でローカル環境でテストするのに適していますが、
PHP のせいなのかどうか解りませんが、送信元と送信先に User <lightbox@sdc> という形式が使えません。
  



  Windows 環境では無い mb_send_mail



mbstring が使用可能という前提で以下のようなコードで送信可能です。
また、テスト環境では sendmail_path に /usr/sbin/sendmail -t -i が設定されています

  
<?
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

$send = mb_convert_encoding( "表示", mb_internal_encoding(), "SJIS" );

$to = mb_convert_encoding( "漢字表示", "JIS", "SJIS" );
$to = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <送信先メールアドレス>";

$from = mb_convert_encoding( "漢字表示", "JIS", "SJIS" );
$from = "From: =?ISO-2022-JP?B?" . base64_encode($from) . "?= <送信元メールアドレス>";

mb_send_mail( $to, $send, $send, $from );

print "OK";
?>
  

sendmail_path は、Windows 環境でも動作します。
指定された場合は smtp および smtp_port・ sendmail_from の値は無視され、
ここで指定した コマンドが実行されます。

よって、Windows 環境で 宛先や送信元に日本語を使用したい場合は sendmail 互換のメール送信アプリケーション
を使用する必要がありそうです。

しかし、いずれにせよ Outbound Port25 Blocking の為の ポート 587 + SMTP AUTH
に対応するには PEAR の Net_SMTP を使用する必要があるようです。
ですが、PHP が存在するサーバにメールサーバが稼動しているという通常の環境では
考える必要は無いと思われます。



  Outbound Port 25 Blocking 用テスト

SMTP.php、PEAR.php、Socket.php が必要です

  
<?
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

require_once 'SMTP.php';

if (! ($smtp = new Net_SMTP("サーバー", "587", "localhost"))) {
	die("Unable to instantiate Net_SMTP object\n");
}

if (PEAR::isError($e = $smtp->connect())) {
	die($e->getMessage() . "\n");
}

PEAR::isError($e = $smtp->auth("メールアカウント", "パスワード"));

$from = "自メールアドレス";
if (PEAR::isError($smtp->mailFrom($from))) {
	die("Unable to set sender to $from");
}

$rcpt = '他メールアドレス';
if (PEAR::isError($res = $smtp->rcptTo($rcpt))) {
	die('Unable to add recipient ' . $rcpt . ': ' .
		$res->getMessage() . "\n");
}

$from = mb_convert_encoding( "送A信B者", "JIS", "SJIS" );
$from = "From: =?ISO-2022-JP?B?" . base64_encode($from) . "?= <自メールアドレス>\r\n";

$to = mb_convert_encoding( "宛A先", "JIS", "SJIS" );
$to = "To: =?ISO-2022-JP?B?" . base64_encode($to) . "?= <他メールアドレス>\r\n";

$subject = mb_convert_encoding( "件B名", "JIS", "SJIS" );
$subject = "Subject: =?ISO-2022-JP?B?" . base64_encode($subject) . "?=\r\n";

$text = mb_convert_encoding( "漢字--表示", "JIS", "SJIS" );

if (PEAR::isError($smtp->data( "$subject$from$to$text"))) {
	die("Unable to send data\n");
}

$smtp->disconnect();

?>

Done.
  













   SQLの窓    create:2006/04/27  update:2015/09/23   管理者用(要ログイン)





フリーフォントツール

SQLの窓ツール

SQLの窓フリーソフト

写真素材

一般ツールリンク

SQLの窓

フリーソフト

JSライブラリ