single.php

iPhoneの「メール」アプリに受信されたHTMLメールの画像がキャッシュされるという話

HTMLメールを送信するアプリケーションを作っている時に分かったことですが、「iPhone」(おそらくiPadも)の「メール」アプリで受信されるHTML画像は最初に読み込まれた画像がキャッシュされます。

HTMLメール

通常メーラーに受信されるメールは大きく分けて、プレーンテキストで構成される「テキスト形式」と、画像などを埋め込むことができる「HTML形式」の2種類があります。

それぞれ一長一短がありますが、最近とどくダイレクトメール系のメールは、イメージなどリッチな表現が多いのでHTML形式で届く場合が多いです。

そのままHTML文

その名のとおり、HTML形式のメールでは内部はHTML文で構成されているので、背景や文字の色や画像、段落などホームページを見るようにリッチなコンテンツをユーザに提供することができます。

画像などは、実際のURLを設定してインターネット上に配置した画像を参照することもできますがオフラインでも利用できるようにメール内に埋め込む事もできます。

画像の埋め込み

実際にHTMLメール内の画像の埋め込みは

[HTML]
Content-Type: image/png; name=”sample.png”
Content-Transfer-Encoding: base64
Content-ID:
<イメージのBase64>
[/HTML]

本文内に、Base64形式でイメージの内容を書いておいて、Content-IDで参照用のIDを設定しておきます。
そのIDを、

[HTML]

[/HTML]

として、imgタグのsrc属性を設定します。このときに、同じID値で設定された画像をiPhoneの「メール」アプリで受信した場合にキャッシュされた画像が表示されてしまいます。

現象

iPhoneの「メール」アプリが最初に表示したHTMLメール内のcid値で区別して表示した画像がキャッシュされます。次にHTMLメールを開いた場合に、cid値が設定されていた場合に過去同じIDで表示があった場合にはキャッシュが優先されて表示されます。

この現象が発生するのはiPhoneに既定でインストールされている「メール」アプリです。Android端末やWindowsなどのメーラーに同じメールを送信しても、cidのキャッシュが優先して表示されることはありません。

「メール」アプリがアホなのか、AndroidのGmailが普通なのか詳細は不明ですが、とにかくiPhoneの「メール」にHTMLメールを送信する場合には注意が必要です。

対応

「メー「」ル」アプリを一旦閉じて、再度開いた場合に、キャッシュがクリアされます。この操作でも最初に読み込んだ以降は、同じ問題が発生するので根本的な改善にはなっていません。

根本的に解決するには、固定値のcidを使わずに値が一意になるようにHTMLを送信する部分を変更します。例えば日付やユーザ名の一部などを追加して、送付するメール毎にIDを発生させることで回避ができます。

例えば、[cid:hogehoge@20171205115420000]のように日付を入れて、一意化するのも1つの手段だと思います。

スポンサーリンク

最後までご覧いただき、ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です