サンプル・プログラム
メールサーバの設定
Linux であれば、"sendmail_path =" の部分に sendmail のあるパスを記述する。
Windows では、SMTP サーバが起動していることは無いだろうから、"SMTP = " の部分にプロバイダと契約しているメールサーバのアドレスを記述する。また、"sendmail_from ="の部分には送信者メールアドレスを記述する。プロバイダから提供されているメールアドレスを書いておけばよいだろう。
セキュリティ上、注意すること
0013: /**
0014: * 送信先メールアドレス
0015: * ※セキュリティ上、固定にすべき!!
0016: * @global string $MailTo
0017: */
0018: $MailTo = 'yourname@domain';
というのは、入力フォームから自由にメールアドレスを送信できるようなプログラムを公開すると、スパムメール業者の踏み台になってしまうからだ。あなたの意図に反し、業者はそのフォームを利用してスパムをばらまき、最悪の場合、プロバイダからアカウントを停止されてしまう。今回、このページからサンプルプログラムを実行できないようにしてあるのも、セキュリティ上の配慮からである。
サンプル・プログラムの解説:エンコードと送信
0008: mb_language('ja'); //mb_send_mailが参照するため
0009: $InternalEncoding = 'EUC-JP';
0010: mb_internal_encoding($InternalEncoding);
0011: $MySelf = basename($_SERVER['SCRIPT_NAME']);
0083: } else {
0084: mb_internal_encoding('EUC-JP');
0085: $subject = stripslashes($_POST['subject']);
0086: $message = stripslashes($_POST['message']);
0087:
0088: $subject = mb_convert_encoding($subject, 'EUC-JP', 'SJIS,EUC-JP,UTF-8');
0089: $message = puts_format($message, 80); //本文は80桁で自動改行
0090:
0091: $res = mb_send_mail($MailTo, $subject, $message); //メール送信
0092: $msg = ($res == FALSE) ? '送信失敗' : '送信成功';
0093:

このプログラムでは入力フォームは EUC-JP だが、関数 mb_send_mail 渡った後に、関数 mb_language の設定に基づいて自動的にエンコードが行われる。
なお、関数 mb_send_mail が正しくエンコード処理を行うことができるよう、関数 mb_language 、 mb_internal_encoding を正しく設定しておく必要がある。
mb_send_mail の第4引数
mb_send_mail($MailTo, $subject, $message, "From: hogehoge@pahoo.org");
のように追加ヘッダ情報として与えてやればよい。
その他、第4 引数は下記のようにして使う。

CC を指定する。
Cc: cchoge@pahoo.org.com
複数の CC を指定する。
Cc: a@pahoo.org.com,b@pahoo.org,c@pahoo.org
BCC を指定する
Bcc: bcchoge@example.com
From, CC, BCC を同時に指定する。
From: hogehoge@pahoo.org\nCc: cchoge@pahoo.org.com\nBcc: bcchoge@example.com
From の表示名を日本語で指定する。
"From: " . mb_encode_mimeheader('ホゲぱふぅ') . '<hoge@pahoo.org>';
サンプル・プログラムの解説:本文の整形
0020: /**
0021: * 文字列を整形して返す(1行分)
0022: * @param string $str 追加する文字列(SJIS,EUC-JP,UTF-8)
0023: * @param int $width 折り返す桁数(半角1文字を1桁とする、0なら折り返さない)
0024: * @return string 整形後の文字列(EUC-JP、最後に改行文字を付加)
0025: */
0026: function puts_format($str, $width) {
0027: mb_internal_encoding('EUC-JP');
0028: $str = mb_convert_encoding($str, 'EUC-JP', 'SJIS,EUC-JP,UTF-8');
0029:
0030: //折り返さない
0031: if ($width <= 0) {
0032: $dest = $str . "\n";
0033: //折り返す
0034: } else {
0035: $dest = '';
0036: $w = 0;
0037: $l = mb_strlen($str);
0038: for ($i = 0; $i < $l; $i++) {
0039: $ch = mb_substr($str, $i, 1, 'EUC-JP'); //文字コード変換
0040: $dest = $dest . $ch;
0041: if ($ch == "\n") $w = 0; //改行なら桁数リセット
0042: else $w += mb_strwidth($ch);
0043: if ($w > $width) {
0044: $w = 0;
0045: $dest = $dest . "\n";
0046: }
0047: }
0048: $dest = $dest . "\n";
0049: }
0050: return $dest;
0051: }
参考サイト
- メールのヘッダをちょっと分析してみました:2 刀流のプログラムの blog