.Water-Sunlight
.サイトメニュー
.検索
.オンライン状況
登録ユーザ: 0
ゲスト: 6
.
<< Prev
メール送信関数
« INDEX »
PHP WEB要素編
Next >>
メール送信関数の例
作成日:2006/05/27

2H.6 sendmailを使ったメール送信例

 多くのシステムでは、メール送信に sendmail などのMTAを直接使用しています。 プログラムでMTAが利用できる環境では、この方法が便利です。 以下にsendmailを使った例を示します。

この例ではスクリプトファイルをシフトJISで作成し、EUC環境下で実行しています。 スクリプトファイルのコード系と実行環境の内部コード系が同じ場合は、 mb_internal_encoding('文字セット')の呼び出しは必要ありません。
ATTACHsendmail.php
<?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に変換

SendTextMail( $from_addr, $to_addr, $subject, $body);
?>

<html><body>Call SendTextMail</body></html>

<?php
function SendTextMail ( $from, $to, $subject, $body) {

  $mp = popen("/usr/lib/sendmail -t", "w");

  fputs($mp, "Subject: $subject\n"); // ヘッダー
  fputs($mp, "To: $to\n");
  fputs($mp, "From: $from\n");
  fputs($mp, "X-Mailer: PHP/" . phpversion() . "\n");
  fputs($mp, "MIME-Version: 1.0\n");
  fputs($mp, "Content-Type: text/plain; charset=ISO-2022-JP\n");
  fputs($mp, "Content-Transfer-Encoding: 7bit\n");
  fputs($mp, "\n");

  fputs($mp, $body); // メール本文
  pclose($mp);
}
?>

まず、mb_language() を使ってエンコー ディング方式を ISO-2022-JP/Base64 に設定します。 この設定は、mb_encode_mimeheader() 関数で使用されます。 また、ここでは、mb_internal_encoding() を使って内部コード系を指定していますが、 これは、この例がスクリプトファイルをシフトJISで作成し、EUC環境下で実行しているからです。 スクリプトファイルのコード系と実行環境の内部コード系が同じ場合は、 mb_internal_encoding('文字セット')の呼び出しは必要ありません。

次に、mb_encode_mimeheader() と mb_convert_encoding() を使ってメールヘッダーとボディで使用する文字列をエンコードします。 後は、popen() 関数を使ってパイプを開き、MTA(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


メール本文をシフトJISで送る方法

 上例のメール本文をシフトJISで送る方法を考えます。 現実的な方法としてはシフトJISをbase64に変換して送る方法が考えられます。

上のプログラムの次の部分を見て下さい。

{CODE()}$body = "こんにちは\r\nご機嫌いかがですか?";
$body = mb_convert_encoding($body, 'ISO-2022-JP', 'auto');
 ・
 ・
fputs($mp, "Content-Type: text/plain; charset=ISO-2022-JP\n");
fputs($mp, "Content-Transfer-Encoding: 7bit\n");
この部分を次のように変更します。
{CODE()}$body = "こんにちは\r\nご機嫌いかがですか?";
$body = mb_convert_encoding($body, 'Shift_JIS', 'auto');
$body = base64_encode($body);
 ・
 ・
fputs($mp, "Content-Type: text/plain; charset=Shift_JIS\n");
fputs($mp, "Content-Transfer-Encoding: base64\n");

また、もっと過激(?)な方法としては、シフトJISを無変換で8bit(またはbinary)として送信します。 上と同様の部分を次のように変更します。

{CODE()}$body = "こんにちは\r\nご機嫌いかがですか?";
$body = mb_convert_encoding($body, 'Shift_JIS', 'auto');
 ・
 ・
fputs($mp, "Content-Type: text/plain; charset=Shift_JIS\n");
fputs($mp, "Content-Transfer-Encoding: 8bit\n");  // または binary

これらの方法はMIMEの規格としては合法です。 問題は、実際のMTAやメーラが対応しているか否かです。 多くの環境でメール送信を正しく行うには、7bit/base64が良いのかもしれません。

<< Prev
メール送信関数
« INDEX »>
Page Top
Next >>
メール送信関数の例

.