FLIM 1.12 MIME 機能説明書

FLIM 1.12 MIME 機能説明書
********************

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 って何？
*********

FLIM は Internet Message の表現や符号化に関する基礎的な機能を提供するための library です。

FLIM の MIME 機能の使い方
******************

FLIM の提供する MIME 機能を使うためには

     (require 'mime)

を評価してください。

Message と Entity
****************

RFC 2045 (RFC 2045) によれば、「Entity という語は、message, もしくは、multipart entity の body 中の１つの部分の、MIME で定義された header field と内容を指す」となっています。ここでは、MIME で定義された header field 以外の全ての header と body を指す語として entityを用いることにします。

RFC 2045 の定義は、MIME message が entity を節とする木構造であることを示しています。つまり、MIME は message を木構造に拡張した訳です。

FLIM は entity の情報を表現するためにmime-entity 構造体を用います。以下では単に mime-entity と呼ぶことにします。

Entity の生成
==========

 -- Function: mime-open-entity type location

     Entity を開いて、それを返します。

     TYPE は representation-type です。(cf. mm-backend)

     LOCATION は entity の位置です。指定方法は representation-type に依って変わります。

 -- Function: mime-parse-buffer &optional buffer type

     BUFFER を message として構文解析し、その結果の mime-entity を BUFFER のmime-message-structure に格納する。

     BUFFER が省略された場合、現在の buffer を構文解析する。

     TYPE が指定された場合、その値を生成される mime-entity の表象型として用いる。省略された場合は BUFFER となる。(cf. mm-backend)

Entity 階層
=========

MIME message は entity を単位とする木構造になっています。

この木において根となる節は message 全体を表す entity です。ここでは、これを root-entity もしくはmessage と呼びます。

root-entity 以外の entity は親を持ちます。また、entity は子供を持つかも知れません。この親子関係を考えることで entity の相対関係を扱うことができます。

一方、entity の message における位置を考えることもできます。

entity はこの木における節となりますが、この木には深さと同じ深さの中の順番に従って番号が付けることができます。即ち、

                                   ┌───┐
                                   │  nil │
                                   └─┬─┘
                   ┌─────────┼─────────┐
                 ┌┴┐              ┌┴┐              ┌┴┐
                 │０│              │１│              │２│
                 └┬┘              └┬┘              └┬┘
                   │        ┌────┼────┐        │
               ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐
               │ ０.０││ １.０││ １.１││ １.２││ ２.０│
               └───┘└───┘└───┘└───┘└───┘

のように深さ n の節には長さ n の整数列の節番号が振れます。これを entity-number と呼びます。entity-number は S 式としては (1 2 3) のような整数のリストとして表現されます。

mime-entity では、これと同様の node-id を用います。node-id はちょうど entity-number を逆にしたリストで、entity-number 1.2.3 に対応する node-id は (3 2 1) です。

前述のように、MIME message は entity を単位とした木構造になっているので、この根である message 全体も mime-entity で表現することができ、buffer local 変数 mime-message-structure に格納することにします。

mime-message-structure を起点に entity-number や node-id で示される entity を取り出すことができます。

 -- Variable: mime-message-structure

     現在の buffer における message 全体の mime-entity 構造体を格納するbuffer local 変数。

 -- Function: mime-entity-children entity

     ENTITY に含まれる entity の list を返す。

 -- Function: mime-entity-parent entity &optional message

     ENTITY の親の entity を返す。

     MESSAGE が指定された場合、これを根と見倣す。

 -- Function: mime-root-entity-p entity

     ENTITY が根（即ち、message 全体）である場合に、非-nil を返す。

 -- Function: mime-entity-node-id entity

     ENTITY の node-id を返す。

 -- Function: mime-entity-number entity

     ENTITY の entity-number を返す。

Entity の検索
==========

 -- Function: mime-find-entity-from-number entity-number &optional message

     MESSAGE から、ENITY-NUMBER の entity を返します。

     MESSAGE が指定されていない場合は、 mime-message-structrue が使われます。

 -- Function: mime-find-entity-from-node-id entity-node-id &optional message

     MESSAGE から、ENTITY-NODE-ID の entity を返します。

     MESSAGE が指定されていない場合は、 mime-message-structure が使われます。

 -- Function: mime-find-entity-from-content-id cid &optional message

     MESSAGE から、CID の entity を返します。

     MESSAGE が指定されていない場合は、 mime-message-structure が使われます。

Entity の属性
==========

 -- Function: mime-entity-content-type entity

     ENTITY の content-type を返す。(cf. mime-content-type)

 -- Function: mime-entity-content-disposition entity

     ENTITY の content-disposition を返す。 (cf. mime-content-disposition)

 -- Function: mime-entity-filename entity

     ENTITY の file 名を返す。

 -- Function: mime-entity-encoding entity &optional default-encoding

     ENTITY の content-transfer-encoding を返す。 (cf. Content-Transfer-Encoding)

     もし、ENTITY に Content-Transfer-Encoding 欄が存在しない場合は、 DEFAULT-ENCODING を返す。これが指定されない場合は、"7bit" を用いる。

 -- Function: mime-entity-cooked-p entity

     ENTITY の内容が既にコード変換されている場合は nil で無い値を返す。

Entity header の情報
=================

 -- Function: mime-fetch-field field-name &optional entity

     ENTITY の header 中の FIELD-NAME 欄の body を返す。

     結果の文字列は network 表現のままである。

     ENTITY が省略された場合は、mime-message-structure の値を用いる。

     FIELD-NAME 欄が存在しない場合は nil を返す。

 -- Function: mime-read-field field-name &optional entity

     ENTITY の header 中の FIELD-NAME 欄を構文解析した結果を返す。

     結果の形式は欄毎に異なる。非構造化欄の場合は文字列を返し、構造化欄の場合はその形式に従った list を返す。

     結果中の文字列は Emacs の内部表現に変換される。

     ENTITY が省略された場合は、mime-message-structure の値を用いる。

     FIELD-NAME 欄が存在しない場合は nil を返す。

Entity の文字表現
============

 -- Function: mime-insert-header entity &optional invisible-fields visible-fields

     現在位置に ENTITY の復号した header を挿入する。

     INVISIBLE-FIELDS と VISIBLE-FIELDS は正規表現のlist で、それぞれ、表示したくない field 名と表示したい欄名を表現したものである。

     INVISIBLE-FIELDS の要素のどれかに match し、かつ、 VISIBLE-FIELDS の要素のどれにも match しない欄は表示されない。

     encoded-word (encoded-word) は復号される。『生の非 us-ascii 文字』は default-mime-charset として解釈される。

 -- Function: mime-insert-text-content entity

     point の前に ENTITY を text entity として挿入します。

     ENTITY の内容は MIME charset として復号化されます。ENTITY の Content-Type field に charset paramter が無いと、default-mime-charset が初期値として使われます。

 -- Variable: default-mime-charset

     適切な MIME charset (MIME charset) が見つからなかった場合に用いられるMIME charset.

     本来は APEL の変数である。

Entity の内容
==========

 -- Function: mime-entity-content entity

     ENTITY の内容の byte 列を返す。

 -- Function: mime-insert-entity-content entity

     point の位置に ENTITY の内容を挿入します。

 -- Function: mime-write-entity-content entity filename

     ENTITY の内容を FILENAME に書き込みます。

Entity のネットワーク表現
================

 -- Function: mime-insert-entity entity

     ENTITY の header と body を point のところに挿入します。

 -- Function: mime-write-entity entity filename

     ENTITY の表現を FILENAME に書き込みます。

 -- Function: mime-write-entity-body entity filename

     ENTITY の body を FILENAME に書き込みます。

Entity の buffer による表現
=====================

 -- Function: mime-entity-buffer entity

     ENTITY が存在する buffer を返す。

 -- Function: mime-entity-point-min entity

     ENTITY が存在する buffer における、ENTITY が占める領域の先頭位置を返す。

 -- Function: mime-entity-point-max entity

     ENTITY が存在する buffer における、ENTITY が占める領域の末尾位置を返す。

 -- Function: mime-entity-header-start entity

     ENTITY が存在する buffer における、header が占める領域の先頭位置を返す。

 -- Function: mime-entity-header-end entity

     ENTITY が存在する buffer における、header が占める領域の末尾位置を返す。

 -- Function: mime-entity-body-start entity

     ENTITY が存在する buffer における、body が占める領域の先頭位置を返す。

 -- Function: mime-entity-body-end entity

     ENTITY が存在する buffer における、body が占める領域の末尾位置を返す。

Entity の表現と実現
=============

Entity は抽象化されたデータ表現で、実際のデータ表現としては用途に応じてさまざまなものが利用できるように設計されています。

ここで、entity がどういう種類の表現を行っているかを示すのが representation-type で、entity を生成する時にはこれを指定します。 (cf. Entity Creation)

前節までに述べて来た entity に対する処理は、entity に対してその処理を依頼することによって実現されています。Entity は自分の representation-type を知っており、その representation-type に応じて実際の処理を行う関数を呼び出します。このような関数を entity 処理method と呼びます。また、 representation-type 毎にこのような関数をまとめたものを mm-backend と呼びます。

mm-backend は representation-type の名前の先頭に mm という接頭辞を付けた関数名からなる module で、その module 名は同様に representation-type の名前の先頭に mm を付けたものになっています。この module は representation-type の entity が最初に生成される時に自動的に require されます。

Entity への便り
-----------

 -- Function: mime-entity-send entity message &rest args

     ENTITY に MESSAGE を送る。

     ARGS は MESSAGE の引数である。

mm-backend の作り方
---------------

 -- Macro: mm-define-backend type &optional parents

     TYPE を mm-backend として定義します。

     PARENTS が指定されている場合は、TYPE は prents を継承します。それぞれの parent は representation-type である必要があります。

     例:

          (mm-define-backend chao (generic))

 -- Macro: mm-define-method name args &rest body

     NAME を (nth 1 (car ARGS)) backend の method 関数として定義します。

     ARGS は lambda の引数リストのようなものですが、(car ARGS) は指定された parameter である必要があります。(car (car ARGS)) は変数の名前で、(nth 1 (car ARGS)) は backend の名前 (representation-type) です。

     例:

          (mm-define-method entity-cooked-p ((entity chao)) nil)

Content-Type 欄の情報
*****************

Content-Type 欄 は media-type (media-type) や MIME charset といった entity (entity) の内容の種類や表現形式などを記述するためのもので、RFC 2045 (RFC 2045) で定義されています。

[Memo]

     歴史的には RFC 1049 で Content-Type 欄が提案されている。但し、MIME の media-type のような type と subtype の区別はなく、MIME charset のような文字符号の種類を表現することもできない。

FLIM は Content-Type 欄を構文解析する関数と Content-Type 欄の解析結果を格納する構造体 mime-content-type を提供します。

Content-Type 欄の形式
=================

Content-Type 欄の形式は以下のように定義されています：

     ``Content-Type'' ``:'' type ``/'' subtype *( ``;'' parameter )

例えば、

          Content-Type: image/jpeg

や

          Content-Type: text/plain; charset=iso-2022-jp

などのように用いられます。

ここで、`type' と `subtype' は entity の形式を示すもので、両者を総称して、`media-type' と呼ぶことにします。上記の例における `image/jpeg' や `text/plain' は media-type の１つです。

[Memo]

     Content-Type 欄のない entity は

               Content-Type: text/plain; charset=us-ascii

     として解釈される。(cf. us-ascii)

mime-content-type 構造体
=====================

Structure mime-content-type

Content-Type 欄の情報を格納するための構造体。

この構造体を参照するには mime-content-type-要素名 という名前の参照関数を用いる。

この構造体の要素は以下の通りである：

primary-type
     media-type の主型 (symbol).

subtype
     media-type の副型 (symbol).

parameters
     Content-Type 欄の parameter (連想 list).

 -- Function: make-mime-content-type type subtype
     &optional  parameters

     content-type の生成子。

 -- Function: mime-content-type-parameter content-type parameter

     CONTENT-TYPE の PARAMETER の値を返す。

Content-Type 欄の解析器
==================

 -- Function: mime-parse-Content-Type string

     STRING を content-type として解析した結果を返す。

 -- Function: mime-read-Content-Type

     現在の buffer の Content-Type 欄を読み取り、解析した結果を返す。

     Content-Type 欄が存在しない場合は nil を返す。

Content-Type に関する有用な関数
======================

 -- Function: mime-type/subtype-string type &optional subtype

     TYPE と SUBTYPE から type/subtype 形式の文字列を返す。

Content-Disposition 欄の情報
************************

Content-Disposition 欄 は entity の表示や file 名などの属性になどに関する情報を記述するためのものです。

[RFC 2183]

     S. Dorner, K. Moore and R. Troost, ``Communicating Presentation Information in Internet Messages: The Content-Disposition Header'', August 1997, Standards Track.

FLIM は Content-Disposition 欄を構文解析する関数と Content-Disposition 欄の解析結果を格納する構造体 mime-content-disposition を提供します。

mime-content-disposition 構造体
============================

Structure mime-content-disposition

Content-Disposition 欄の解析結果を収めるための構造体。

この構造体を参照するには mime-content-disposition-要素名 という名前の参照関数を用いる。

この構造体の要素は以下の通りである：

disposition-type
     disposition-type (symbol).

parameters
     Content-Disposition 欄の parameter (連想 list).

 -- Function: mime-content-disposition-parameter content-disposition parameter

     CONTENT-DISPOSITION の PARAMETER の値を返す。

 -- Function: mime-content-disposition-filename content-disposition

     CONTENT-DISPOSITION の filename の値を返す。

Content-Disposition 欄の解析器
=========================

 -- Function: mime-parse-Content-Disposition string

     STRING を content-disposition として解析した結果を返す。

 -- Function: mime-read-Content-Disposition

     現在の buffer の Content-Disposition 欄を読み取り、解析した結果を返す。

     Content-Disposition 欄が存在しない場合は nil を返す。

符号化法
****

Content-Transfer-Encoding 欄 は entity の符号化法を記述するためのものです。

FLIM では Content-Transfer-Encoding 欄を構文解析する関数を提供します。これらの関数は Content-Transfer-Encoding 欄の情報は文字列で表現します。

また、Content-Transfer-Encoding に基づいて符号化・復号化を行う関数も提供されます。

Content-Transfer-Encoding 欄の解析器
===============================

 -- Function: mime-parse-Content-Transfer-Encoding string

     STRING を content-transfer-encoding として解析した結果を返す。

 -- Function: mime-read-Content-Transfer-Encoding &optional default-encoding

     現在の buffer の Content-Transfer-Encoding 欄を読み取り、解析した結果を返す。

     Content-Transfer-Encoding 欄が存在しない場合はDEFAULT-ENCODING を返す。

符号化・復号化
=======

 -- Function: mime-encode-region start end encoding

     現在の buffer の START から END までの region を ENCODING を使って符号化します。

 -- Function: mime-decode-region start end encoding

     現在の buffer の START から END までの region を ENCODING を使って復号化します。

 -- Function: mime-decode-string string encoding

     STRING を ENCODING として復号した結果を返す。

 -- Function: mime-insert-encoded-file filename encoding

     ENCODING format で符号化された file FILENAME を挿入する。

 -- Function: mime-write-decoded-region start end filename encoding

     ENCODING で符号化された現在の region を復号化して FILENAMEに書き込みます。

     <var>start<var> と END は buffer の位置です。

Other utilities
===============

 -- Function: mime-encoding-list &optional SERVICE

     Content-Transfer-Encoding の list を返します。

     SERVICE が指定されていると、それに対する Content-Transfer-Encoding を返します。

 -- Function: mime-encoding-alist &optional SERVICE

     補完のための Content-Transfer-Encoding の表を返します。

     SERVICE が指定されている場合はそれに対する Content-Transfer-Encoding の list を返します。

How to write encoder/decoder module
===================================

 -- Macro: mel-define-method name args &rest body

     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) です。

     例:

          (mel-define-method mime-write-decoded-region (start end filename
          						    (nil "base64"))
            "Decode and write current region encoded by base64 into FILENAME.
          START and END are buffer positions."
            (interactive
             (list (region-beginning) (region-end)
          	 (read-file-name "Write decoded region to file: ")))
            (let ((str (buffer-substring start end)))
              (with-temp-buffer
                (insert (decode-base64-string str))
                (write-region-as-binary (point-min) (point-max) filename)
                )))

 -- Macro: mel-define-method-function spec function

     SPEC の関数定義を FUNCTION に設定します。

     SPEC の最初の要素は service です。

     ARGS の残りは lambda の引数 list 似ていますが、(car (last ARGS)) は指定された parameter である必要があります。(car (car (last ARGS))) は変数の名前で、(nth 1 (car (last ARGS))) は backend の名前 (encoding) です。

     例:

          (mel-define-method-function (mime-encode-string string (nil "base64"))
          			    'encode-base64-string)

符号化/復号化 service を追加する方法
=======================

 -- Macro: mel-define-service name &optional args doc-string

     NAME を Content-Transfer-Encoding の service として定義します。

     ARGS が指定されていると、NAME は service の generic function として定義されます。

     例:

          (mel-define-service encoded-text-encode-string (string encoding)
            "Encode STRING as encoded-text using ENCODING.
          ENCODING must be string.")

Header の network 表現
*******************

encoded-word は header で非 ASCII (ASCII) 文字を表現するための形式で、RFC 2047 で定義されています。

[RFC 2047]

     K. Moore, ``MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text'', November 1996, Standards Track (obsolete RFC 1521,1522,1590).

また、行儀の悪いことだと言えますが、encoded-word を用いずに非 ASCII (ASCII) 文字を header に入れた記事も存在します。

FLIM はこれらを符号化・復号化する機能を提供します。

Header の符号化・復号化
===============

 -- Function: eword-decode-header &optional code-conversion separator

     Header 中の encoded-word を復号する。

     もし CODE-CONVERSION が nil なら、encoded-word だけが復号される。もし、CODE-CONVERSION が MIME charset (MIME charset) なら、非 ASCII bit patterns はその MIME charset として復号される。これ以外の場合、非 ASCII bit patterns はdefault-mime-charset. として復号される。(cf. entity formatting)

     もし SEPARATOR が nil でなければ、その値がheader separator として用いられる。

 -- Function: eword-encode-header &optional code-conversion

     Header を network 表現に符号化する。

     各 field は eword-field-encoding-method-alist で指定された方式で符号化される。

 -- Variable: eword-field-encoding-method-alist

     Field を符号化する方法を指定する連想 list。各 element は (FIELD . METHOD) の様になっている。

     METHOD が mime であれば、FIELD は MIME format に符号化される (encoded-word)。

     METHOD が nil であれば、FIELD は符号化されない。

     METHOD が MIME charset であれば、FIELD はネットワークコードに変換しなければならないときに charset に符号化される。

     そうでなければ、FIELD はネットワークコードに変換しなければならないときに 変数 default-mime-charset で符号化される

一般設定
****

group mime

MIME 関連機能に関する group.

mail と news に属する。

 -- Variable: mime-temp-directory

     MIME 機能に関する実装が一時的に使用する file を作成する directory.

     環境変数 MIME_TMP_DIR, TM_TMP_DIR, TMPDIR, TMP もしくは TEMP が設定されていた場合、それを初期値として用いる。何も設定されていない場合、"/tmp/" を用いる。

付録
**

用語
==

7bit
----

ここでは 0 から 127 の整数を指す。

0 から 127 の整数の列で表現できるような data を ``7bit の data'' と呼ぶ。

また、0 から 31 および 127 で表現される制御文字と 32 で表現される空白と 33 から 126 で表現される図形文字からなる文字列のことを ``7bit の文字列'' と呼ぶ（これは ISO 2022 (ISO 2022) の「7 単位系」と同様）。

伝統的な Internet の MTA (MTA) は 7bit の data を転送できるので、 7bit の data は Quoted-Printable (Quoted-Printable) や Base64 (Base64) といった変換を行わなくてもそのまま転送できる。

しかし、7bit であればどんな data でも良いとはいえない。なぜなら、１行の長さがあまりに長いと、MTA はその message を転送することができないからである。ちなみに、RFC 821 (RFC 821) は１行は改行文字を除いて 998 byte 以内であることを求めている。よって、これ以上の行が含まれる可能性のある data, 例えば、Postscript の data などは Quoted-Printable 等で encodeする必用がある。

8bit
----

ここでは 0 から 255 の整数を指す。

0 から 255 の整数の列で表現できるような data を ``8bit の data'' と呼ぶ。

また、0 から 31, 127 および 128 から 159 で表現される制御文字と 32 で表現される空白と 33 から 126 と 160 から 255 で表現される図形文字からなる文字列のことを ``8bit の文字列'' と呼ぶ（これは ISO 2022 (ISO 2022) の「8 単位系」と同様）。

iso-8859-1 (iso-8859-1) や euc-kr (euc-kr) といった符号化文字集合は 8bit の文字列である。

伝統的な Internet の MTA (MTA) は 7bit (7bit) の data しか転送できないので、そうした MTA を経由する場合、Quoted-Printable (Quoted-Printable) や Base64 (Base64) といった変換を行わなくてはならない。

しかし、最近では 8bit の文字列をそのまま通すことができる MTA も登場してきたので、そのまま送ることができる場合も増えてきた。

しかし、8bit であればどんな data でも良いとはいえない。なぜなら、１行の長さがあまりに長いと、MTA はその message を転送することができないからである。ちなみに、RFC 821 (RFC 821) は１行は改行文字を除いて 998 byte 以内であることを求めている。よって、これ以上の行が含まれる可能性のある data, 例えば、Postscript の data などは Quoted-Printable 等で encodeする必用がある。

また、こうした理由から、１行が 999 byte 以上の行が存在する可能性のある data は binary (binary) と呼ぶことにする。

ちなみに、7bit で表現できる data は 8bit でも表現できる。よって、 ``8bit'' と言った場合、１行が 998 byte 以下の任意の data を指すことがある。

ASCII
-----

アメリカ連邦で使われる文字を符号化した符号化文字集合 (符号化文字集 合)。A-Z, a-z の Latin 文字と数字、幾つかの記号からなる。ISO 646 の一つで、現在は国際基準版 (IRV) になっている。

[ASCII]

     ``Coded Character Set -- 7-Bit American Standard Code for Information Interchange'', ANSI X3.4:1986.

Base64
------

RFC 2045 (RFC 2045) で定義されている MIME (MIME) における binary data (binary) の network での変換法の１つ。

『64 進数』という意味で、3 byte の data を 0 から 63 の数を表す ASCII (ASCII) 4 文字に変換する方法。（もし、4 文字にならなければ pad と呼ばれる詰め物をして長さを調整する）

この 65 種類の文字は ASCII と EBCDIC の共通部分から選ばれており、 Internet 以外の network を経由する場合でも安全に転送できるように設計されている。

binary
------

任意の byte 列を binary と呼ぶ。

8bit (8bit) と異なるのは data に行の構造を仮定しないことである。

また、行の構造があっても、999 byte 以上からなる行がある場合も binary と呼ぶことにする。

ちなみに、7bit (7bit) や 8bit で表現できる data は binary でも表現できる。よって、binary data と言った場合、任意の data を指すことがある。

Coded character set（符号化文字集合）, Character code（文字符号）
--------------------------------------------------

文字と byte 列と１対１に対応付ける曖昧でない規則の集合。

media-type
----------

MIME (MIME) における entity (entity) の種類。 primary-type と subtype からなる。RFC 2046 (RFC 2046) で定義されている。

primary-type は標準では

  * text

  * image

  * audio

  * video

  * application

  * multipart (multipart)

  * message

が定義され、それぞれには application/octet-stream, audio/basic, image/jpeg, multipart/mixed (multipart/mixed), text/plain (text/plain), video/mpeg などのさまざまな subtype が定義されている。

[注意]

     ここでは、text/plain などの type/subtype の組をしばしば primary-type/subtype と書く。

media-type は、RFC 2046 で定義されているものに加えて、登録することもできる。現在、登録されているものは MEDIA TYPES (ftp://ftp.isi.edu/in-notes/iana/assignments/media-types) で参照できる。

また、type もしくは subtype に、前に `x-' を付けた x-token を用いることにより、登録されていないものを私的に用いることもできる。しかし、当然のことながら、こうした私的な media-type は諒解を得た者の間でしか解釈できないので利用には注意すること。

(cf. Content-Type)

message
-------

ここでは mail と news 記事の総称として用いる。

MIME
----

Multipurpose Internet Mail Extensions の略で、Internet の mail や news で us-ascii plain text (us-ascii) 以外の文字を使うための RFC 822 (RFC 822) に対する拡張。

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 の形式を再定義した：

 1. 文書 message body における US-ASCII 以外の文字集合

 2. 非文書 message body

 3. 複数の部分からなる message body

 4. US-ASCII 以外の文字集合からなる文書 header 情報

RFC 2045 (RFC 2045), RFC 2046 (RFC 2046), RFC 2047 (encoded-word), RFC 2048 (RFC 2048), RFC 2049 (RFC 2049) で定義されている。

MIME charset
------------

Content-Type (Content-Type) 欄や encoded-word (encoded-word) の charset parameter で用いられる登録された符号化文字集合(Coded character set)。

RFC 2045 (RFC 2045) で定義されている。

iso-2022-jp や euc-kr はその１つ。

MTA
---

Message Transfer Agent の略で、qmail や sendmail などの mail 配送 program と inn などの news server の総称。

(cf. MUA)

MUA
---

Message User Agent の略で、mail reader と news reader の総称。

(cf. MTA)

Quoted-Printable
----------------

RFC 2045 (RFC 2045) で定義されている MIME (MIME) における binary data (binary data) の network での変換法の１つ。

`=' や制御文字や 128 以上の文字などは `=AF' のように `=' の後に続く 16 進数で表現する。このため、ASCII (ASCII) 文字中心の data では Base64 (Base64) に比べると可読性が高くなる可能性がある。

しかしながら、EBCDIC には存在しない文字を利用する場合、EBCDIC を利用している network では安全に転送することができず、Base64 に比べて安全性は低い。

RFC 822
-------

Internet mail の主に message header に関する形式に関する標準を定めている RFC.

[Memo]

     news message もこれに準じているので、Internet mail と書くよりも、 Internet message と書いた方が良いかもしれない。

[RFC 822]

     D. Crocker, ``Standard for the Format of ARPA Internet Text Messages'', August 1982, STD 11.

RFC 1036
--------

USENET での message の形式を定めた RFC.  RFC 822 (RFC 822) の subset になっている。Internet の標準ではないが、USENET 以外の netnews でもこれに準じているものが多い。

[USENET: RFC 1036]

     M. Horton and R. Adams, ``Standard for Interchange of USENET Messages'', December 1987, (obsolete RFC 850).

RFC 2045
--------

[RFC 2045]

     N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies'', November 1996, Standards Track (obsolete RFC 1521, 1522, 1590).

RFC 2046
--------

[RFC 2046]

     N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types'', November 1996, Standards Track (obsolete RFC 1521, 1522, 1590).

RFC 2048
--------

[RFC 2048]

     N. Freed, J. Klensin and J. Postel, ``Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures'', November 1996, Standards Track (obsolete RFC 1521, 1522, 1590).

RFC 2049
--------

[RFC 2049]

     N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples'', November 1996, Standards Track (obsolete RFC 1521, 1522, 1590).

plain text
----------

書体や組版に関する情報を持たない文字符号(Coded character set)のみで表現される text 情報。(cf. text/plain)

us-ascii
--------

アメリカ連邦などで使われる英語などを表現するための MIME charset (MIME charset) の１つ。

ASCII (ASCII) のみからなり ISO 2022 による符号拡張は許されない。

Internet message における標準の符号化文字集合(Coded character set) であり、明示的に MIME charset が示されない場合は原則として us-ascii が使われる。

また、RFC 822 (RFC 822) における ASCII は us-ascii である。

bug 報告の仕方
=========

FLIM のバグを見つけたら、以下の address に mail を送ってください：

  * 英語 <emacs-mime-en@m17n.org>

  * 日本語 <emacs-mime-ja@m17n.org>

但し、あまりにも古い版に関する報告は歓迎されません。古い版の bug は、新しい版では治っているかもしれません。まず、最新版で確認してみましょう。

それから、適切な報告をしましょう。単に「うまく動かない」と言われてもどういう状況なのかはさっぱり判りません。最低限、OS, emacs, APEL, FLIM, SEMI, 使っている MUA の種類および版、設定を書く必要があります。また、error が起っている場合は backtrace を送ることも重要です。(cf. (emacs)Bugs)

また、bug は大抵複数の人が遭遇するものです（そうでなければ、bug ではない可能性があります）。だから、作者に直接 mail を送ると作者は同じ mail を何通も書く羽目になります。だから、必ず bug 報告は上記の address に送ってください。

EMACS-MIME ML では FLIM のバグ情報の交換や最新版の配布、FLIM の改良に関する議論を行なっています。EMACS-MIME ML に参加したい方は

  * 英語 <emacs-mime-en-ctl@m17n.org>

  * 日本語 <emacs-mime-ja-ctl@m17n.org>

に空の mail を送って下さい。

CVS による開発
=========

FLIM の file は CVS を使って管理されています。このため、以下の方法で最新の FLIM を入手することができます：

     (0) cvs login

         % cvs -d :pserver:anonymous@chamonix.jaist.ac.jp:/hare/cvs/root \
     	login

         CVS password: [CR] # NULL string

     (1) checkout

         % cvs -d :pserver:anonymous@chamonix.jaist.ac.jp:/hare/cvs/root \
     	checkout [-r TAG] flim

CVS を用いた開発に参加したい方は

  * <cvs@chamonix.jaist.ac.jp>

まで、account 名と UNIX の passwd と同じ形式の crypt 化された password を沿えて御連絡ください。

歴史
==

FLIM の code の最古の部分は 榎並 嗣智 氏が書いた mime.el に起源します。この小さな program は Nemacs で動作する iso-2022-jp の B-encoding 専用の encoded-word の復号化プログラムでした。

その後、守岡 知彦 は mime.el を元にtiny-mime.el というプログラムを書きます。これは、Nemacs と Mule で動作する encoded-word の符号化・復号化プログラムでした。tiny-mime.el は B-encoding だけでなく Q-encoding もsupport し、また、MULE で扱うことができるさまざまな MIME charset (MIME charset) を同時に使うことができました。この時、 Nemacs と Mule の双方を support するために用いられたテクニックは後に emu package にまとめられます。

この頃、守岡 知彦 は tiny-mime.el をさまざまな MUA で使うための設定集も配布していましたが、それらは後にtiny-mime.el とともに１つの package にまとめられ、tm という名前で配布されます。

守岡 知彦 はやがて、MIME message を閲覧するためのプログラムである tm-body.el を書きます。これは、すぐにtm-view.el という名前に変わりましたが、やがて、これがtiny-mime.el に代わって、tm の中核となります。

tm-view.el は当然、Content-Transfer-Encoding を扱う必要があります。この目的のために、MEL が整備されはじめました。Base64 に関しては tiny-mime.el の code が移され、また、新たにQuoted-Printable の code が追加されました。これらがmel-b.el と mel-q.el になりました。

また、後に、守岡 知彦 によって uuencode 用の mel-u.el が追加され、その後に、小林 修平 氏によって x-gzip64 用のmel-g.el が追加されました。

tm では後に、守岡 知彦 によって tiny-mime.el の再実装が行われ、この過程で、STD 11 の parser が書かれました。これは、現在の std11.el に当たります。また、この過程で tiny-mime.el は復号化を行う tm-ew-d.el と符号化を行う tm-ew-e.el に分けられました。この両者が現在の eword-decode.el と eword-encode.el の先祖に当たります。

後に、守岡 知彦 らによって tm の全面書き換え作業が行われ、この過程で、tm は APEL, MEL, SEMI, EMH, RMAIL-MIME, Gnus-MIME などに分けられました。このうちの MEL が FLIM の直接の先祖に当たります。

後に、APEL から std11.el が移され、また、mailcap.el, eword-decode.el および eword-encode.el が SEMI から移され、 package の名前が FLIM となります。

この直前から田中 哲 氏がより RFC に忠実な実装を書き始め、これは、現在、 FLIM の枝である ``FLIM-FLAM'' となっています。