モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Yahoo!のWebメールからさくらのMLを使ってGmailで受けると文字化けする問題について

さくらのMLをGmailで受け取っているとき、ヤフーのWebメールから送られたものだけが、ところどころ文字化けするのだけど、なんで?という相談を受けました。
ちなみに、普通のBecky!などのメーラーで受けている場合は文字化けなども起っていないそうで、ただ、Mac OS X の Mailだと同様に化けるそうです。他の普通の投稿については別に文字化けとかは起らないそうです。
また、全てが化けてしまうのではなく、所々化けてはまた戻るという状況でした。


最初は、Yahoo!Gmailか、どちらかのWebメールで日本語エンコード・デコードで失敗してるのかと思ったのですが、本文をダンプしてながめたりしたのですが、そうではありませんでした。
それでYahoo!WebメールからGmail宛にテストメールを出して観察して、やっと理由がわかりました。


実はGmailは、メール本文がテキストとして添付されている場合、本文を表示してくれません。
たまにGmailでは、本文が表示されないスパムがありますが、そのためです。
Yahoo!Webメールで普通の設定だと、HTMLメールが使えるようになっていて、メール本文がテキストとして添付されたものと、メール本文がHTMLとして添付されたものと、二つが添付されて届きます。
そのような場合例えばBecky!などでは、HTMLではなくテキストのほうが優先的に表示されるようになっていますが、GmailではこのHTMLのほうしか表示されないわけです。


で、Yahoo!WebメールのHTMLなのですが、これがなぜか、途中で改行してあろうと無かろうと、1行が非常に長く作られてしまうようになっています。
メールで1行の最大長はRFC2822で最大1000文字、普通は78文字程度にとされています。
これがYahoo!WebメールでHTMLのパートは、<DIV>で区切りつつ、950文字くらいの長さにしてしまうのです。
しかし、Yahoo!から直接Gmailで受けている場合はこれでも一応問題は起りません。
Yahoo!Webメールで、改行無しに非常に長〜い文を書いても、勝手に途中で<DIV>で区切りを入れてくれるため、これまた問題は起きません。


しかし、途中で何らかのフィルタが入った場合に問題が起る場合があります。

メール本文の1行の文字数制限 −PHPアプリ−|集えプログラマ!集まれエンジニア!

PHPでは、912Byte目でどうも無理やり改行コードを挿入しているようです。
つまり、912ByteがASCIIコード以外の文字であった場合、文字化けが発生します

とあるように、例えばPHPのmail関数では、勝手に最大文字数を912として改行を入れてしまうようです。
実はこの場合もちょうど912Byte目で化けていたので、どこかのフィルタでPHPのmail関数が使われているのではないか、と思われます。


なので、大元となっている原因はYahoo!Webメールで吐かれるHTMLが、一行が非常に長いためなのですが、いろいろな要因が重なり合って出てくる事象でした。
Yahoo!に報告したら対応してくれるかなあ…