作成日:2006/05/27
2H.7 メール送信関数の例
PHPでメール送信を実装する場合は、mail() または mb_send_mail() 関数を使用します。 通常、日本語メールを送信する場合は mb_send_mail() 関数の方を使用します。 しかし、mail() 関数を全く使用しないで良いかと言えば、そうではありません。 添付ファイルを送信する場合は、メールのボディ部に複数のメディアタイプを構成する必要があり、 mb_send_mail() を使った実装には問題があります。 このような場合は、mail() 関数を使用するか、または sendmail などのMTAを直接使用する事が必要になります。
ここでは、mb_send_mail() 関数を中心に説明します。mb_send_mail() 関数の挙動が理解できれば、 mail() 関数を使用して添付ファイルを送信するのは決して難しい事ではありません。
下の2つの例は同じ事を行っています。mb_send_mail()とmail()の違いを理解して下さい(違いは下線で示しています)。
この例ではスクリプトファイルをシフトJISで作成し、EUC環境下で実行しています。
スクリプトファイルのコード系と実行環境の内部コード系が同じ場合は、
mb_internal_encoding('文字セット')の呼び出しは必要ありません。
用例1:mb_send_mail() 関数を使ったメール送信
<?php
////////// 言語と文字コードの設定 //////////////////////////////
mb_language('ja'); // 必要に応じて使用言語を設定
mb_internal_encoding('SJIS'); // 必要に応じて内部コード系を設定
////////////////////////////////////////////////////////////////
$from_name = "送信元";
$from_addr = mb_encode_mimeheader($from_name); // ISO-2022-JP/Base64に変換
$from_addr .= " <y2sunlight@sample.ne.jp>";
$to_name = "送信先";
$to_addr = mb_encode_mimeheader($to_name); // ISO-2022-JP/Base64に変換
$to_addr .= " <info@y2sunlight.com>";
$subject = "こんにちは";
$body = "こんにちは\nご機嫌いかがですか?";
$header = "To: $to_addr\n" .
"From: $from_addr\n" .
"X-Mailer: PHP/" . phpversion();
$ret = mb_send_mail(NULL, $subject, $body, $header);
?>
<html><body>mb_send_mail</body></html>
用例2:mail() 関数を使ったメール送信
<?php
////////// 言語と文字コードの設定 //////////////////////////////
mb_language('ja'); // 必要に応じて使用言語を設定
mb_internal_encoding('SJIS'); // 必要に応じて内部コード系を設定
////////////////////////////////////////////////////////////////
$from_name = "送信元";
$from_addr = mb_encode_mimeheader($from_name); // ISO-2022-JP/Base64に変換
$from_addr .= " <y2sunlight@sample.ne.jp>";
$to_name = "送信先";
$to_addr = mb_encode_mimeheader($to_name); // ISO-2022-JP/Base64に変換
$to_addr .= " <info@y2sunlight.com>";
$subject = "こんにちは";
$subject = mb_encode_mimeheader( $subject ); // ISO-2022-JP/Base64に変換
$body = "こんにちは\nご機嫌いかがですか?";
$body = mb_convert_encoding($body, 'ISO-2022-JP', 'auto'); // ISO-2022-JPに変換
$header = "To: $to_addr\n" .
"From: $from_addr\n" .
"X-Mailer: PHP/" . phpversion() . "\n" .
"MIME-Version: 1.0\n" .
"Content-Type: text/plain; charset=ISO-2022-JP\n" .
"Content-Transfer-Encoding: 7bit";
$ret = mail(NULL, $subject, $body, $header);
?>
<html><body>mail</body></html>
上の2つの例で実際に送信されるメールメッセージは全く同じものです。 また、この結果は、先の「sendmailを使ったメール送信例」とも同じです。
< メール メッセージ >
Return-Path: <y2sunlight@sample.ne.jp> (中略) Subject: =?ISO-2022-JP?B?GyRCJDMkcyRLJEEkTxsoQg==?= To: =?ISO-2022-JP?B?GyRCQXc/LkBoGyhC?= <info@y2sunlight.com> From: =?ISO-2022-JP?B?GyRCQXc/Ljg1GyhC?= <y2sunlight@sample.ne.jp> X-Mailer: PHP/4.3.10 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit #$B$3$s$K$A$O#(B #$B$45!7y$$$+$,$G$9$+!)#(B
このように、2つの例を比べて見ると、mb_send_mail() は mb_language() の設定に基づき subject と message をエンコード して mail() を呼び出している事がよく分かります。
