2H.6 sendmailを使ったメール送信例
多くのシステムでは、メール送信に sendmail などのMTAを直接使用しています。 プログラムでMTAが利用できる環境では、この方法が便利です。 以下にsendmailを使った例を示します。
sendmail.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が良いのかもしれません。
