ありのまま先週起こったことを話すぜ!
「WWDCの落選メールが来たと思ったら当選していた」
な…何を言っているのかわからねーと思うが(ry
どちらも同じメールで、左がOS XのMail.appで表示したもの、右がiOSのMailで表示したもの。しかしその内容はまったく逆のものでした。どうしてこんなことが起きたのか?
このメールはいわゆるHTMLメールで、Content-Typeヘッダーに multipart/alternative
が指定されてプレーンテキスト版とHTML版両方を含んでいました。1
メールのソースはこんな感じです。(一部省略)
Subject: See you at WWDC 2016.
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_Part_21435134_475188922.1461380226746"
------=_Part_21435134_475188922.1461380226746
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: QUOTED-PRINTABLE
Content-Disposition: inline
Dear Masayuki Iwai,
-------------------------------------------------------------
Thank you for registering for the random selection process to attend WWDC 2=
016.
(中略)
------=_Part_21435134_475188922.1461380226746
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: QUOTED-PRINTABLE
Content-Disposition: inline
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org=
/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" xmlns=3D"http://www.w3.org/199=
9/xhtml">
<head>
<title>See you at WWDC 2016.</title>
=09<meta http-equiv=3D"content-Type" content=3D"text/html;charset=3Dutf-8" =
/>
(中略)
</body>
<img src=3D'http://outsideapple.apple.com/img/APPLE_EMAIL_LINK/spacer4.gif?=
v=3D2&a=3Dk%2BmjWPCFEH1m5ry2zndhAnQ3KF5%2BETE7bF8B0noUrq0uBAOmHzBUSjD1TRVGj=
SxUwuMOnmb4uUDjxmxjFVrUHDqGi6zn%2BmwGZR9n1y4oZLo%2BKRkYuPS4MAmijGVhS1hcS8o0=
HiwbZ16dhN7sWkAl2WwNiFe3f3zEgkvv2afNmRhnSOLAj%2F5jjMwp2N4CjQUT0MCISekHgDteS=
55tX%2BM6BTEH6rkXkHrcCMIhHDtr5%2FXFcYP%2FiM232t6QUgiiiNaBykZPgkf%2BEPpbcmgG=
zWYrRV06%2F2iHtXIMMzCn2kqTsCjmouIsny9X97NhAXD37DD7cJseI%2FhtatHdJpq%2B%2FqI=
LrqbCrx3QjC5R9TGT4KKIqlDmqp7eWYDWkQAV3TWTHfGI1%2BeLhvXl1JDLHYqyYKrneGbZgt7t=
VqQo64%2FVCqUS6WaIZpmoB2kusU%2B7iS%2F6MSG2'
これを見ると ----=_Part_21435134_475188922.1461380226746
というバウンダリーで各パートが区切られていて、最初にプレーンテキストのパート、後にHTMLのパートという構成になっています。
プレーンテキストパートとHTMLパートで真逆のことが書かれているのは単純にAppleのミスだと思われるのですが、まったくひどい話です。
問題は、なぜOS XのMail.appではプレーンテキストパートが表示されて、iOSのMailではHTMLパートが表示されるのかということです。
RFC1341(MIME) : 7 The Multipart content type によると、Content-Type: multipart/alternative
では送信側は最初のパートを最もプレーンなフォーマットで後のパートになるほどリッチなフォーマットにすべきで、受信側は表示可能な最後のパートを表示すべきということが書かれています。
ここでメールのソースをよく見てみると、HTMLパートの終わりにマルチパート全体の終了を表すバウンダリーがありません(------=_Part_21435134_475188922.1461380226746--
で終わるはず)。それどころか html
の閉じタグもなく、そもそも </body>
の後に img
タグがあって途中で切れてしまっているのがわかります。これはひどい。
試しに最後に終了を表すバウンダリーを追加してメールを送信してみると2、OS XのMail.appでもHTMLパートが表示されました。
ということはつまり、OS XのMail.appはピュアに後半のHTMLパートが壊れていると見なしてプレーンテキストパートを表示し、iOSのMailはここでマルチパートが終わっていると見なしてHTMLパートを表示していた、というのが真相のようです。
同じApple製のアプリケーションでも細かい部分での仕様は違ったようです(ちなみにThunderbirdはiOSのMailと同様の挙動でした)。
ということで、Appleさんしっかりしてくださいよ!という気持ちを胸に抱きつつWWDCに参加したいと思います。
-
マルチパートについてはこちらを参照: インターネット・プロトコル詳説(4):MIME(Multipurpose Internet Mail Extensions)~後編 - @IT ↩
-
コマンドラインからのメールの送信はこちらを参考にしました: Macでコマンドラインやプログラムからmailを送る - Qiita ↩