MIME プロトコルとは。わかりやすく解説

MIMEMIME とは、データの種類やエンコードを指定するルールです。

元々メールは ASCII コード (英数字といくつかの記号) しか使えませんでした。

そこで MIME により、UTF-8 (日本語や絵文字) やバイナリ (画像や音楽) に対応しました。

現在では、HTTP でもこの仕様を取り込んでいます。

OSI 参照モデルTCP/IP モデルTCP/IP プロトコル実装
アプリケーション層アプリケーション層HTTP, DNS, DHCP,
SSH, MIME, TLS
アプリケーション
プログラム
プレゼンテーション層
セッション層
トランスポート層トランスポート層TCP, UDPOS
ネットワーク層インターネット層IP, ICMP, ARP, IPSec
物理層
OSI 参照モデルTCP/IP は完全に 1:1 ではない。ARPデータリンク層ネットワーク層の間 (詳しくはここ)。
スポンサーリンク

MIME のヘッダ

MIME のヘッダは次の 3 種類が存在します。

  • MIME-Version
  • Content-Type
  • Content-Transfer-Encodinge

MIME-Version

MIME-Version とは、MIME のバージョンを表します。

現在は Version 1.0 しかないので気にする必要はありません。

Content-Type

Content-Type とは、データの種類を指定を表します。

Content-Type の書式は「Content-Type: タイプ/サブタイプ引数=値」です。

Content-Type は HTTP でも利用されており、代表的な種類に以下のようなものがあります。

タイプサブタイプ
applicationjson
gzip
textplain
css
html
javascript
csv
imagegif
jpeg
png
webp
multipartform-data
MIME タイプの一覧はこちら

Content-Transfer-Encodinge

Content-Transfer-Encoding とは、エンコード方式を指定します。

Content-Transfer-Encoding では、主に以下の項目が指定されます。

Content-Transfer-Encodinge説明
7bit7bit の文字列 (ASCII コード など)
8bit8bit の文字列 (UTF-8 など)
binaryバイナリデータ
base64base64 (バイナリデータ --> ASCII 文字列に変換などで利用)
スポンサーリンク

MIME マルチパート

MIME マルチパートMIME マルチパートとは、複数のデータ形式(html、通常テキスト、画像など)を持つメールを、データ形式ごとに複数のパートに分ける方法です。

Gmail の「メッセージのソースを表示」から、実際の MIME のデータを確認してみます。

添付ファイル:1_l.jpeg
本文:「本文です」

区切り文字

パートは区切り文字 (boundary) によって、区別します。

Content-Type: multipart/mixed; boundary="0000000000004553ed05ca6294d8"

以下の2点がわかります。

  • multipart/mixed; から複数のデータタイプ (文字や画像など) が混ざっている
  • 区切り文字が「0000000000004553ed05ca6294d8」

本文の内容

--0000000000004553ed05ca6294d8 #本文開始区切り文字
Content-Type: multipart/alternative; boundary="0000000000004553e905ca6294d6"

--0000000000004553e905ca6294d6 #本文 1 つ目
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64
5pys5paH44Gn44GZ44CCDQo=

--0000000000004553e905ca6294d6 #本文 2 つ目
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64
PGRpdiBkaXI9Imx0ciI+5pys5paH44Gn44GZ44CCPGJyPjwvZGl2Pg0K
--0000000000004553e905ca6294d6-- #本文終了区切り文字 (末尾に「--」)

次のことがわかります。

  • 本文の中でさらに区切り文字 (0000000000004553e905ca6294d6) を用意
  • 本文1つ目
    • プレーンテキスト, UTF-8, base64 エンコード
    • 5pys5paH44Gn44GZ44CCDQo= (base64 でデコードすると「本文です。」)
  • 本文2 つ目
    • HTML, UTF-8, base64 エンコード
    • PGRpdiBkaXI9Imx0ciI+5pys5paH44Gn44GZ44CCPGJyPjwvZGl2Pg0K
      (<div dir="ltr">本文です。<br></div>)

添付ファイルの画像

--0000000000004553ed05ca6294d8
Content-Type: image/jpeg; name="1_l.jpg"
Content-Disposition: attachment; filename="1_l.jpg"
Content-Transfer-Encoding: base64
--0000000000004553ed05ca6294d8--

次のことがわかります。

  • データは jpeg の画像
  • ファイル名は"1_l.jpg"
  • エンコード方式は base64