私事ですが、本日は私の誕生日でした。\(^◇^)/
社内の人たちに祝ってもらい、本日のブログネタ完成!
・・・と思ったのですが、写真は撮ってないし、
ブログとしてはちょっと文字数が足りないということで、
前回(2/22)に引き続き、技術系の話をします。
今回は開発者向けのコアな内容にします。
お題はPHPのメール送信ライブラリであるPHPMailer。
事の発端は弊社CMS担当から
「MODxでフォームからメールを送信すると送信者名が文字化けします」
の一言。
私もMODxで組んだフォームからメールを送信したことがありますが、
一度も文字化けが発生したことがありませんでした。
とはいえ実際に文字化けしたメールがある以上調査をせねば
ということでまずは文字化けしたメールを確認。
送信者名が↓の様になっています。
ここに非常に長い名前のメール送信者名\r\n を設定してみます
これを見てピンとくる人もいるかもしれませんが、
どうやら文字化けというより、改行コードがそのまま表示されている模様。
ということでそのあたりを中心に調査開始。
普段メールを使用していても、知っている人は少ないと思いますが、
メールの送信者名は文字をそのまま送っているのではなく、
Base64という方式に変換されて送信されています。
これは送る文字が日本語などであってもすべて英数字+α(64種類)
だけを使用して表すことができるというものです。
たとえば、問題の送信者名を変換すると
といった感じになります。(長いので一部抜粋)
この方式の難点は、64種類であらわすため文字の長さが約33%増加するところで、
メールの規格で定められた“78文字で改行するべき”という規格に簡単に接触し改行が行われます。
ということでこの改行を行っているところを調査すると、以下の記述を発見!
これがなにをしているかというと
文字コードの0~31番(8進数で0~37)と127(8進数で177)と\と”を
文字コードから文字列に変換しますという処理。
改行コード(と再起コード)である10番(と13番)は0~31番に含まれるわけで・・・
しかもマルチバイト文字の場合のみ通るというピンポイント処理。
これを対処するには以下の三つが考えられます。
1.addcslashesの処理を改変する
2.処理を行っているメソッドをオーバーライドする。
3.あきらめて長文にならないようにする。
今回は自分で作成したフォームからの送信なので、
手軽さを考え1の対処をしました。↓
とりあえず、これで問題なく送信されていますが、
オープンソースのコードは過信してはいけないようです。
と書いたのはいいのですが、つい先日このメールフォームスニペットの
新バージョンが出たようで、その中ではこの問題は対処されているそうですorz
あと一週間くらい早く出してほしかった・・・


















