✉️
✉️ 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_language
とmb_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 」でOKbase64 は重くなるみたい |
△ |
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)さんが紹介してくださっている記事が参考になります!
📚 まとめ
今回のサンプルコードはこちら!
サンプルコード
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