PHPでメールを送る
PHPでのメール送信の場合、直接ポート叩いてくれとか言われた。
特殊な環境ではなく偉大なる先人がPHPのmail使えねとレッテルを貼ったようだ。
先人はそもそもmbstring関数まわりの扱いが間違っているんですが。
mb_send_mail
マニュアルにあるとおり、mb_language()の設定に基づき変換されます。
「ja」、「japanese」を指定した場合「内部エンコードからISO-2022-JP」に変換され送信されます。
大体この関数に渡す前にmb_convert_encoding()でISO-2022-JPに変換して文字化け起こしてるケースがほとんど。
mb_encode_mimeheader
第二引数を省略した場合はmb_language()の設定に基づいて変換された上でヘッダ用にBASE64エンコードと文字列追加が行われます。
「ja」、「japanese」を指定した場合「内部エンコードからISO-2022-JP」に変換されます。
結果が長い場合はCRLFで改行されるので(本来はそれが正しいのですが)CRは削除したほうがよさげです。
スクリプトをEUC-JPで書いてるならphp.iniの設定は以下の2つは必須です。
mbstring.language = japanese
mbstring.internal_encoding = eucJP-win
スクリプト内でも関数を用いて上記の値は変更可能なので環境によっては利用前に設定する方向で。
mb_send_mailを利用した場合
$subject = "サブジェクト";
$body = "本文";
$to = "to@example.jp";
$from = "from@example.jp";
mb_language('japanese');
mb_internal_encoding('eucJP-win');
$header = "From: ".$from;
$sendmail_param = "-f".$from;
mb_send_mail($to, $subject, $body, $header, $sendmail_param);
mailを利用した場合
$subject = "サブジェクト";
$body = "本文";
$to = "to@example.jp";
$from = "from@example.jp";
mb_language('japanese');
mb_internal_encoding('eucJP-win');
$subject = str_replace("\r", "", mb_encode_mimeheader($subject));
$body = mb_convert_encoding($body, 'ISO-2022-JP');
$header = "From: ".$from."\n".
"Mime-Version: 1.0\n".
"Content-Type: text/plain; charset=ISO-2022-JP\n".
"Content-Transfer-Encoding: 7bit";
$sendmail_param = "-f".$from;
mail($to, $subject, $body, $header, $sendmail_param);
PEAR::Mail
require_once 'Mail.php';
$subject = "サブジェクト";
$body = "本文";
$to = "to@example.jp";
$from = "from@example.jp";
mb_language('japanese');
mb_internal_encoding('eucJP-win');
$subject = str_replace("\r", "", mb_encode_mimeheader($subject));
$body = mb_convert_encoding($body, 'ISO-2022-JP');
$header = "From: ".$from."\n".
"Subject: ".$subject."\n".
"Mime-Version: 1.0\n".
"Content-Type: text/plain; charset=ISO-2022-JP\n".
"Content-Transfer-Encoding: 7bit";
$mail =& new Mail::factory("mail");
$mail->send($to, $header, $body);
PEAR::Mailはソースみたけど国際化はもちろん74文字折畳みとかされないので結局自前でエンコードしてからセットとなります。
PEAR::Mailはファイル添付やHTMLメール、デコメールでPEAR::Mail_mimeと合わせて使うのならって感じ。
mb_send_mail超簡単。
一般的ではないエンコード、EUC-JP、UTF-8、絵文字メール(Shift_JIS)、機種依存文字の入ったメール(ISO-2022-JP-MS)で送りたい場合は、独自でヘッダを書いてmail関数で送るといいと思うよ。