一部のユーザからメーリングリストに投稿が行われた場合、fmlによって自動生成されるHTMLアーカイブが文字化けする現象が発生していたのだが、どうやらOpera M2をメールクライアントと利用していることが原因だと最近気が付いた。 ThunderbirdやOutlook Express等のメールクライアントで受信したメールを見る場合は文字化けが発生しないのだが、メッセージのソースを見ると
=1B$B3'MM=1B(B
と言った感じに化けている。 ようだが、受信メール自体は読めているので何らかのエンコーディングがかかっているのだが、fmlのHTMLジェネレーターはデコードできないようだ。
で、他のメールのヘッダーと比べてみたところ
Content-Transfer-Encoding: quoted-printable
と言う1行が異なるので、"Content-Transfer-Encoding:"でググって見たところ、Opera M2ではメールの文字コードが7bitコードであるiso-2022-jpでも"Content-Transfer-Encoding: 7bit"では無く、"Content-Transfer-Encoding: 8bit"をつけて送信してしまうらしい。
あらためてM2から投稿されたメールのヘッダを読んでみると、
>Content-Type: text/plain; format=flowed; delsp=yes; charset=iso-2022-jp
>Content-Transfer-Encoding: 8bit
charsetがiso-2022-jpなのにエンコードが8bitと書いてあるのがどうも気になるんですよね。
M2以外はOEですらちゃんと7bitと書いてあるし。
で、これだけならまだ問題が無いのだが、世の中にはまだ8bitエンコードのメールを処理できないESMTPサーバも若干ながら存在しているため、"Content-Transfer-Encoding: 8bit"のメールはquoted-printableの処理を行って7bit化し、"Content-Transfer-Encodeing: quoted-printable"にして転送するESMTPサーバが存在するらしい。
なぜか、JIS (ISO-2022-JP)の文章が quoted-printableで変換されています。 このページの一番上の例と比較してください。 制御文字であるESCが「=1B」に変換されているのが判ります。 送信側の設定の問題かもしれません。 あと、送信側のメールソフトがContent-Transfer-Encoding: 8bitという間違ったフィールドを付けた場合に途中で経由したESMTPサーバが変換した実例を確認しています。このとき、
Content-Transfer-Encoding: 8bitだったものが、
Content-Transfer-Encoding: quoted-printableに変わります。
で、Thunderbird等のメールクライアントではquoted-printableをデコードしてもとのなんちゃって8bit形式に戻せるのだが、fmlのHTMLジェネレーターではその処理が出来ないと。
一番の解決方法はこんな怪しげなヘッダーをつけるOpera M2メーラなんて使わないことをメーリングリストユーザに強要することだが、あまり現実的ではない。
世界中のESMTPサーバが8bit文字コードに対応すればContent-Transfer-Encodingを8bitからquoted-printableに変換するESMTPサーバもそのうちなくなると思うのだが、これはもっと非現実的だろう。
quoted-printableで受信したメールをPostfixで8bitに変換してからfmlに渡せば解決できないかなぁと思いつつまたググっていたら、
8bit -> 7bit変換を抑制する
デフォルトではContent-Transfer-Encoding: 8bitのメールをquoted-printableに変換するみたい.これを抑制するには以下を記述すればよい.disable_mime_output_conversion = yes8bitってまだお行儀悪いのかしら.
と言う情報を発見。ためしに/etc/postfix/main.cfに追加してみたところ、無事、"Content-Transfer-Encoding: 8bit"のままメーリングリストに配信されることを確認。 どうやら、Content-Transfer-Encodingの変換を行っていたのはウチのPostfixだったらしい。
これで一安心ではあるのだが、まだ2つの問題が残っている。
- ML投稿者からウチのPostfixまでの間にContent-Transfer-Encodingを8bitからquoted-printableに変換するESMTPサーバがからむ場合に8bitに戻すことは出来ない。
- 8bit文字コード(UTF8とか)の投稿があった場合、ウチのPostfixからML登録者のSMTPサーバまでの間に、8bit文字コード未対応のESMTPサーバ(果たして世界にどの程度残っているのだろうか)が中継していると修復不能な文字化けが発生する可能性がある。
"Content-Type: text/plain; charset=iso-2022-jp"のときに、"Content-Transfer-Encoding: quoted-printable"だったら8bitに変換して"Content-Transfer-Encoding: 7bit"に置換、"Content-Transfer-Encoding: 8bit"だったらそのまま"Content-Transfer-Encoding: 7bit"に置換と言う処理がPostfixで出来ればいいのだけど。
↑fmlで処理するという方法はあるようだ。
コメントする