MIME/メール添付ファイルでのBase64

メールシステムが添付ファイルをエンコードするためにBase64を使う仕組みを解説。MIME、Content-Transfer-Encoding、行折り返しルール、Base64の歴史を紹介します。

Format

詳細な説明

Base64エンコードは元々メールによって普及しました。MIME(Multipurpose Internet Mail Extensions)標準はRFC 2045(1996年)で定義され、7ビットASCIIテキストとして送信される必要があるメールメッセージにバイナリ添付ファイルをエンコードする推奨手段としてBase64を指定しました。

メールにBase64が必要な理由: 初期のメールシステム(SMTP)は7ビットASCIIテキストのみを扱うように設計されていました。バイナリファイル(画像、ドキュメント、実行ファイル)には127を超える値のバイトが含まれており、これらのシステムでは破損してしまいます。Base64はあらゆるバイナリデータを安全なASCII文字に変換します。

添付ファイル付きメールのMIME構造:

From: sender@example.com
To: recipient@example.com
Subject: Report attached
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_Part_123"

------=_Part_123
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit

Please find the report attached.

------=_Part_123
Content-Type: application/pdf; name="report.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="report.pdf"

JVBERi0xLjQKJcOkw7zDtsOcCjEgMCBvYmoKPDwgL1R5cGUgL0Nh
dGFsb2cgL1BhZ2VzIDIgMCBSID4+CmVuZG9iago1IDAgb2JqCjw8
IC9MZW5ndGggNDQgPj4Kc3RyZWFtCkJUCi9GMSAxOCBUZgo1MCA3
...
------=_Part_123--

重要なヘッダー: Content-Transfer-Encoding: base64 は、後続のコンテンツがBase64エンコードされており、使用前にデコードが必要であることをメールクライアントに伝えます。

行折り返しルール: MIMEではBase64出力を76文字以内で改行し、各行をCRLF(\r\n)で終端することが要求されます。これは連続したBase64文字列とは異なります。76文字の制限は、SMTPの行長制限998文字を十分に下回り、さらに厳しい制限を持つ古いシステムとも互換性を保つために選ばれました。

その他のContent-Transfer-Encodingオプション:

  • 7bit:プレーンASCIIテキスト、エンコード不要
  • quoted-printable:ほぼASCIIで時折特殊文字を含むテキスト向け。テキストコンテンツにはBase64より読みやすい
  • 8bit:生の8ビットデータ(すべてのメールサーバーで安全ではない)
  • binary:生のバイナリ(実際にはほとんど使用されない)

Base64は、すべてのメールシステムで任意のバイナリデータを安全に扱える唯一のオプションです。最新のSMTPは8ビットコンテンツをサポート(8BITMIME拡張経由)していますが、メール配信チェーン全体での後方互換性は保証できないため、Base64が添付ファイルのデフォルトであり続けています。

よくある間違い: 適切な行折り返しなしにMIMEメッセージを手動で構築すること。ほとんどのBase64ライブラリには76文字の折り返しを自動処理するMIME専用エンコーダーがあります(Pythonの encodebytes()、Javaの getMimeEncoder())。

ユースケース

確認メールにPDF請求書をプログラム的に添付するトランザクションメールサービスを構築し、各添付ファイルをMIME構造内でBase64としてエンコードする場合に使用します。

試してみる — Base64 Encoder

フルツールを開く