

PHPでメール送信者名(Fromヘッダ)をエンコードしないと文字化けする
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
何が起きたか
メール送信処理で、Fromヘッダに日本語の名前をそのまま埋め込むと文字化けした。件名だけじゃなくて送信者名側でも同じ問題が起きるらしい。
"田中太郎" <foo@example.com> のような形式にしたいだけなんだけど、"田中太郎" の部分をそのまま文字列連結すると化ける。
対応
mb_encode_mimeheader でMIMEヘッダエンコード方式にエンコードしてから埋め込む。
sprintf("%s <%s>", mb_encode_mimeheader($name, 'UTF-7', 'Q'), $addr)実際に使ってるメソッドはこんな感じ。
public function from(string $addr, string $name = null){ $this->sender = $name ? sprintf("%s <%s>", mb_encode_mimeheader($name, 'UTF-7', 'Q'), $addr) : $addr; return $this;}$name が渡されなかった場合はアドレスだけをセットする形。
charsetにUTF-7を指定してる理由
PHP公式マニュアルの mb_encode_mimeheader のサンプルコードがそのまま UTF-7 + "Q"(Quoted-Printable)を使ってる。特に理由を深堀りせず同じ形にしたけど、今のところ動作に問題は出ていない。
気をつけないといけなさそうなのは、mb_encode_mimeheader の第一引数($name)は mb_internal_encoding() と同じエンコーディングである前提になっている点。うちの環境は mb_internal_encoding('UTF-8') を設定済みなので今回は問題出てないけど、内部エンコーディングの設定次第では化ける可能性がありそう(未確認)。
まだ確認できてないこと
UTF-7指定とISO-2022-JP指定で受信側の挙動に差が出るかは未確認mb_internal_encodingの設定を変えた場合の挙動も未確認