This file documents MIME features of FLIM, a fundamental library to process Internet Messages for GNU Emacsen.
GNU Emacsen 用の Internet Message 処理のための基礎 library である FLIM の MIME 機能に関して説明します。
FLIM は Internet Message の表現や符号化に関する基礎的な機能を提供する ための library です。
FLIM の提供する MIME 機能を使うためには
RFC 2045 の定義は、MIME message が entity を節とする木構造であることを
示しています。つまり、MIME は message を木構造に拡張した訳です。
FLIM は entity の情報を表現するために
Entity を開いて、それを返します。
type は representation-type です。
location は entity の位置です。指定方法は
representation-type に依って変わります。
buffer を message として構文解析し、その結果の mime-entity
を buffer の
buffer が省略された場合、現在の buffer を構文解析する。
type が指定された場合、その値を生成される mime-entity の表
象型として用いる。省略された場合は buffer となる。
MIME message は entity を単位とする木構造になっています。
この木において根となる節は message 全体を表す entity です。ここでは、
これを
root-entity 以外の entity は親を持ちます。また、entity は子供を持つか
も知れません。この親子関係を考えることで entity の相対関係を扱うことが
できます。
一方、entity の message における位置を考えることもできます。
entity はこの木における節となりますが、この木には深さと同じ深さの中の
順番に従って番号が付けることができます。即ち、
mime-entity では、これと同様の
前述のように、MIME message は entity を単位とした木構造になっているので、
この根である message 全体も mime-entity で表現することができ、buffer
local 変数
現在の buffer における message 全体の mime-entity 構造体を格納する
buffer local 変数。
entity に含まれる entity の list を返す。
entity の親の entity を返す。
message が指定された場合、これを根と見倣す。
entity が根(即ち、message 全体)である場合に、
非-
entity の node-id を返す。
entity の entity-number を返す。
message から、enity-number の entity を返します。
message が指定されていない場合は、
message から、entity-node-id の entity を返しま
す。
message が指定されていない場合は、
message から、cid の entity を返します。
message が指定されていない場合は、
entity の content-type を返す。
entity の content-disposition を返す。
entity の file 名を返す。
entity の content-transfer-encoding を返す。
もし、entity に Content-Transfer-Encoding 欄が存在しない場
合は、default-encoding を返す。これが指定されない場合は、
entity の内容が既にコード変換されている場合は nil で無い値
を返す。
entity の header 中の field-name 欄の body を返す。
結果の文字列は network 表現のままである。
entity が省略された場合は、
field-name 欄が存在しない場合は
entity の header 中の field-name 欄を構文解析した
結果を返す。
結果の形式は欄毎に異なる。非構造化欄の場合は文字列を返し、構造化欄の場合
はその形式に従った list を返す。
結果中の文字列は Emacs の内部表現に変換される。
entity が省略された場合は、
field-name 欄が存在しない場合は nil を返す。
現在位置に entity の復号した header を挿入する。
invisible-fields と visible-fields は正規表現の
list で、それぞれ、表示したくない field 名と表示したい欄名を表現したもの
である。
invisible-fields の要素のどれかに match し、かつ、
visible-fields の要素のどれにも match しない欄は表示されな
い。
point の前に entity を text entity として挿入します。
entity の内容は
適切な
本来は APEL の変数である。
entity の内容の byte 列を返す。
point の位置に entity の内容を挿入します。
entity の内容を filename に書き込みます。
entity の header と body を point のところに挿入します。
entity の表現を filename に書き込みます。
entity の body を filename に書き込みます。
entity が存在する buffer を返す。
entity が存在する buffer における、entity が占める
領域の先頭位置を返す。
entity が存在する buffer における、entity が占める
領域の末尾位置を返す。
entity が存在する buffer における、header が占める領域の先頭
位置を返す。
entity が存在する buffer における、header が占める領域の末尾
位置を返す。
entity が存在する buffer における、body が占める領域の先頭位
置を返す。
entity が存在する buffer における、body が占める領域の末尾位
置を返す。
Entity は抽象化されたデータ表現で、実際のデータ表現としては用途に応じて
さまざまなものが利用できるように設計されています。
ここで、entity がどういう種類の表現を行っているかを示すのが
前節までに述べて来た entity に対する処理は、entity に対してその処理を依
頼することによって実現されています。Entity は自分の
representation-type を知っており、その representation-type に応じて実際
の処理を行う関数を呼び出します。このような関数を
mm-backend は representation-type の名前の先頭に
entity に message を送る。
args は message の引数である。
type を mm-backend として定義します。
PARENTS が指定されている場合は、type は prents
を継承します。それぞれの parent は representation-type である必要があ
ります。
例:
name を (nth 1 (car args)) backend の method 関
数として定義します。
args は lambda の引数リストのようなものですが、(car
args) は指定された parameter である必要があります。(car
(car args)) は変数の名前で、(nth 1 (car args))
は backend の名前 (representation-type) です。
例:
歴史的には RFC 1049 で Content-Type 欄が提案されている。但し、MIME の
media-type のような type と subtype の区別はなく、MIME charset のよう
な文字符号の種類を表現することもできない。
FLIM は Content-Type 欄を構文解析する関数と Content-Type 欄の解析結果を
格納する構造体
Content-Type 欄の形式は以下のように定義されています:
例えば、
ここで、`type' と `subtype' は entity の形式を示すもので、両者を総称し
て、`media-type' と呼ぶことにします。上記の例における `image/jpeg' や
`text/plain' は media-type の1つです。
Content-Type 欄のない entity は
Content-Type 欄の情報を格納するための構造体。
この構造体を参照するには
この構造体の要素は以下の通りである:
content-type の生成子。
content-type の parameter の値を返す。
string を content-type として解析した結果を返す。
現在の buffer の Content-Type 欄を読み取り、解析した結果を返す。
Content-Type 欄が存在しない場合は nil を返す。
type と subtype から type/subtype 形式の文字列を返
す。
FLIM は Content-Disposition 欄を構文解析する関数と Content-Disposition
欄の解析結果を格納する構造体
Content-Disposition 欄の解析結果を収めるための構造体。
この構造体を参照するには
この構造体の要素は以下の通りである:
content-disposition の parameter の値を返す。
content-disposition の filename の値を返す。
string を content-disposition として解析した結果を返す。
現在の buffer の Content-Disposition 欄を読み取り、解析した結果を返す。
Content-Disposition 欄が存在しない場合は nil を返す。
FLIM では Content-Transfer-Encoding 欄を構文解析する関数を提供します。こ
れらの関数は Content-Transfer-Encoding 欄の情報は文字列で表現します。
また、Content-Transfer-Encoding に基づいて符号化・復号化を行う関数も提
供されます。
string を content-transfer-encoding として解析した結果を返す。
現在の buffer の Content-Transfer-Encoding 欄を読み取り、解析した結果を
返す。
Content-Transfer-Encoding 欄が存在しない場合は
default-encoding を返す。
現在の buffer の start から end までの region を
encoding を使って符号化します。
現在の buffer の start から end までの region を
encoding を使って復号化します。
string を encoding として復号した結果を返す。
ENCODING format で符号化された file FILENAME を
挿入する。
encoding で符号化された現在の region を復号化して
filenameに書き込みます。
start と end は buffer の位置です。
Content-Transfer-Encoding の list を返します。
service が指定されていると、それに対する
Content-Transfer-Encoding を返します。
補完のための Content-Transfer-Encoding の表を返します。
service が指定されている場合はそれに対する
Content-Transfer-Encoding の list を返します。
name を (nth 1 (car (last args))) backend の
method 関数として定義します。
args は lambda の引数 list と似ていますが、(car (last
args)) は指定された parameter である必要があります。(car
(car (last args))) は変数の名前で、(nth 1 (car (last
args))) は backend の名前 (encoding) です。
例:
spec の関数定義を function に設定します。
spec の最初の要素は service です。
args の残りは lambda の引数 list 似ていますが、(car (last
args)) は指定された parameter である必要があります。(car
(car (last args))) は変数の名前で、(nth 1 (car (last
args))) は backend の名前 (encoding) です。
例:
name を Content-Transfer-Encoding の service として定義しま
す。
args が指定されていると、name は service の
generic function として定義されます。
例:
encoded-word は header で非
また、行儀の悪いことだと言えますが、encoded-word を用いずに非
FLIM はこれらを符号化・復号化する機能を提供します。
Header 中の encoded-word を復号する。
もし code-conversion が
もし separator が
Header を network 表現に符号化する。
各 field は
Field を符号化する方法を指定する連想 list。各 element は (FIELD
. METHOD) の様になっている。
METHOD が
METHOD が
METHOD が MIME charset であれば、FIELD はネットワークコードに変換しな
ければならないときに charset に符号化される。
そうでなければ、FIELD はネットワークコードに変換しなければならないとき
に 変数
MIME 関連機能に関する group.
ここでは 0 から 127 の整数を指す。
0 から 127 の整数の列で表現できるような data を ``7bit の data'' と呼
ぶ。
また、0 から 31 および 127 で表現される制御文字と 32 で表現される空白
と 33 から 126 で表現される図形文字からなる文字列のことを ``7bit の文
字列'' と呼ぶ(これは
伝統的な Internet の
しかし、7bit であればどんな data でも良いとはいえない。なぜなら、1行
の長さがあまりに長いと、MTA はその message を転送することができないか
らである。ちなみに、
ここでは 0 から 255 の整数を指す。
0 から 255 の整数の列で表現できるような data を ``8bit の data'' と呼
ぶ。
また、0 から 31, 127 および 128 から 159 で表現される制御文字と 32 で
表現される空白と 33 から 126 と 160 から 255 で表現される図形文字から
なる文字列のことを ``8bit の文字列'' と呼ぶ(これは
伝統的な Internet の
しかし、最近では 8bit の文字列をそのまま通すことができる MTA も登場し
てきたので、そのまま送ることができる場合も増えてきた。
しかし、8bit であればどんな data でも良いとはいえない。なぜなら、1行
の長さがあまりに長いと、MTA はその message を転送することができないか
らである。ちなみに、
また、こうした理由から、1行が 999 byte 以上の行が存在する可能性のある
data は
ちなみに、7bit で表現できる data は 8bit でも表現できる。よって、
``8bit'' と言った場合、1行が 998 byte 以下の任意の data を指すことが
ある。
アメリカ連邦で使われる文字を符号化した
『64 進数』という意味で、3 byte の data を 0 から 63 の数を表す
この 65 種類の文字は ASCII と EBCDIC の共通部分から選ばれており、
Internet 以外の network を経由する場合でも安全に転送できるように設計さ
れている。
任意の byte 列を
また、行の構造があっても、999 byte 以上からなる行がある場合も binary
と呼ぶことにする。
ちなみに、
文字と byte 列と1対1に対応付ける曖昧でない規則の集合。
primary-type は標準では
ここでは、text/plain などの type/subtype の組をしばしば
media-type は、RFC 2046 で定義されているものに加えて、登録することもで
きる。現在、登録されているものは MEDIA
TYPES で参照できる。
また、type もしくは subtype に、前に `x-' を付けた
ここでは mail と news 記事の総称として用いる。
RFC 2045 は冒頭で次のように述べている:
STD 11, RFC 822 は、US-ASCII message header に関して非常に詳細に規定し
た message 表現 protocol を定義している。しかし、それは単に flat な
US-ASCII text のみに留まり、message の内容や message body に関する規定
はなされていない。Multipurpose Internet Mail Extensions, あるいは MIME
と総称される、この一連の文書は、以下の事を可能とするために message の
形式を再定義した:
iso-2022-jp や euc-kr はその1つ。
`=' や制御文字や 128 以上の文字などは `=AF' のように `=' の後に続く 16
進数で表現する。このため、
しかしながら、EBCDIC には存在しない文字を利用する場合、EBCDIC を利用し
ている network では安全に転送することができず、Base64 に比べて安全性は
低い。
Internet mail の主に
news message もこれに準じているので、
USENET での message の形式を定めた RFC.
書体や組版に関する情報を持たない文字符号
のみで表現される text 情報。
アメリカ連邦などで使われる英語などを表現するための
Internet message における標準の符号化文
字集合であり、明示的に MIME charset が示されない場合は原則として
また、
FLIM のバグを見つけたら、以下の address に mail を送ってください:
但し、あまりにも古い版に関する報告は歓迎されません。古い版の bug は、
新しい版では治っているかもしれません。まず、最新版で確認してみましょう。
それから、適切な報告をしましょう。単に「うまく動かない」と言われてもど
ういう状況なのかはさっぱり判りません。最低限、OS, emacs, APEL, FLIM,
SEMI, 使っている MUA の種類および版、設定を書く必要があります。また、
error が起っている場合は backtrace を送ることも重要です。
また、bug は大抵複数の人が遭遇するものです(そうでなければ、bug ではな
い可能性があります)。だから、作者に直接 mail を送ると作者は同じ mail
を何通も書く羽目になります。だから、必ず bug 報告は上記の address に送っ
てください。
EMACS-MIME ML では FLIM のバグ情報の交換や最新版の配布、FLIM の改良に
関する議論を行なっています。EMACS-MIME ML に参加したい方は
FLIM の file は CVS を使って管理されています。このため、以下の方法で最
新の FLIM を入手することができます:
CVS を用いた開発に参加したい方は
どうしても ssh が使えない場合、pserver 経由でも開発に参加できます。
この場合、UNIX の /etc/passwd 様式で暗号化されたパスワードを送って下さい。
この場合 cvsroot は :pserver:<アカウント名>@cvs.m17n.org:/cvs/root となります。
FLIM の code の最古の部分は 榎並 嗣智 氏が書いた
その後、守岡 知彦 は
この頃、守岡 知彦 は
守岡 知彦 はやがて、MIME message を閲覧するためのプログラムである
また、後に、守岡 知彦 によって uuencode 用の
tm では後に、守岡 知彦 によって
後に、守岡 知彦 らによって tm の全面書き換え作業が行われ、この過程で、
tm は APEL, MEL, SEMI, EMH, RMAIL-MIME, Gnus-MIME などに分けられました。
このうちの MEL が FLIM の直接の先祖に当たります。
後に、APEL から
この直前から田中 哲 氏がより RFC に忠実な実装を書き始め、これは、現在、
FLIM の枝である ``FLIM-FLAM'' となっています。
Message と Entity
Entity の生成
mime-message-structure
に格納する。
Entity 階層
(1 2 3)
のような整数のリストとして表現されます。
(3 2 1)
です。
mime-message-structure
に格納することにします。
mime-message-structure
を起点に entity-number や node-id
で示される entity を取り出すことができます。
nil
を返す。
Entity の検索
mime-message-structrue
が使われます。
mime-message-structure
が使われます。
mime-message-structure
が使われます。
Entity の属性
"7bit"
を用いる。
Entity header の情報
mime-message-structure
の値を用いる。
nil
を返す。
mime-message-structure
の値を用いる。
Entity の文字表現
default-mime-charset
として解釈される。
default-mime-charset
が初期値として使われます。
Entity の内容
Entity のネットワーク表現
Entity の buffer による表現
Entity の表現と実現
mm
という
接頭辞を付けた関数名からなる module で、その module 名は同様に
representation-type の名前の先頭に mm
を付けたものになって
います。この module は representation-type の entity が最初に生成される
時に自動的に require されます。
Entity への便り
mm-backend の作り方
Content-Type 欄の情報
Content-Type 欄の形式
``Content-Type'' ``:''
mime-content-type 構造体
mime-content-type-要素名
という名
前の参照関数を用いる。
Content-Type 欄の解析器
Content-Type に関する有用な関数
Content-Disposition 欄の情報
mime-content-disposition 構造体
mime-content-disposition-要素名
と
いう名前の参照関数を用いる。
Content-Disposition 欄の解析器
符号化法
Content-Transfer-Encoding 欄の解析器
符号化・復号化
他の utility
符号化/復号化 module の書き方
符号化/復号化 service を追加する方法
Header の network 表現
Header の符号化・復号化
nil
なら、encoded-word
だけが復号される。もし、code-conversion が default-mime-charset
. として復号される。nil
でなければ、その値が
header separator として用いられる。
mime-field-encoding-method-alist
で指定され
た方式で符号化される。
mime
であれば、FIELD は MIME format に符号化さ
れる (encoded-word)。
nil
であれば、FIELD は符号化されない。
default-mime-charset
で符号化される
一般設定
mail
と news
に属する。
付録
用語
7bit
8bit
ASCII
Base64
binary
Coded character set(符号化文字集合), Character code(文字符号)
media-type
message
MIME
MIME charset
MTA
MUA
Quoted-Printable
RFC 822
RFC 1036
RFC 2045
RFC 2046
RFC 2048
RFC 2049
plain text
us-ascii
bug 報告の仕方
CVS による開発
歴史
概念索引
関数索引
変数索引