EC studio EC studio 技術ブログ

2007年08月03日投稿者:山本 正喜

PHPで日本語メールを送る – 基本編

PHPなどのWebシステム開発において、メール送信は
切っても切れないものだと思います。

ですが、現在のメールはもともと海外で考えられたものなので、
日本語などのマルチバイト文字を送ろうとすると
エンコードなど複雑な処理をする必要があり、
なかなか一筋縄ではいきません。(メールは奥が深い!)

このメーラーではうまく表示されるけど、あのメーラーでは
文字化けしてしまう。。 なんて経験をされた方も
多いのではないでしょうか。

私自身、日本語メールでは大変苦労させられました。
今回は、備忘録と情報共有も兼ねて、その経験をもとにした
PHPにおける日本語メール送信のまとめを記事にしたいと思います。

今回は日本語メール基本編という事で
シンプルな日本語メールの送り方です。

シンプルな日本語メールの送り方

PHPには簡単にメールを送るmail関数がありますが
この関数では日本語のメールはそのままでは送れません。

PHP:
  1. //日本語メール送信
  2. $to = "katou@example.com"; //宛先
  3. $subject = "例の件について"; //題名
  4. $body = "どうでしょう?"; //本文
  5. $from = "masaki@example.com"; //差出人
  6.  
  7. //これでは文字化け!
  8. mail($to,$subject,$body,"From:".$from);

メールの仕様が日本語などのマルチバイト文字を
許可していないので、日本語を使う場合はエンコードが必要です。
そこでPHPにはマルチバイト文字のメールを送るmb_send_mail
用意されてありますが、この関数もなかなかのクセ者です。

次の例は、mb_send_mailを使って
うまく日本語メールを送信できる例です。

PHP:
  1. //言語設定、内部エンコーディングを指定する
  2. mb_language("japanese");
  3.  
  4. //日本語メール送信
  5. $to = "katou@example.com";
  6. $subject = "例の件について";
  7. $body = "どうでしょう?";
  8. $from = "masaki@example.com";
  9.  
  10. //ちゃんと日本語メールが送信できます
  11. mb_send_mail($to,$subject,$body,"From:".$from);

※ポイント
日本語を扱うmb_系の関数を使う場合は、
mb_languageとmb_internal_encodingを使って、
現在の言語設定を行っておく必要があります。

これを知らないと、環境によって文字化けが発生したりするので、
必ずするようにしましょう。
(あまり知られてない?ようですが、非常に大切です)

一見すごく便利なこのmb_send_mail関数ですが、
題名と本文がそのまま日本語を使用できるようになるだけで、
通常のメーラー(Outlookなど)では当たり前の、

差出人に

PHP:
  1. $from = "山本 正喜 <masaki@example.com>";

