6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iPhoneのデフォルトメーラが違う添付画像を表示するバグ

Posted at

※古いOS(iOS4.1)の話なので現在はなおってるかもしれません。誰か検証お願い

iPhoneのデフォルトメーラには、 「添付したインライン画像とは違う画像が表示されることがある」 というバグが存在します。

インライン画像付きHTMLメールは、以下のような構文となります。
<img src="cid:01@image.gif">

普通であれば<img src="image/01.gif">というような形になるところですが、インライン添付では画像が置いてあるURLとか無いので、かわりにcidという画像を結びつける記号を設置します。
ちなみに例ではgifという拡張子を指定していますが、別にそうする必要はありません。
@の前はランダムな値や日時など、@の後はドメイン名を指定し、<img src="cid:ecabf869473b42c110b1@example.jp">などとしている例が多いようです。
これは、cidは世界で一意であることが求められているためです。

で、具体的な画像は、BASE64エンコードでテキスト化した上でメール本文に格納されます。

Content-Type: image/gif; name="image01.gif"
Content-Transfer-Encoding: base64
Content-ID: <cid:01@image.gif>

R0lGODlh2QA9ALMIAFOKz6jK…(略)

メーラでは、<img src>のcidがこのContent-IDと結びつけられ、タグの部分に画像として展開され、表示されます。

では、もしこのcidが被ってしまうという事態があったらどうなるでしょうか。

一通のメールで同じcidを指定するというのは、単に同じ画像を連続で表示するというだけのことです。
複数のメールで同じcidを指定してみましょう。

GmailやPC用、iPhone用の多くのメールアプリでは、もしcidが被ったとしても、全く問題無く添付画像を表示します。
cidをメール単位で識別しているので、他のメールに同じcidが入っていたとしても顧みることは普通ないからです。

翻ってデフォルトメーラでは、中身を見たわけではないので推測ですが、以下のように動作していると思われます。
まず一通目のメールを見た際に、そのcidに対応する画像がキャッシュに登録されます。
そしてその後再度メールを見た際、cidに対応する画像がキャッシュに登録されていれば、その画像を表示します。
おそらく高速化のためにそうしているのだと思われますが…ここにひとつ落とし穴があります。

同じcidであればメールを気にせずキャッシュから読み込むんだよね。

どういうこと?
ちょっとRFC準拠が足りないメールアプリがあったとして、cidを連番で付けちゃう仕様になっていたとします。

一通目。
絶対に許さない<img src="cid:01@image.gif">
添付画像:image1.gif

二通目。
ごめんね<img src="cid:01@image.gif">
添付画像:image2.gif

Gmailから見ると送信したとおりのメールが見れます。

で、これをデフォルトメーラで見ると、

一通目。
絶対に許さないimage1.gif

二通目。
ごめんねimage1.gif

これじゃあ戦争になっちゃうよ!

問題は、送信側は全くこのことに気がつくことができないという点です。
たしかにRFCを守ってない送信側メーラが悪いと言えばその通りなのですが、メール単位で絞り込みは可能なわけなんだからそのくらい対応してやれと。

ところで@のあたりに勝手にリンクが付いたりするのですが、これを何もしないようにしたいのはどうすればいいんだろう・

6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?