メール

HTMLのメール(quoted-printable)

最近、企業から送られてくる宣伝メールなどは、HTMLでデザインされたメールが多くなりました。

以前はメーラーの脆弱性を考えてテキスト表示設定にしていましたが、そのような使い方は最早時代遅れのようです。

メール送信でHTMLメールを、WordPressでどのように送信しようか考えておりますが、先にデータ構造について確認しようかと思います。ただし、まだまとめ記事にできるほど情報を集めていないため、今回は備忘録の記事です。

当方が利用しているValue DomainからHTMLメールが来ましたので、内容を確認してみました。

Macで受信したメールをファイル出力する

インターネット上で通信されるメールデータは、制御文字を避けて透過性のある文字コードに変換して通信されます。

そのためメーラーでは日本語表示されていても、素のメールデータは文字コードが変換されていて読めません。

Macのメーラーで素のメールデータを取得したい場合、以下の手順でファイル出力するようにします。

  • 目的のメールを選択、内容を表示します
  • メニューバーの「表示」メニューからプルダウンメニューの「メッセージ」を選択し、「ソース」を選択します。
  • ソースが表示されたウィンドウが表示されるので、メニューバーの「ファイル」メニューを選択、「別名で保存」を選択して拡張子「.eml」のファイルを保存します。

メールデータの構造

HTMLメールデータは大きく3つのブロックからなり、ブロックの終了にヘッダーで指定された「boundary=”…”」の文字列が行追加され、ブロックの境界として設定されます。

当方の確認したメールデータは、3つのブロックがそれぞれヘッダー、プレーンテキストのメールデータ、HTMLのメールデータになっていました。

ブロック内のデータ

ブロック内はメール本文になりますが、ブロックの先頭に次の2つの指定がなされています。

  • Content-Type:
  • Content-Transfer-Encoding:

Content-Typeは、テキストの場合は「text/plain; charset=”iso-2022-jp”」が、HTMLの場合は「text/html; charset=”iso-2022-jp”」がそれぞれ設定されていました。

Content-Transfer-Encodingは、「text/plain」の場合は「7bit」が、「text/html」では「7bit」がせっていされているものと、「quoted-printable」が設定されているものがありました。

データを元に戻す

PHPで「iso-2022-jp」をUTF-8に変換するには、「mb_convert_encoding()」を利用します。

$src = mb_convert_encoding($str, 'utf-8', 'iso-2022-jp');

もし「quoted-printable」が設定されていたら、「quoted_printable_decode()」を利用して次のように変換します。

$src = mb_convert_encoding(quoted_printable_decode($str), 'utf-8', 'iso-2022-jp');