と日本語を含ませたりすることができません。 :(

そこで仕方なく自分でエンコーディングすることになります。

PHP:
  1. //言語設定、内部エンコーディングを指定する
  2. mb_language("japanese");
  3.  
  4. //日本語メール送信
  5. $to = "katou@example.com";
  6. $subject = "例の件について";
  7. $body = "どうでしょう?";
  8. $from = mb_encode_mimeheader(mb_convert_encoding("山本 正喜","JIS","EUC-JP"))."<masaki@example.com>";
  9.  
  10. //ちゃんと日本語メールが送信できます
  11. mb_send_mail($to,$subject,$body,"From:".$from);

ややこしくなってきました、、、が、ここがポイントです。

※ポイント
mb_send_mailでは、題名と本文しかエンコードしてくれないので、
$fromの日本語部分は自分でエンコードします。

メールの本文の文字コードはUTFなども使用できるのですが、
様々なメーラーへの対応を考えると、文字コードは
日本語メールで最も一般的なJISに変換するのがベターです。

mb_convert_encodingで文字コードを変更して、
mb_encode_mimeheaderで、メールで使える形式にエンコードします。

この"日本語部分だけJISにしてmb_encode_mimeheaderでエンコード"
というルールが日本語メール送信のキモです。

同様に、reply-toなど他のヘッダ情報に日本語を含ませたい場合も
mb_encode_mimeheaderでエンコードしてやればOKです。

※ただし、to,cc,bccには "名前 <xxx@xxx.xx>" 形式の
アドレス指定はできず、必ず "xxx@xxx.xx" と
アドレスのみしか受け付けません。
(これはPHPのmail,mb_send_mail関数の制限です)

次回は、ライブラリを使ったHTMLメールや添付ファイルなど、
複雑なメールの送り方について説明したいと思います。

次回記事:PHPで日本語メールを送る - 応用編


関連した記事:

■ 「日本でいちばん社員満足度が高い会社の非常識な働き方」

日本でいちばん社員満足度が高い会社の非常識な働き方

この記事へのコメント (4)

ありがとうございます!

mb_send_mailで文字化けしてしまって困っていましたが、

mb_language(“japanese”);
mb_internal_encoding(“EUC-JP”);

この2行を書いたら直りました。

初心者(初めて3日です)の私が読んでも、わかりやすかったです。

かなーーり、色々試して、うまくいかなかったのですが。ほんとに助かりました、ありがとうございました。

投稿者: のぶ | 2008/05/06 火曜日 0:58:04

解りやすく解説されていて、大変、参考になりました。
ありがとうございますw
((ヾ(。・ω・)ノ☆゚+.ァリガトゥ

投稿者: shintani | 2008/08/29 金曜日 10:55:02

PHP初心者です。
色々探しまくってようやく辿りつた感じです。

本当にわかりやすいです。

ちなみに、こういった解説にコメントを記入したことは今までにありません。
初めてです。

お礼をいいたくなるくらいに丁寧な解説でした。

有難うございました。

投稿者: ゆうすけ | 2008/11/18 火曜日 2:44:24

初めまして、楽しくブログを読ませていただきました。

始めてのコメントで申し訳ございませんがご教授いただければと思い、ご連絡させていただきました。

私は、今HTML、CSSを取得したのでホームページを作成中でございます。
そこでお問い合わせのフォームを作っているのですが、メール送信のPHPスクリプトも自分でくみたいと思い、試行錯誤しております。

フォームの内容は
input type=”text”,”radio”,”checkbox” selectタグ,”textarea”
の内容になっております。

なぜかcheckboxだけが送信できずにいます。(他の値は送信できてます。)
よろしければ教えていただけないでしょうか?

下記にソースを記載しておきます。
お手数ですがよろしくお願い致します。
(差出人(送信者)と件名(タイトル)以外はすべ$#mail_body変数の中に入れて送ろうと考えています。)

<?php

mb_language("Japanese");
mb_internal_encoding ("utf-8");

//特殊文字を変換、変数に代入
$username = htmlspecialchars($_POST['username'], ENT_QUOTES );
$title = htmlspecialchars($_POST['title'], ENT_QUOTES );
$sex = htmlspecialchars($_POST['sex'], ENT_QUOTES );
$menkyo = htmlspecialchars($_POST['menkyo'], ENT_QUOTES );
$message = htmlspecialchars($_POST['message'], ENT_QUOTES );
//ここがチェックボックスですfor ($i = 0; $i < 4; $i++) {
$car[$i] = htmlspecialchars($_POST['car'][$i], ENT_QUOTES );
}

//mail_body内に上記の変数を代入
$mail_body = "氏名:\n{{$username}\n";
$mail_body .= "性別:\n{{$sex}\n";
$mail_body .= "免許の種類:\n{{$menkyo}\n";
//ここがチェックボックスです。$mail_body .= "興味のある車のメーカー:\n
for ($i = 0; $i < 4; $i++) {
$car[$i] = htmlspecialchars($_POST['car'][$i], ENT_QUOTES );
}

$mail_body .= "本文:\n{$message}\n";

//Formアドレスの設定(差出人)
$header = "From:" .mb_encode_mimeheader(”送信者名またはiメールアドレス") ."”;

//メール送信関数、送信成功と失敗時のweb表示
if(mb_send_mail(“送信先のメールアドレス”,$title, $mail_body , $header)) {
echo ‘送信完了しました。’;
}
else {
echo ‘送信失敗しました。’;
}
?>

投稿者: 知念司 | 2011/07/21 木曜日 5:13:31
コメントを投稿

取材に関するお問い合わせ


(担当:大崎)

EC studio 採用情報の詳細はこちら

投稿者
全ECスタッフ導入の
おすすめソフトウェア
人気のエントリー
カテゴリー
最近のエントリー
アーカイブ

BLOG オフィシャルブログ

社長ブログ
EC studio社長ブログ

ブログを読む

技術ブログ
技術部のブログ

ブログを読む

デザインブログ
デザイン部のブログ

ブログを読む

Copyright© EC studio, All Rights Reserved.