私のパソコン雑記帖

ファイル添付フォームメール・テクニカルノート(4)

mb_send_mail 関数

カテゴリー: PHP
14Feb2014

mb_send_mail を使ったメール送信

ファイル添付メールフォーム汎用スクリプトでは mail 関数を用いているが、関連して mb_send_mail 関数について一言。

ファイル添付が必要ない日本語メールの送信に便利、というのがふれこみです。とはいっても、字化けが起こることがありました。その対策はメール関数の基本に戻ることになります。


実際のスクリプト

以下のスクリプト。名前(日本語)、メールアドレス、コメント(日本語)、を送信する簡単なフォームメール。この中で、mb_encode_mimeheader() を含んだ朱記部分が焦点になります。

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=euc-jp">
<title></title>
</head>
<body>
<form action="xxxxx.php" method="post">
お名前:<input type="text" name="name" size="24"><br>
メールアドレス:<input type="text" name="mailaddress" size="40"><br>
コメント:<textarea name="contents" rows="1" cols="30"></textarea>
<input type="submit" name="submit" value="送信">
</form>
<?
mb_internal_encoding('euc-jp');
$name=$_POST['name'];
$address=$_POST['mailaddress'];
$contents=$_POST['contents'];
$submit=$_POST['submit'];
$subject="アンケート";
$to1="ウェブマスター";
$to2="aaa@bbb.ccc";
if ($submit=="送信") {
$to1 = mb_encode_mimeheader($to1, "iso-2022-jp", "B");
$name = mb_encode_mimeheader($name, "iso-2022-jp", "B");
$mailto=$to1." <$to2>";
$headers = "From: ".$name." <$address>";
$mail = mb_send_mail($mailto, $subject, $contents, $headers);
if(!$mail) {
print "送信エラー";
exit;
}
print "送信完了";
exit;
}
?>
</body></html>


字化けの原因

通常 mb_send_mail の解説を見ると、”ヘッダとメッセージはmb_language()の設定に基づき変換、エンコードされる。” と解説されています。また mb_language については、”言語を設定する。language が省略された場合、カレントの言語を文字列で返す。” と解説されています。これらの解説に従うならば、mb_send_mail を単独で用いても自動的にエンコードされる筈です。

そこで最初は、上記コードの朱記部分を除いたスクリプトで試してみました。結果は、件名($subject)やメール文($contents)の日本語は正しくエンコードされますが、$mailto や $headers に含まれる日本語(この場合 $name や $to1)が文字化けしてしまいます。

この事から、 mb_send_mail の自動エンコードは全ての引数に当てはまるとは限らないように思われます。 自動エンコードされない引数は MIMEエンコードが必要。その際 "iso-2022-jp Bエンコード"する、ということは mail 関数の根幹。ということで、朱記部分を追加することで字化けを防ぐことができました。



コメント


【管理人】  2011年08月11日 09時34分

【かしこ】様
利用者がこのスクリプトを利用して、メール実装の部分をデータベース保存に変更することは可能です。現状のスクリプトのまま、オプション設定で可能ということではございません。

【かしこ】  2011年08月10日 01時20分

りようさしてもらっています。
ところで・・・
>このスクリプトを応用して、フォーム入力をデータベースに保存することもできます。
これがすごく気になるのです。
方法ってあるのですか?
アンケートの回収&データベースにしたいのです。

【管理人】  2010年06月29日 12時07分

4月12日のメッセージで紹介した
http://solar.riok.net/formSample/form.php
は削除されています。

【next】  2010年04月17日 01時07分

管理人様
ご対応ありがとうございます。
test.phpでFile not uploadedとでてしまいました。
貴サーバのアップローダは問題なく使えましたので、当方のサーバの問題かと思います。
色々調べた結果、当サーバではupload_max_filesizeというのが2Mから変更できないとの事が原因なのかもというところに行き着きました。大変お手数をお掛けしましたが、こちらでサーバを別のところに移るなどの対応が必要となりますので、原因を追究した後にまた利用させていただきます。
誠にありがとうございました。

【管理人】  2010年04月12日 11時48分

【next】様
4月5日以来のログをうっかり削除してしまいましたが悪しからず。色々試していただきましたが「添付無し」になるとのこと。理由は分かりませんが、サーバーがアップファイルを認識していないように思われます。なんどもお手数をおかけしますが、http://solar.riok.net/test.lzh をDL解凍して、test.php を貴サーバーで試していただけませんか。これはアップファイルの受信処理を行う単純なテストコードで、もしファイルをアップロードしても認識されなければ、File not uploaded と表示されます(おそらくそんなことはないと思いますが念の為)。それと formSample.lzh をDL解凍したものを、
当サーバーにアップロードしています。http://solar.riok.net/formSample/form.php
これも試していただけませんでしょうか(ファイルを選択してチェックボタンを押すだけ)。当方で確認している限り問題は再現されません。

【next】  2010年04月05日 15時11分

初めまして、お忙しいところ失礼致します。
私NEXT ENGINEER'S .NET
http://nextengineers.net/
というサイトを作っております町田と申します。
この度【PHP ファイル添付メールフォーム】をサイトで使用したくダウンロードさせていただきました。
使用目的としては10MB程度のmp3ファイルを受け取るフォームとして利用したいのですが、添付可能な拡張子にmp3がなく"audio/mpeg"=>"mp3"等と勝手に書き込んだりもしてみましたが動作しませんでした。
プログラムは完全に初心者で右も左も分かりません。
このプログラムの自由度の高さ、デザイン、機能性などとても気に入っておりますので、大変お忙しいこととは思いますが簡易にmp3に対応させる方法がございましたらご教授いただければと思います。よろしくお願い致します。

NEXT ENGINEER'S .NET
代表 町田智史