日本語の添付ファイル名のエンコーディング

  • メールの添付ファイル名をめぐる問題について、Mac OS Xユーザの視点でまとめてみる。
  • 添付ファイルを送信する際、その名前はどこに書かれるのか。RFC 2183では、添付ファイル名はContent-Dispositionフィールドのfilenameパラメータに記述することになっている。ただし今回調べたメーラーまたはメールサービスはすべて、filenameパラメータだけでなく、Content-Typeフィールドのnameパラメータにも添付ファイル名を記述する。後述するが、nameパラメータは互換用として機能している。
  • 添付ファイルを送信する際、その名前はどのような方法でエンコードされるか。非ASCII文字列を添付ファイル名として扱う方法は、RFC 2231で定義されている。しかし、OutlookWindows MailなどはRFC 2231をサポートしておらず、代わりにMIME Bエンコーディング*1を用いる*2
  • filenameパラメータとnameパラメータ、RFC 2231とMIME Bエンコーディングの組み合わせは、2×2で4通り考えられるが、現実には2通りの組み合わせに収束している。「filenameは2231、nameはB」と「filenameもnameもB」だ。
  • 下図はThunderbird(3.0.4 for Mac)から送信したメッセージの一部*3。ファイル名は「あいうえおあいうえおあいうえお.png」。緑地のfilenameパラメータはRFC 2231方式で、黄色地のnameパラメータはMIME Bでエンコードされている。


  • 下図はGmailから送信したメッセージの一部。filenameパラメータもnameパラメータもMIME Bでエンコードされている。


  • メーラーまたはメールサービスがファイル名をどのように送信するかをまとめたのが、下図。MobileMeAppleのサービスだけれど、添付ファイル名のエンコードに関する仕様がWindowsっぽい。


  • 下図は、受信したメールの添付ファイルのデコードについてまとめたもの。今回テストしたすべてのメーラーまたはメールサービスがMIME Bのデコードに対応している。エンコードRFC 2231を用いるApple MailとThunderbirdがそのデコードに対応しているのは当然*4Gmailエンコードにおいては「filenameもnameもB」派だが、RFC 2231のデコードもサポートしている。OutlookWindows MailはRFC 2231でエンコードされた(filemaneパラメータの)ファイル名をデコードできないが、その場合、nameパラメータから添付ファイル名を得ることとなる。

*1:MIME BエンコーディングRFC 2047で定義されている。ただしRFC 2047は、Content-TypeフィールドやContent-DispositionフィールドのパラメータにMIME Bエンコーディングを用いることを禁止している。

*2:これ以外に、ISO-2022-JPの(生の)文字列を用いる例(Mac OS X 10.4.6以前のApple Mailが送信したメッセージのnameパラメータなど)もあるが、たぶん現在では一般的ではない。

*3:Thunderbirdでは、添付ファイル名の記述方法はカスタマイズすることが可能だが、このエントリでThunderbirdに言及する場合、3.0.4のデフォルトの設定(mail.strictly_mime.parm_folding=1)を前提としている。

*4:Apple MailとThunderbirdでは、RFC 2231のサポート方法に若干の違いがあって、それが文字化けの原因となるのだが、詳しくは後日。