✉️

✉️ PHPのmb_send_mailで文字化け・優先度を防ぐ設定まとめ

に公開

PHPでマルチバイト対応のメール送信ができるmb_send_mail
文字化けやヘッダーの誤認識などが起きやすい...

そんな時や日本語環境で使用する際は、適切なエンコーディングやヘッダー設定が不可欠!
この記事では、実践的なmb_send_mailの使い方と注意点をまとめます。


✅ 基本の使い方

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

$to = "example@example.com";
$subject = "テストメール";
$body = "これはテストメールです。";
$headers = "From: yourname@example.com";

mb_send_mail($to, $subject, $body, $headers);

なぜmb_languagemb_internal_encodingが必要?

関数 説明
mb_language() 日本語用のMIMEエンコードを行う
mb_internal_encoding() 文字列をエンコードする際の内部文字コードを指定

これらを設定しないと、タイトルや本文のエンコードが正しく行われず、文字化けの原因になります...


💡 ヘッダーの設定ポイント

From, Cc, Bccの書き方

$headers = [];
$headers[] = 'From: Your Name <yourname@example.com>';
$headers[] = 'Cc: ccuser@example.com';
$headers[] = 'Bcc: bccuser@example.com';

ここまではメーラーソフトなどでも同じですね🙆‍♂️

優先度を設定したい場合

$headers[] = 'X-Priority: 1'; // 優先度(1が最優先、5が最低)
$headers[] = 'X-MSMail-Priority: High'; // Outlook用
$headers[] = 'Importance: High'; // 汎用

// ヘッダー文字列を結合
$headerStr = implode("\r\n", $headers);

これをmb_send_mailの第4引数に渡します。

どんなのが設定できる?

メモ書き程度に軽くまとめてみました!

気になる人はチェック
ヘッダ名 どんなことをする? 補足説明 よく使う?
MIME-Version メールがMIME形式だよって伝える 普通は「1.0」で固定です
Content-Transfer-Encoding メールの中身をどうやって送るか 日本語メールは「7bit」でOK
base64は重くなるみたい
Content-Type メールの内容の種類と文字コード 文字化けを防ぐために「text/plain;charset=UTF-8」などを使おう
Return-Path エラーで戻ってくるメールの送り先 通常はサーバが自動でつけてくれるよ
From 誰からのメールか 「名前<メールアドレス>」形式で書くと見た目もいいよ
Sender 実際に送った人のアドレス Fromとの違いは細かいけど、送信プログラム用と考えてOK
To 宛先のメールアドレス 複数送るときはカンマで区切るよ
Cc 他にも見てほしい人のアドレス 「参考送信」ってイメージ
Toと同じように書く
-
Bcc 他の人にバレずに送るアドレス 「隠し送信」ってイメージ
これもカンマ区切り
-
Reply-To 返信してほしいメールアドレス 通常はFromになるけど、変えたいときに指定する
Subject メールの件名 mb_send_mailでは別の引数で渡すので、ヘッダで書かなくてOK ×
Message-ID メールを特定するためのID 自動でつくけど、自分でつけることもできる -
Date メールを送った日時 サーバが勝手につけてくれるよ ×
X-Priority メールの優先度(1〜5) 1」は重要、「5」は低めの優先度
Outlookとかで使われるよ
X-MSMail-Priority Microsoft系の優先度設定 Outlook向けの専用設定です -
Organization 組織名(会社名とか) 入れておくと信頼感アップ?
X-Mailer どのソフトで送ったかを示す メーラーによって表示されることもあるよ
Precedence メールの種類を伝える。(list>junk>bulk 大量配信メールとかに使われるよ -
Errors-To エラーの報告先 メーリングリストなどで活用されます -

このほかにも色々あるみたい...

QiitaにてKa2(@ka215)さんが紹介してくださっている記事が参考になります!
https://qiita.com/ka215/items/e5d21fe91a30fa968a2a


📚 まとめ

今回のサンプルコードはこちら!

サンプルコード
mb_language("Japanese");
mb_internal_encoding("UTF-8");

$to = "example@example.com";
$subject = "【重要】ご確認ください";
$body = "これはマルチバイト対応テストメールです。";

$headers = [];
$headers[] = 'From: 管理者 <admin@example.com>';
$headers[] = 'Cc: ccuser@example.com';
$headers[] = 'Bcc: bccuser@example.com';
$headers[] = 'X-Priority: 1';
$headers[] = 'X-MSMail-Priority: High';
$headers[] = 'Importance: High';

$headerStr = implode("\r\n", $headers);

mb_send_mail($to, $subject, $body, $headerStr);
設定項目 内容
mb_language() 日本語メールのMIME対応を有効化
mb_internal_encoding() 文字列操作の内部エンコードを設定
From/Cc/Bcc エンコード済みの適切なヘッダー形式を使用
優先度 X-Priority, Importanceなどのヘッダーを追加
ヘッダー改行コード \r\nを使用する(Unix/Linux)

mb_send_mailは便利な関数ですが、使い方を誤るとメール不達や文字化けの原因にもなります。確実に送信・表示されるよう、ヘッダーとエンコードの正しい知識を持って実装しましょう!

Discussion