# ああ3月が去ってしまう。。ということでもろ技術ネタ。興味の無い方すんません。。
メール配信にはphplistを使っています。多機能かつ大量送信時のthrottlingもきちんとこなしてくれるお行儀の良さで長年愛用しているのですが、ところどころ作りが「フニャ」っとしているところがあり、というか使い始めたころは日本語対応をまともにやってくれていなかったこともあり、愛憎半ばといったところです(その後、phpmailerライブラリを採用してくれたので大分ラクになったんですが)。
そんな憎めないヤツなんですが、先日そもそもメールがちゃんと送れない、という基本的なところで大ハマりしたのでちょっと経過報告。
ヘッダが漏れる!
DIPさんで公開してくれている、PHPList日本語化適用版をインストールし、2バイト1バイト混在時の改行の乱れ対策等、ちょこっといじってハイ完成。メール送信ライブラリをゴリゴリにいじらないとまともに動かなかった頃を思えばラクになったもの……と思いきや、「一部の人から、「メールが文字化けしている」との連絡が!!」、とクライアントさんより連絡。
問題のメールを見せてもらうと、ヘッダのSubject:行の後ろにパッカリと空行が。当然、それ以降は本文扱いされてしまうので、本文に謎の文字列ゾロゾロ、となるわけで、まあ文字化けと言われればその通り(本文は読めるっちゃ読めるんですが、まあそんなレベルで言い争ってもしょーがないわけで)。
以前、mb_encode_mimeheader()の第四引数問題で大ハマリしたことがあったので、そこら辺を中心に延々と攻めてみたのですが、効果なし。また、この手の問題は大体某社のメーラーがいろいろとタコなので、Outlook(あ、言っちゃったよ)での挙動をチェックして、問題ないことを確認しても、実際に配信してみるとやはり同じ人から文字化け、との連絡が。
テキはプロバイダにあり
前述の通り、これはまたぞろmb_encode_mimeheader()まわりだろう、と決めつけていたので、延々とそこら回りを調べていたのですが、まあ出てくる出てくるバッドノウハウつーか怨嗟の声つーか。。
あれこれ調べていくうちに、比較的早い段階で
「メールヘッダはCR+LF」(ただしLFのみでないとダメなサーバもある)
いう情報は入手していたのですが、とにかくメーラー問題であろう、と決めつけており、また、「とりあえず「正しい」設定は墨守しておくのが吉」という定石に従い、この部分は華麗にスルーしてあれこれと設定をいじっていたのですが、どうにも埒が明かず。しかも、クライアントさんのところでメールマガジンを配信するのは週一回、問題が起きているお客さんとのやりとりも担当さんが間に入るので、テストも再現もままならず。イライラ。。
しかし、先方の担当者さんが粘って情報を集めてくれたおかげ+たまたま手近なところに同一プロバイダの利用者がいたことで、ようやく問題が手元で再現し、ここに至ってついに「特定プロバイダのメールサーバに問題があるんじゃね?」というところに辿りつきました。
RFC 2822にはそんなことをしていいとは書いてない
というわけで解決編。
「phpmailerで定義されてる改行コードをLFのみにする」
これだけ。phplistで具体的に言うと、
admin/phpmailer/class.phpmailer.phpで、
//modified
//var $LE = "\r\n";
var $LE = "\n";
とするだけ。うーん。。。。
あ、ちなみに問題(つまり、ヘッダをCR+LFにするとキョドる、不思議なメールサーバを使っているところ)のプロバイダは、(今回遭遇した範囲では)ぷららとODNでした。まだqmail使ってんのかな。。
phplistでハマってる人に加え、phpmailerでハマってる人に共通の問題だと思うので、意外と影響範囲の広いネタだと思います。
ご参考まで。