Twitter からの文字化けメール

Twitter を名乗るメールアドレスからメールが届いたのですが、Subjectが文字化けしていました。

Subject: ã¨ã¿ãŸã¾ã•ã²ã‚さん、Twitterからの感謝のメッセージです。

いまのTwitterがあるのは、皆さんのおかげです。
10年前の今日、ひとつのツイートからすべてが始まりました。 
そのときから、Twitterは驚くべきことを皆さんと一緒に行いました。<BR> この瞬間にも何百万人の人々がつながり、それぞれの思いを自由に語り、<BR> かつては想像もできなかったインパクトを世界中に与えています。
Twitterの誕生日に、皆さんにあらためて感謝いたします。<BR> これまで支えてくださり、ありがとうございます!<BR> そして次の10年に向けてもよろしくお願いいたします。

Subject が文字化けしていることだけでなく、本文中に「<BR>」がそのまま入っていたり、本文中のリンク先が Twitter ではなく、http://cl.S7.exct.net/ というサイトへのリンクになっているので、かなり怪しい雰囲気なのですが、変なメール配信サイトを使ってるだけで多分本物だと個人的には思ってます。知りませんけど。

まあ本物かフィッシングメールかはどうでも良くて、本題は文字化けです。

「◯◯さん、Twitterからの感謝のメッセージです」という文面から、文字化け部分は名前だと推測できます。

メールの生ヘッダを見てみます。

Subject: =?UTF-8?B?w6PCgcKow6PCgcK/w6PCgcW4w6PCgcK+w6PCgeKAosOjwoHCssOj?=
 =?UTF-8?B?4oCawo3jgZXjgpPjgIFUd2l0dGVy44GL44KJ44Gu5oSf6Kyd44Gu44Oh44OD?=
 =?UTF-8?B?44K744O844K444Gn44GZ44CC?=

MIMEデコードして文字化けしている部分のバイト列を見てみます。

$ ruby -e 'p "w6PCgcKow6PCgcK/w6PCgcW4w6PCgcK+w6PCgeKAosOjwoHCssOj4oCawo3=".unpack("m")[0]'
"\xC3\xA3\xC2\x81\xC2\xA8\xC3\xA3\xC2\x81\xC2\xBF\xC3\xA3\xC2\x81\xC5\xB8\xC3\xA3\xC2\x81\xC2\xBE\xC3\xA3\xC2\x81\xE2\x80\xA2\xC3\xA3\xC2\x81\xC2\xB2\xC3\xA3\xE2\x80\x9A\xC2\x8D"

「C2 xx」や「C3 xx」が繰り返されているのは、たいてい Latin-1(ISO8859-1) を UTF-8 に変換した時のバイト列です。

元々何か別のエンコーディング文字列(おそらく UTF-8)を Latin-1 とみなして UTF-8 に変換してしまったものと思われます。

ということで、逆に変換してみます。

$ ruby -e 'p "w6PCgcKow6PCgcK/w6PCgcW4w6PCgcK+w6PCgeKAosOjwoHCssOj4oCawo3=".unpack("m")[0].encode("iso8859-1", "utf-8", undef: :replace)'
"\xE3\x81\xA8\xE3\x81\xBF\xE3\x81?\xE3\x81\xBE\xE3\x81?\xE3\x81\xB2\xE3?\x8D"

UTF-8 ぽいバイトの並びになりました。このバイト列を文字で表すと「とみ???ま???ひ???」となりました。 当初の推測通り私の名前「とみたまさひろ」が文字化けしていたようです。

「とみたまさひろ」をそのまま UTF-8 バイト列で表すと次のようになります。

$ ruby -e 'p "とみたまさひろ".b'
"\xE3\x81\xA8\xE3\x81\xBF\xE3\x81\x9F\xE3\x81\xBE\xE3\x81\x95\xE3\x81\xB2\xE3\x82\x8D"

9バイト目の\x9F, 15バイト目の\x95, 20バイト目の\x82 の文字の部分がうまく変換できなかったようですが、これの原因はわかりませんでした。

天下の Twitter さんなんだから、まともなメール配信システムを使って欲しいところです。