[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
MIME メッセージの作成はうんざりする仕事だし簡単でもありません。 そこで、MML (MIME Meta Language) という言語を解析し て、MIME メッセージを生成するための、mml
というライブラ リーが作られました。
主要なインターフェース関数は mml-generate-mime
です。これは現在 の (狭められた) バッファーの内容物を調べて、MIME メッセージを 含む文字列を返します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
`multipart/alternative' の単純な例です:
<#multipart type=alternative> This is a plain text part. これはプレーンテキストのパートです。 <#part type=text/enriched> |
これを mml-generate-mime
に通すと、次のものが得られます:
Content-Type: multipart/alternative; boundary="=-=-=" --=-=-= Content-Type: text/plain; charset=iso-2022-jp This is a plain text part. これはプレーンテキストのパートです。 --=-=-= Content-Type: text/enriched; charset=iso-2022-jp |
(実際には、日本語の部分は `charset=iso-2022-jp' でエンコードされた ものになります。)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
MML 言語はとても単純です。SGML アプリケーションに少し似ていま すが、異なるものです。
MML の主要な概念は「パート」です。それぞれのパートを異なるタイ プにしたり、異なる文字セットを使うことができます。パート は `<#part ...>' タグで記述します。マルチパート型のパート は `<#multipart ...>' タグで始めます。それぞれのパート は `<#/part>' タグか `<#/multipart>' タグで終端しますが、(それ らが無くても) `<#part ...>' で始まったタグは次のパートの始まりによっ ても閉じられます。
`<#external ...>' タグというものもあります。これ は `external/message-body' 型のパートを記述するために使われます。
それぞれのタグは「parameter=値」の形式で、一つ以上のパラメーターを含むこ とができます (もちろん無いこともあります)。値をクォーテーションマー ク ("...") で囲むことができますが、値が空白文字を含む場合以外は囲む必要 がありません。したがって、`filename=/home/user/#hello$^yes' は完全 に有効です。
以下のパラメーターは MML で使われるものです。意味を持たないパ ラメーターは無視されます。MML パラメーターの名前 は MIME パラメーターの名前と同じで、括弧の中に付記してあるのは、 それが使われるヘッダーです。
Content-Type
)。
Content-Disposition
)。
Content-Type
)。See 節 2.5 文字セットの変換.
Content-Type
)。
Content-Disposition
)。
Content-Transfer-Encoding
)。See 節 2.5 文字セットの変換.
Content-Description
)。
Content-Disposition
)。
Content-Disposition
)。
Content-Disposition
)。
Content-Disposition
)。
smime
, pgp
ま たは pgpmime
) で署名するかを指定します。
smime
, pgp
ま たは pgpmime
) で暗号化するかを指定します。以下は `text/plain' のためのパラメーターです:
以下は `application/octet-stream' のためのパラメーターです:
Content-Type
)。これは人間が読むことを想定した、 非公式なものです。以下は `message/external-body' のためのパラメーターです:
Content-Type
.)
Content-Type
.)
Content-Type
.)
Content-Type
)。以下は `sign=smime' のためのパラメーターです:
以下は `encrypt=smime' のためのパラメーターです:
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
複雑なマルチパート・メッセージの例です。これは `multipart/mixed' で す。多数のパートを含んでいて、その一つは `multipart/alternative' で す。
<#multipart type=mixed> <#part type=image/jpeg filename=~/rms.jpg disposition=inline> <#multipart type=alternative> This is a plain text part. これはプレーンテキストのパートです。 <#part type=text/enriched name=enriched.txt> |
そして、これが結果の MIME メッセージです:
Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: image/jpeg Content-Disposition: inline; filename=rms.jpg Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m 2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw 5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw 34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn 7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q== --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=iso-2022-jp This is a plain text part. これはプレーンテキストのパートです。 --==-=-= Content-Type: text/enriched; charset=iso-2022-jp; name=enriched.txt |
(実際には、日本語の部分は `charset=iso-2022-jp' でエンコードされた ものになります。)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
mm-body-charset-encoding-alist
((iso-2022-jp . 7bit) (iso-2022-jp-2 . 7bit) (utf-16 . base64) (utf-16be . base64) (utf-16le . base64)) |
例えば ISO-8859-1 文字セットが quoted-printable でエンコードされないよう にしたい場合は、この変数に (iso-8859-1 . 8bit)
を追加すれば良いで しょう。MML の encoding
タグを使って、メッセージ毎にそ れで指定した値をこの変数より優先させることもできま す (see 節 2.2 MML の定義)。
mm-coding-system-priorities
nil
です (その場合は Emacs におけるディフォルトの優先順位 が適用されます) が、日本語環境で Emacs を実行する場合 は (iso-8859-1 iso-2022-jp iso-2022-jp-2 shift_jis utf-8)
になり ます。値は coding system のシンボルのリストです (coding system の別名を 使っても構いません。設定するときは M-x describe-coding-system を使っ て、coding system の名前が正確であることを確かめてください)。例え ば UTF-8 を最優先とするように Emacs を設定したものの、可能な場合 は ISO-8859-1 でメッセージを送信するようにしたいという場合だったら、こ の変数を (iso-8859-1)
にすれば良いでしょう。 MML の charset
タグを使って、メッセージ毎にそれで指定し た値をこの変数より優先させることもできます (see 節 2.2 MML の定義)。
訳注: 日本語環境とはcurrent-language-environment
変数の値 が `Japanese' になっている環境のことです。日本語のメッセージのエン コードには伝統的にiso-2022-jp
が使われているのに対し、Emacs で定 められた優先順位に基づくとeuc-jp
やshift_jis
などが第一 候補になってしまうので、この値がnil
ではよろしくないのです。なお、ラテン語圏の人たちに宛てて送るメッセージが、彼らがデコードできない かもしれない
iso-2022-jp-2
などでエンコードされてしまうのを防ぐた めに、ディフォルト値の先頭にiso-8859-1
が置かれています。
ニュースグループ階層ごとに優先するべき文字セットが異なるので、Gnus で は mm-coding-system-priorities
の値を階層によって切り替える必要が あるでしょう。そのための例です:
(add-to-list 'gnus-newsgroup-variables 'mm-coding-system-priorities) (setq gnus-parameters (nconc ;; Some charsets are just examples! '(("^cn\\." ;; Chinese (mm-coding-system-priorities '(iso-8859-1 cn-big5 chinese-iso-7bit utf-8))) ("^cz\\.\\|^pl\\." ;; Central and Eastern European (mm-coding-system-priorities '(iso-8859-2 utf-8))) ("^de\\." ;; German language (mm-coding-system-priorities '(iso-8859-1 iso-8859-15 utf-8))) ("^fr\\." ;; French (mm-coding-system-priorities '(iso-8859-15 iso-8859-1 utf-8))) ("^fj\\." ;; Japanese (mm-coding-system-priorities '(iso-8859-1 iso-2022-jp iso-2022-jp-2 shift_jis utf-8))) ("^ru\\." ;; Cyrillic (mm-coding-system-priorities '(koi8-r iso-8859-5 iso-8859-1 utf-8)))) gnus-parameters)) |
mm-content-transfer-encoding-defaults
qp-or-base64
を使うこともできます (訳 注: qp-or-base64
の実際の動作は、quoted-printable と base64 の両 方でエンコードしてみて、サイズが小さくなる方を採用することです)。
qp-or-base64
にはもう一つの効果があります。それ は MIME のパートが MTA によって壊されないようにするために、長 い行を折り畳みます。quoted-printable
と base64
もそうです。
パートが受信したときのままの生の転送されたメッセージ (例えば、引数 に 2 を与えた gnus-summary-mail-forward
によって作られるもの) で あるか、`text/*' タイプや `message/*' ではない場合に、これが本 文のエンコーディグに影響を及ぼすことに注意してください。それらの場合でさ え、MML の encoding
タグを使って、メッセージ毎にそ れで指定した値をこの変数より優先させることもできま す (see 節 2.2 MML の定義)。
mm-use-ultra-safe-encoding
nil
である場合、本文に 76 文字よりも長い行や "From " で 始まる行があったら、それらのテキストのパートは quoted-printable でエンコー ドされます。非-7bit エンコーディング (8bit, バイナリー) は一般に認められ ていません。この変数を nil
以外の値に設定しておくことは、8bit を 通さない MTA か MDA がメッセージを改変してしまう確率を下げます。これは直 接に設定されるのではなく、他の関数によって (例えば、電子署名されるメッセー ジをエンコードするときに) 必要に応じて束縛されるべきです。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
MML を MIME に変換するときに、Emacs の内部で作られ た MIME パートのそれぞれについて、適切な文字セットを選ばなけれ ばなりません。
MULE 機能が無い Emacs を走らせている場合だったら、この処理は単純で す。パートがどんな非-ASCII (8-bit) 文字を含んでいても、 mail-parse-charset
で与えられる MIME 文字セット (シンボ ル) を使えば良いのです。(もっとも、この変数を直接に設定しないでください。 ディフォルトの文字セットを変更したい場合は、MIME メッセージを 処理するために使うパッケージの説明書を調べてください。例えば: see 節 `いろいろなメッセージ変数' in
MULE 機能を備えた Emacs を走らせている場合は、ものごとは多少複雑に なります。この場合は、パートで使われている MULE 文字セットのリスト を取得し、Emacs 自身が提供するテーブルか、XEmacs のため の mm-mime-mule-charset-alist
変数の値に基づいて、それら の MULE 文字セットを MIME 文字セットに変換します。結果が 単一の MIME 文字セットだったら、それを使ってパートをエンコード します。しかし、結果の MIME 文字セットのリストが二つ以上の要素 を含んでいる場合には、二つのことが起こり得ます。もしパートを UTF-8 でエ ンコードすることが可能だったら、その文字セットを使います。(このため に Emacs は utf-8
coding system をサポートしていなければなりませ ん。また、そのパートを構成するすべての文字に対応するものが、Unicode の定 義に存在していなければなりません。) 何らかの理由によって UTF-8 を利用で きない場合、そのパートは、それぞれが単一の MIME 文字セットでエ ンコードすることができるように、いくつかに分割されます。もっとも、パート は行の境界でしか分割することができないので、単一の行をエンコードするため に複数の MIME 文字セットが必要だとすると、そのパートをエンコー ドすることは不可能です。
MULE 機能を備えた Emacs を走らせている場合、どの coding system を使 うかの優先順位は Emacs 自身から継承されます。これは、も し Emacs が UTF-8 を優先するように設定されていると、それがメッセージのエ ンコードに使われるということです。ただ し mm-coding-system-priorities
変数の値を変えることによって、これ を変更することはできます (see 節 2.4 エンコーディングのカスタマイズ)。
メッセージを作成するときに MML の charset
タグを設定す ることによって、使われる文字セットをそれにすることができます。
文字列のエンコーディング (quoted-printable, 8bit など) はここでの議論と 直交する概念です。それは mm-body-charset-encoding-alist
変数 と mm-content-transfer-encoding-defaults
変数によって制御されま す (see 節 2.4 エンコーディングのカスタマイズ)。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
mime-to-mml
関数を使って MIME メッセージ (マルチパート でも可) を MML に変換することができます。これは現在のバッファー にある MIME メッセージに作用して、MIME の境界 を MML の印付け (markup) で置き換えます。テキストではないパー トの内容物は、そのバッファーに置かれる代わりに MML タグを介し て参照される別のバッファーに置かれます。
mml-to-mime
関数を使って、逆に MML メッセージ を MIME に変換することができます。
これらの関数が行なうことはある意味で「不可逆」(lossy) です。 mime-to-mml
を実行し、次に mml-to-mime
を実行すると、元と まったく同じメッセージには戻らないでしょう。ヘッダーの順序のようなどうで も良いことが違ってしまうだけでなく、それぞれのヘッダーの内容も変化してし まうかもしれません。例えば、元のメッセージが base64 でテキストをエンコー ドしてあっても、mml-to-mime
は quoted-printable を使うかもしれな い、というようなことです。
しかし本質的には、これら二つは互いに逆関数であるべきです。結果として生成 されるメッセージの内容物が、同一でないにしても等価なままであるような。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs MIME ライブラリーは、メッセージをエンコードするとき は use-hard-newlines
変数 (see 節 `Hard and Soft Newlines' in
テキストをエンコードするとき、ソフト改行文字で終端されている各行 は、use-hard-newlines
に関わらず に fill-flowed-encode-column
で決定される桁の後ろで折り畳まれて、 耳を揃えられ (filled され) ます。引用の印 (`^>* ?') は尊重されます。 その変数は、流動テキストをサポートしないクライアントにおけるテキストの見 え方を制御し、ディフォルトでは 66文字の後ろで折り畳みます。バッファーに ハード改行文字が無ければ、流動 (flowed) テキストのためのエンコードは行な いません。
バッファーに改行文字があるとき、流動テキストにエンコードすることを有効ま たは無効にするために mml-enable-flowed
変数をカスタマイズできます。
流動 (flowed) テキストをデコードするとき、ソフト改行文字を持つ各行 は fill-flowed-display-column
で決定される桁の後ろで折り畳まれて 耳を揃えられ (filled され) ます。ディフォルトでは fill-column
の 後ろで折り畳みます。
mm-fill-flowed
nil
だったら、format=flowed の記事は流動的に表示されます。[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |