マルチバイト環境でFuelPHPのemailを使う際、いくつか気を付けなければいけない問題がある。
今回想定している環境は、以下。
- FuelPHP 1.8
- UTF8でメールを送りたい
- HTMLメールを送りたい
自動改行処理を止める(あるいは、改善する)
FuelPHPのemailパッケージには、自動改行処理を行う部分がある。
デフォルトでは76文字で改行を行ってくれるのだが、この際に使用している関数がPHP標準のwordwrap関数。この関数はマルチバイト文字に対応していないため、改行付近で文字化けするという痛い問題が発生する。
自動改行処理を止めるには、/fuel/core/config/email.phpを/fuel/app/config/email.phpとしてコピーをし、
'wordwrap' = 76,
となっている部分を、
'wordwrap' = false,
と書き換える。
もし、自動改行処理は有効にしたいけど、文字化けを解消したいという方は、emailクラスを編集して、マルチバイトに対応させる必要がある。
具体的には、/fuel/packages/email/classes/email/driver.phpのwordwrapを呼び出している箇所(おそらく二か所)を、[PHP]マルチバイト対応のwordwrapが無いから作った - Qiitaこういったものに置き換える必要がある。
代替テキストの生成を止める
HTMLメールを送る際、emailパッケージは親切にプレーンテキスト版を自動生成し、一緒に送信してくれる。
受信したクライアントは、HTML版、プレーンテキスト版の二つから好きな方を表示することができる便利な機能である。
しかし、メールの見た目を統一したいなどの理由で、代替テキストが表示されてほしくない場面もある。
この場合、/fuel/app/config/email.phpを編集し、'generate_alt'の欄をfalseに設定すればよいのだが、
日本語を送る関係で'encoding'に"quoted-printable"や"base64"を指定している場合、正常に表示ができなくなる。
これは、何故かemailパッケージが"Content-Transfer-Encoding"のヘッダーを出力しないためであり、
/fuel/packages/email/classes/email/driver.phpの以下の箇所を編集することで対応が可能。
protected function build_message($no_bbc = false)
{<
...中略...
$parts = array('Date', 'Return-Path', ...中略..., 'Content-Type');
となっている部分を、以下のように変更する。
protected function build_message($no_bbc = false)
{
...中略...
$parts = array('Date', 'Return-Path', ...中略..., 'Content-Type', 'Content-Transfer-Encoding'); // 追加した
これで、正常に表示ができるようになる。