PHPでメール送信者名(Fromヘッダ)をエンコードしないと文字化けする

  • PHP

この記事は、構成と文章の整理に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 の設定を変えた場合の挙動も未確認