PHPでメール送信

(1/1)
PHP にはメール送信関数  mail  があるが、日本語でメールを送る場合は、 mb_send_mail  関数が使いやすい。

サンプル・プログラム

メールサーバの設定

PHP でメール送信を行うためには、まず、メールサーバ(SMTP サーバ)を php.ini に設定する必要がある。
Linux であれば、"sendmail_path =" の部分に sendmail のあるパスを記述する。
Windows では、SMTP サーバが起動していることは無いだろうから、"SMTP = " の部分にプロバイダと契約しているメールサーバのアドレスを記述する。また、"sendmail_from ="の部分には送信者メールアドレスを記述する。プロバイダから提供されているメールアドレスを書いておけばよいだろう。

セキュリティ上、注意すること

ユーザー変数 $MailTo に送信先メールアドレスを設定している。

0013: /**
0014:  * 送信先メールアドレス
0015:  * ※セキュリティ上、固定にすべき!!
0016:  * @global string $MailTo
0017: */
0018: $MailTo = 'yourname@domain';

PHP でメール送信プログラムを作るときは、送信先メールアドレスは固定にすべきだ。
というのは、入力フォームから自由にメールアドレスを送信できるようなプログラムを公開すると、スパムメール業者の踏み台になってしまうからだ。あなたの意図に反し、業者はそのフォームを利用してスパムをばらまき、最悪の場合、プロバイダからアカウントを停止されてしまう。今回、このページからサンプルプログラムを実行できないようにしてあるのも、セキュリティ上の配慮からである。

サンプル・プログラムの解説:エンコードと送信

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: 

入力フォームから受け取った件名 $subject と本文 $message を、 mb_send_mail  関数に渡して、メールを送信する。

このプログラムでは入力フォームは EUC-JP だが、関数  mb_send_mail  渡った後に、関数  mb_language  の設定に基づいて自動的にエンコードが行われる。
なお、関数  mb_send_mail  が正しくエンコード処理を行うことができるよう、関数  mb_language 、 mb_internal_encoding  を正しく設定しておく必要がある。

mb_send_mail の第4引数

関数  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>';

サンプル・プログラムの解説:本文の整形

受信者が読みやすいように、本文は 80 桁(半角換算)で折り返すようにした。これを行うのがユーザー定義関数 puts_format である。この関数の中で、折り返すと同時に EUC-JP への変換も行っている。

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: }

参考サイト

(この項おわり)
header