2019-03-11
迷惑メール対策のプログラムでヘッダが壊される

弊社から自動送信している案内メールが文字化けして読めないと申告があったので、取り急ぎ単純に文字コードをISO-2022-JPで送信していたのを文字コードをUTF-8にしてBASE64エンコードで送信してみるが文字化けが解消されない。
次に受信メーラーを変えてもらってテストするが同じように解消されない。
文字化けという申告に囚われていたので、その後もBASE64エンコードではなく、Quoted Printableでエンコード方式を変えてみるがNG。
このままでは原因がまったくわからないので受信メールのソースをコピーして送ってもらう。
(利用メーラーの受信メールのソース確認方法を探すのも手間取りました)
で、ソースを確認するとなんと! From:ヘッダの次に空行が入って
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding:BASE64
を含めたいくつかのヘッダがBody(メール本文)になってしまっている。
rfc5322の2.1.に空行(つまりCRLF,CRLFの2つの改行連続)がヘッダとボディの区切りになることが定義されている。
これじゃ当然メーラーは正しくデコードできない。
弊社側の送信側プログラムの不具合かと思い、いろいろな方法でデバック検証するがまったく問題ない。
このお客様宛(一部のドメイン)の送信メールだけがヘッダに余計な改行コードが付加される。
間違いなく受信側のメールサーバーか或いは、ウィルス対策ソフトだろうと思いさらに何を利用しているのかヘッダから確認する。
(ウィルス対策ソフトは、ほとんどの商品でヘッダ或いは本文にウィルスチェック済みであることがわかるようになっている。)
サーバー側のSPAM対策ソフトの場合は、ヘッダに***SPAM**等のへっだが付加されるのでそこから調べる。
X-****-Anti-Spam-*****
というヘッダがある。
このプログラムが余計な改行コードをヘッダに付加しているのは間違いないのでこのプログラムでの不具合や同一事象を検索してみるが見つからない。
受信メールがSPAMと判断されたとしてもメールヘッダを壊すのは、明らかに意図しない不具合であることは間違いないのでサービス提供元に改善策をお願いする方向で依頼しようと思ったが、弊社からのこの案内メールだけが文字化けするのでそちらで文字化けしないようにしてくれ!と納得していただけない。
そこでスパム対策ソフトにヘッダを壊されない(余計な改行コードを入れさせない)方法を試行錯誤して試すことになった。
正直この時点では理不尽だなと思いつつも、この手の不具合でよくありえるのが正規表現をつかった副作用でおかしくなるパターンだろうと見当をつけていたので、
ヘッダの順番入れ替えやX-**系のヘッダを削除したり(パターンマッチングに引っかからないようにする)を試してみる。
結果、"X-Mailer: PHP/5.4.45" をヘッダから削除して送信すると余計な改行コードがヘッダに付加されて電子メールフォーマットが壊されると言う事象から回避できました。