view conf/doc/ja-mhn.rf @ 7:c20e4181370f

utf-8 input assumption in case of base64/utf-8
author kono
date Sun, 04 Dec 2005 02:30:39 +0900
parents bce86c4163a3
children
line wrap: on
line source

.\"	@(MHWARNING)
.\"		written by MH-plus project
.SC MHN 1
.NA
mhn \- マルチメディア MH
.SY
mhn
\%[\%[+folder] \%[msgs] | \%[\-file\0file]]
.br
\%[\-part\0number]... \%[\-type\0content]...
.br
\%[\-list\0\%[\-headers]\0\%[\-noheaders]
.br
       \%[\-realsize]\0\%[\-norealsize]] \%[-nolist]
.br
\%[\-show\0\%[\-serialonly]\0\%[\-noserialonly]
.br
       \%[\-form\0formfile]\0\%[\-pause]\0\%[\-nopause]] \%[\-noshow]
.br
\%[\-store\0\%[\-auto]\0\%[\-noauto]] \%[\-nostore]
.br
\%[\-cache] \%[\-nocache] \%[\-rcache\0policy] \%[\-wcache\0policy]
.br
\%[\-check]\0\%[\-nocheck]
.br
\%[\-ebcdicsafe]\0\%[\-noebcdicsafe]
.br
\%[\-rfc934mode]\0\%[\-norfc934mode]
.br
\%[\-verbose]\0\%[\-noverbose]
@BEGIN: JAPAN
.br
\%[\-junet]\0\%[\-nojunet]
@END: JAPAN
@BEGIN: MH_PLUS
.br
\%[\-8bit]\0\%[\-no8bit]
@END: MH_PLUS
.br
\%[\-help]
.DE
\fImhn\fR コマンドは RFC\-2045 で規定されているマルチメディア・メッセージを
扱います。

次の4つのオプションが \fImhn\fR の行動を規定します。
すなわち、`\-list'、`\-show'、`\-store'、そして `\-cache' です。
これらのオプションは全て、いくつかを同時に指定する事も出来ます。
通常、これらのオプションは指定のメッセージの全てのコンテンツ(内容)を
操作するものです。
しかし、`\-part' や `\-type' オプションを使うと、
操作を行なうコンテンツを(マルチパートの)特定のサブパートや、
特定のタイプのものに限定する事が出来ます。

パート指定はピリオドで分割された数字の列で成り立っています。
例えば、
3つのパートから成るマルチパートに於いては、
これらはそれぞれ 1、2、そして 3 という名前になります。
もし、2番目のパートがさらに、
2つのパートからなるマルチパート・コンテンツであった場合、
これらはそれぞれ 2.1 と 2.2 という名前になります。
`\-part' オプションはマルチパートを含むメッセージにのみ効果がある事に
注意して下さい。
もし、メッセージが他の種類のコンテンツであったり、
指定したパート自身がマルチパート・コンテンツであった場合には、
`\-part' オプションは操作対象のコンテンツの限定をしません。

コンテンツ指定はコンテンツのタイプとサブタイプから成り立っています。
標準的なコンテンツのタイプとサブタイプは RFC\-2046 に書かれています。
.ne 18
共通に使用されるコンテンツのリストは次の通りで、サブタイプは必須です。
.sp
.nf
.in +.5i
.ta \w'application  'u
タイプ	サブタイプ
----	--------
text	plain
multipart	mixed, alternative, digest, parallel
message	rfc822, partial, external-body
application	octet-stream, postscript
image	jpeg, gif, x-pbm, x-pgm, x-ppm, x-xwd
audio	basic
video	mpeg
.re
.in -.5i
.fi
.sp
.PP
`\-type' オプションでコンテンツを指定する際に、サブタイプを問わない場合は、
例えば、\*(lqaudio\*(rq という風にタイプの名前だけを使います。
特定のサブタイプを指定したい場合は、
例えば、\*(lqaudio/basic\*(rq という風に二つの間をスラッシュで区切って
指定します。
`\-type' オプションで与えられた値に関わらず、マルチパート・コンテンツ
(どのサブタイプでも)は常に扱われる点に注意して下さい。
さらに、`\-type' オプションで message/external-body コンテンツの指定を
行なう場合は、`\-type' オプションは二回現われなければなりません。
一回は message/external-body のために、
そしてもう一回はその外部参照されたコンテンツのためにです。

それぞれのコンテンツはオプションとして、完全性のチェックを持っているかも
知れません(\*(lqContent-MD5\*(rq ヘッダーの事)。
もし、それがあり、`-check' オプションが指定されると、
\fImhn\fR はそのコンテンツの完全性をチェックします。

`\-file\ file' オプションによって、フォルダ内のメッセージではなく、
指定のファイルを処理させる事が出来ます。
そのファイルは他の全ての \fIMH\fR メッセージ同様に、
正しい形式のメッセージであるべきです。
メールドロップ形式であるべきではありません
(メールドロップ形式のファイルをフォルダ内の \fIMH\fR メッセージの形式に
変換する方法は \fIinc\fR\0(1) を参照して下さい)。

.Uh "コンテンツの一覧表示"
`\-list' オプションを指定すると、\fImhn\fR は指定されたメッセージの
コンテンツの目次を一覧表示します。
`\-headers' オプションをつけると、その一覧の上に一行のヘッダー行を表示します。
`\-realsize' オプションをつけると、\fImhn\fR は一覧表示に先立ち、
それぞれのコンテンツの生来の(デコードされた)形式に対して評価をします。
これは少々の遅れを犠牲にして正確なカウントを準備します。

.Uh "コンテンツの表示"
`\-show' オプションを指定すると、\fImhn\fR は指定されたメッセージの
コンテンツを表示します。
メッセージのヘッダーは \fImhlproc\fR で、
フォーマット・ファイル \fImhl.headers\fR を使って表示されます
(フォーマット・ファイルは `\-form\0formfile' オプションで変更できます)。

\fImhn\fR は異なるコンテンツをどのように表示すべきかを決めるために、
ユーザーのプロファイルの中の情報を見ます。
そこから表示文字列を引き出し、標準入力をそのコンテンツに設定して、
その表示文字列を \fB/bin/sh\fR で実行する事で達成されます。
.ne 16
表示文字列には以下のエスケープを含む事が出来ます。
.sp
.nf
.in +.5i
.ta \w'%F  'u
%a	付加的な引数
%e	排他的な実行
%f	コンテンツが含まれているファイル名
%F	%e、%f 且つ、標準入力はコンテンツではなく端末
%l	コンテンツを表示する前に一覧表示
%p	%l 且つ、確認のために質問をする
%s	サブタイプ名
%d	コンテンツの説明
.re
.in -.5i
.fi
.sp
%e または %F エスケープを含んでいる表示文字列に対しては、
\fImhn\fR は同時には多くとも一つしか実行しません。
%F エスケープはそのコンテンツを含むファイル名に展開されますが、
%e エスケープはシェルが関係する範囲内では何の展開もしません。

%p エスケープが確認の質問をした時に、
INTR (通常 control-C) を打つと \fImhn\fR はそのコンテンツは表示しません
(%p エスケープは `\-nopause' オプションで抑制できます)。
さらに、
\fImhn\fR がコンテンツを表示する際に、
QUIT (通常 control-\\) を打つと \fImhn\fR は直ちに終らせます。

%a エスケープは \*(lqContent-Type\*(rq 行のパラメータ列に展開されます。
また、%d エスケープは \*(lqContent-Description\*(rq 行の内容に展開されます。

もし表示されるコンテンツがマルチパートの場合、
\" そして、上述のリストにあるサブタイプにない場合、
%f と %F エスケープは
それぞれの下位のコンテンツを含んだ複数のファイル名に展開されます。
さらに、
標準入力は端末からコンテンツへとはリダイレクトされません。

まず、
\fImhn\fR はコンテンツを表示するために使うコマンドを決めるために、
次の形式のエントリを探します。
.sp
.in +.5i
mhn-show-<type>/<subtype>
.in -.5i
.sp
もし見つからなかった場合は、
\fImhn\fR は表示コマンドを決めるために、次の形式のエントリを探します。
.sp
.in +.5i
mhn-show-<type>
.in -.5i
.sp
.ne 10
もし、見つからなかった場合は、
\fImhn\fR は次の二つのデフォルトの値を持ちます。
.sp
.nf
.in +.5i
mhn-show-text/plain: %pmoreproc '%F'
mhn-show-message/rfc822: %pshow -file '%F'
.in -.5i
.fi
.sp
もし、いずれも適応されなかった場合は、
\fImhn\fR はそのメッセージが application/octet-stream コンテンツで
\*(lqtype=tar\*(rq パラメータを持っていないかをチェックします。
もしそうなら、
\fImhn\fR は適切なコマンドを使います(後述)。
もしそうでないなら、
\fImhn\fR はエラーを出します。

.ne 10
エントリの例は次のような感じです。
.sp
.nf
.in +.5i
mhn-show-audio/basic: raw2audio 2>/dev/null | play
mhn-show-image: xv '%f'
mhn-show-application/PostScript: lpr -Pps
.in -.5i
.fi
.sp
%f または %F エスケープを使う場合、
そのエスケープの回りにシングル・クォートを使うのは良い考えかも知れません。
これはファイル名におかしな文字が含まれる場合、シェルに誤解釈されるのを
防ぐでしょう。
但し、マルチパートに対しては %f や %F は複数ファイルに展開されるので、
その点、注意して下さい。

テキストのコンテンツは非 ASCII 文字を含んでいるかも知れないので、
\fImhn\fR はそのコンテンツに \*(lqcharset\*(rq パラメータを見つけると、
環境変数 $MM_CHARSET が設定されているかどうかを調べ、
その環境変数の値が、この charset パラメータの値と等しいかどうかを調べます。
もし等しくないないなら、
\fImhn\fR は以下の形式のエントリを探します。
.sp
.in +.5i
mhn-charset-<charset>
.in -.5i
.sp
これには、その文字集合を表示するための環境を作るコマンドが含まれている
べきです。
このコマンド文字列は一つの \*(lq%s\*(rq を含んでいるべきです。
これはコンテンツを表示するためのコマンドが埋められます。

エントリの例は次のような感じです。
.sp
.in +.5i
mhn-charset-iso-8859-1: xterm -fn '-*-*-medium-r-normal-*-*-120-*-*-c-*-iso8859-*' -e %s
.in -.5i
.sp
最上位ビットを落してしまうページャー・プログラムも多いという点には
注意して下さい。
しかし、
\fIless\fR プログラムの新しいリリースでは、8ビット文字集合にも
\" ささやかながら
対応しています。
\" これに対応した \fIless\fR version 177 のソースは
\" MH のソース・ツリーの \fBmiscellany/less-177\fR ディレクトリ以下にあります。
\" ISO 8859/1 文字集合で送られたメッセージを \fIless\fR で見るためには、
\" .ne 9
\" \&.login ファイルに以下のように書くと良いでしょう。
\" .sp
\" .nf
\" .in +.5i
\" setenv LESSCHARSET latin1
\" setenv LESS "-f"
\" .in -.5i
\" .fi
\" .sp
\" 最初の行は \fIless\fR が文字が \*(lqnormal\*(rq、\*(lqcontrol\*(lq、または
\" \*(lqbinary\*(rq であるかどうかを決める際に、8859/1 の定義を使う事を指定
\" します。
\" 2行目は \fIless\fR が非 ASCII 文字に遭遇しても警告しないように指示します。
\" そして、
\fBmoreproc\fR プロファイル・エントリを \fIless\fR に設定すると、
それが自動的に呼び出されるでしょう。
\" 他の
8ビット文字集合を扱う方法は、
詳しくは \fIless\fR\0(1)
\" のマニュアルの \fBLESSCHARDEF\fR 環境変数の部分
を参照して下さい。

最後に、
\fImhn\fR はそれぞれのメッセージを
順番に処理していきます。\0--\0カレント・メッセージを表示するために
実行されたコマンドの全てが終了するまでは
次のメッセージの表示は始まりません。
マルチパート・コンテンツの場合、
コンテンツにはそのパートを順番に表示すべきか同時に表示すべきかを示す
情報が含まれています。
これは特にウィンドーが一つしかない表示装置では矛盾を引き起こすので、
`\-serialonly' オプションを付けると、\fImhn\fR はそれぞれのパートを
決して同時には表示しないようにします。

.Uh "コンテンツを格納する"
`\-store' オプションを指定すると、\fImhn\fR は指定されたメッセージの
コンテンツを生来の(デコードされた)形式でファイルに格納します。
この際、次の二つの事が決められなければなりません。
そのコンテンツを格納するディレクトリとファイル名です。
ファイルは \fBmhn-storage\fR プロファイル・エントリで指定されたディレクトリ
に書き出されます。
.ne 6

.sp
.in +.5i
mhn-storage: /tmp
.in -.5i
.sp
もし、このエントリが存在しなければ、カレント・ディレクトリが使われます。

\fImhn\fR は異なるコンテンツをどのように格納すべきかを決めるために、
ユーザーのプロファイルの中の情報を見ます。
これは整形文字列を使うことで達成されます。
.ne 13
整形文字列には以下のエスケープを含む事が出来ます。
.sp
.nf
.in +.5i
.ta \w'%P  'u
%m	メッセージ番号
%P	.パート
%p	パート
%s	サブタイプ
.re
.in -.5i
.fi
.sp
もしコンテンツがマルチパート・コンテンツのサブパートではない場合は、
%p エスケープは無視されます。
もし整形文字列が文字 \*(lq+\*(rq で始まっている場合、
これらの文字列は無視され、コンテンツはその名前のフォルダに格納されます
(整形文字列が文字 \*(lq+\*(rq だけである場合は、
カレント・フォルダを意味します)。
さらに、
整形文字列が文字 \*(lq-\*(rq だけである場合は、標準出力を意味します。

まず、
\fImhn\fR は整形文字列を決めるために、次の形式のエントリを探します。
.sp
.in +.5i
mhn-store-<type>/<subtype>
.in -.5i
.sp
もし見つからなかった場合は、
\fImhn\fR は整形文字列を決めるために、次の形式のエントリを探します。
.sp
.in +.5i
mhn-store-<type>
.in -.5i
.sp
もし、見つからなかった場合は、
\fImhn\fR はそのメッセージが application/octet-stream コンテンツで
\*(lqtype=tar\*(rq パラメータを持っていないかをチェックします。
もしそうなら、
\fImhn\fR は適切なファイル名を使います。
もしコンテンツが application/octet-stream でなかった場合は、
\fImhn\fR はそのコンテンツが message かどうかをチェックします。
もしそうなら、
\fImhn\fR は \*(lq+\*(rq を整形文字列とします。
もしそうでないなら、
\fImhn\fR は \*(lq%m%P.%s\*(rq を整形文字列とします。

もし整形文字列が '/' で始まっている場合は、コンテンツは
(\fBmhn-storage\fR で与えられたディレクトリやカレント・ディレクトリではなく)
与えられた絶対パスに格納されます。
同様に、
もし整形文字列が '|' で始まっている場合は、
\fImhn\fR はそのコンテンツを究極的に格納するべきコマンドを実行します。
このコマンドを実行する前には、
\fImhn\fR は適切なディレクトリに移る点に注意して下さい。
さらに、もし整形文字列が '|' で始まっている場合は、
\fImhn\fR は整形文字列を処理する際に、表示文字列同様の %a エスケープも
尊重します。

.ne 10
エントリの例は次のような感じです。
.sp
.nf
.in +.5i
mhn-store-text: %m%P.txt
mhn-store-audio/basic: | raw2audio -e ulaw -s 8000 -c 1 > %m%P.au
mhn-store-application/PostScript: %m%P.ps
.in -.5i
.fi
.sp
さらに、
分割メッセージを含むコンテンツを格納しようとする時には、
\fImhn\fR は全ての分割部分のありかを見つけ、
それに応じてそれらを組み立てようとします。
もし、誰かがメッセージをいくつかの部分に分けて送って来た場合、
それらの全てを一つのフォルダに置いて、次のようにする事が出来ます。
.sp
.in +.5i
mhn all -store
.in -.5i
.sp
これで、それらは正しく、各部分の総和を含む一つのメッセージに格納されます。
もし \fImhn\fR が全ての分割部分を集められなかった場合は、
何も格納はされません。

最後に、
`\-auto' オプションが指定された場合で、そのコンテンツに、
そのコンテンツがどういうファイル名に格納すべきかの情報が含まれていた場合は
(そしてそのファイル名が '/' で始まらない場合は)、
上述の方式に代わって、そのコンテンツから得られたファイル名が使われます。
`\-auto' でない場合は、送り主が指定してきたファイル名は無視される点に
注意して下さい。

.Uh "外部アクセス"
message/external-body コンテンツに対しては、
.ne 12
\fImhn\fR は以下のアクセス・タイプをサポートしています。
.sp
.nf
.in +.5i
afs
anon-ftp
ftp
local-file
mail-server
.in -.5i
.fi
.sp
\*(lqanon-ftp\*(rq と \*(lqftp\*(rq アクセス・タイプに対しては、
もしシステムが TCP/IP への SOCKET インターフェイスをサポートしているなら、
\fImhn\fR は内蔵の FTP クライアント・ルーチンを使います。
さもなくば、
\fImhn\fR は、FTP アクセスをするプログラムのパス名を決めるために、
\fBmhn-access-ftp\fR プロファイル・エントリを探します。
.ne 6

.sp
.in +.5i
mhn-access-ftp: myftp.sh
.in -.5i
.sp
.ne 14
このプログラムは以下の引数と共に起動されます。
.sp
.nf
.in +.5i
FTP サイトのドメイン名
ユーザー名
パスワード
リモート・ディレクトリ
リモート・ファイル名
ローカル・ファイル名
\*(lqascii\*(rq または \*(lqbinary\*(rq
.in -.5i
.fi
.sp
このプログラムはファイルの回収が成功した場合にはゼロの終了コードをもって
終了すべきです。

.Uh "コンテンツのキャッシュ"
\fImhn\fR が \*(lqContent-ID:\*(rq ヘッダーを含む外部参照コンテンツに
遭遇した時、
そのコンテンツがキャッシュを許せば、
\fImhn\fR のキャッシュ機能に従って、そのコンテンツは読まれ、
キャッシュに書き出されるかも知れません。

\fImhn\fR のキャッシュ機能は
`\-rcache' そして `\-wcache' オプションで制御されます。
これらはそれぞれ、
キャッシュの際の読まれる時と書き出される時の方針を定義します。
以下の4つの方針のうちの一つが指定できます。
\*(lqpublic\*(rq
は、\fImhn\fR が皆がコンテンツのキャッシュにアクセス出来るようにするよう
指示します。
\*(lqprivate\*(rq
は、\fImhn\fR がそのユーザー個人のキャッシュを作るよう指示します。
\*(lqnever\*(rq
は、\fImhn\fR がキャッシュを使わないよう指示します。
そして、
\*(lqask\*(rq
は、\fImhn\fR がユーザーに尋ねるよう指示します。

コンテンツがキャッシュされるディレクトリは以下の2つがあります。
プロファイル・エントリ \fBmhn-cache\fR は皆が読めるキャッシュを
置くディレクトリを定義します。
そして、
プロファイル・エントリ \fBmhn-private-cache\fR は個人のキャッシュを
置くディレクトリを定義します。
前者は絶対パスのディレクトリ名であるべきです。
.ne 6
例えば、もしシステムのリブートの度にキャッシュが消えるのを気にしないのなら、
.sp
.in +.5i
mhn-cache: /tmp
.in -.5i
.sp
という風にしてもいいでしょう。
後者はもし絶対パスでないなら、ユーザーの MH ディレクトリからの相対パスと
考えられます。
.ne 6

.sp
.in +.5i
mhn-private-cache: .cache
.in -.5i
.sp
(これがデフォルトの値です)

.Uh "コンテンツをキャッシュする"
message/external-body コンテンツで、アクセス・タイプが
\*(lqmail-server\*(rq のものに遭遇したら、
\fImhn\fR はそのコンテンツが要求するメールサーバーに
メッセージを送信してもいいかどうかを尋ねます。
.ne 14

.sp
.nf
.in +.5i
% show 1
Retrieve content by asking mail-server@...

SEND file

? yes
mhn: request sent
.in -.5i
.fi
.sp
あなたの決定がどちらであっても、
\fImhn\fR はコンテンツに他の何の処理も出来ません。

しかし、
\fImhn\fR がコンテンツの要求を許された場合(ユーザーが yes と答えた場合)、
それが到着した時に、
元々の message/external-body コンテンツにあった \*(lqContent-ID:\*(rq 行の値に
対応する行が、送られてきたメッセージのトップレベルにあるべきです。
この時、`-cache' オプションを使って \fImhn\fR に到着したコンテンツを
キャッシュに入れるように指示すべきでしょう。
.ne 8

.sp
.nf
.in +.5i
% mhn -cache 2
caching message 2 as file ...
.in -.5i
.fi
.sp
そしたら、
元々の message/external-body コンテンツを再び処理した時には
「正しい事」が起こる事でしょう。
.ne 8

.sp
.nf
.in +.5i
% show 1
\0...
.in -.5i
.fi

.Uh "コンテンツを作成する"
\fImhn\fR プログラムはマルチメディア・メッセージを作成する際に
それを手助けする簡単なエディタとしても使えます。
\fIwhatnow\fR プログラムから呼ばれた時には、
\fImhn\fR はドラフトのボディが
\fImhn\fR 作成ファイルとして整形される事を期待します。

.ne 59
この文法は以下の通りです。
.sp
.nf
.in +.5i
   body         ::=     1*(content | EOL)

   content      ::=     directive | plaintext

   directive    ::=     "#" type "/" subtype
                            0*(";" attribute "=" value)
                            [ "(" comment ")" ]
                            [ "<" id ">" ]
                            [ "[" description "]" ]
                            [ filename ]
                            EOL

                      | "#@" type "/" subtype
                            0*(";" attribute "=" value)
                            [ "(" comment ")" ]
                            [ "<" id ">" ]
                            [ "[" description "]" ]
                            external-parameters
                            EOL

                      | "#forw"
                            [ "<" id ">" ]
                            [ "[" description "]" ]
                            [ "+"folder ] [ 0*msg ]
                            EOL

                      | "#begin"
                              [ "<" id ">" ]
                              [ "[" description "]" ]
                              [   "alternative"
                                | "parallel"
                                | something-else    ]
                              EOL
                            1*body
                        "#end" EOL

   plaintext    ::=     [ "Content-Description:"
                              description EOL EOL ]
                            1*line
                        [ "#" EOL ]

                      | "#<" type "/" subtype
                            0*(";" attribute "=" value)
                            [ "(" comment ")" ]
                            [ "[" description "]" ]
                            EOL
                            1*line
                        [ "#" EOL ]

   line         ::=     "##" text EOL
                        -- これは "#"text EOL と解釈される
                      | text EOL
.in -.5i
.fi
.sp
基本的に、
ボディは一つまたはそれ以上のコンテンツを含んでいます。
コンテンツは行の最初の文字が \*(lq#\*(rq になっている事で区別される指令文、
または
プレーン・テキスト領域(一行またはそれ以上のテキスト)から成り立ちます。
一つの指令文が複数の行にまたがる場合は、
.ne 11
継続文字 \*(lq\\\*(lq が使われます。

.sp
.nf
.in +.5i
#@application/octet-stream; \\
    type=tar; \\
    x-conversions=compress
.in -.5i
.fi
.sp
指令文には以下の4種類があります。
コンテンツのタイプとサブタイプを名付ける「タイプ指令文」、
同じく、コンテンツのタイプとサブタイプを名付ける「外部タイプ指令文」、
メッセージのダイジェストを転送するために使われる「forw 指令文」、
そして、
マルチパート・コンテンツを作る
「begin 指令文」です。

タイプ指令文には、
タイプとサブタイプの指定が必須です。また文字 \*(lq;\*(rq で区切って、
パラメータを書く事も出来ます。これは送られるメッセージの
\*(lqContent-Type\*(rq 行のパラメータとなります。
また、そのコンテンツが生来の(デコードされた)形式で保存されているファイル名を
指定する事も出来ます
(もしファイル名が文字 \*(lq|\*(rq で始まっている場合は、
コマンドの出力からコンテンツが得られます)。
もしファイル名が指定されてなかった場合、
\fImhn\fR は異なるコンテンツをどのように作成すべきかを決めるために、
ユーザーのプロファイルの中の情報を見ます。
そこから作成文字列を引き出し、標準入力をそのコンテンツに設定して、
その作成文字列を \fB/bin/sh\fR で実行する事で達成されます。
.ne 13
作成文字列には以下のエスケープを含む事が出来ます。
.sp
.nf
.in +.5i
.ta \w'%P  'u
%a	付加的な引数
%f	コンテンツが含まれているファイル名
%F	%f 且つ、標準出力はリダイレクトされない
%s	サブタイプ名
.re
.in -.5i
.fi
.sp
まず、
\fImhn\fR はコンテンツを作成するために使うコマンドを決めるために、
次の形式のエントリを探します。
.sp
.in +.5i
mhn-compose-<type>/<subtype>
.in -.5i
.sp
もし見つからなかった場合は、
\fImhn\fR は作成コマンドを決めるために、次の形式のエントリを探します。
.sp
.in +.5i
mhn-compose-<type>
.in -.5i
.sp
もし見つからなかった場合は、
\fImhn\fR はエラーを出します。

エントリの例は次のような感じです。
.sp
.in +.5i
mhn-compose-audio/basic: record | raw2audio -F
.in -.5i
.sp
このようなコマンドはユーザーがログインしている表示環境等に依って
変わるでしょうから、
異なるコンテンツに対する作成文字列の情報は
ユーザーのプロファイルに直接書く代わりに
環境変数 \fB$MHN\fR で指定されたファイルに書くべきでしょう。

得られたコンテンツは必要なら base64 形式などでエンコードされ、送り出される
メッセージのボディ部分に含められます。

外部タイプ指令文はそのコンテンツ自身を含めるのではなく、
そのコンテンツへの参照を用意します。
送り出されるメッセージでは message/external-body 形式になります。
つまり、
タイプ指令文で使ったようなファイル名を指定するのではなく、
外部参照のパラメータを使います。
これらは通常のパラメータと区別するために、
.ne 15
分離して書かれなければなりません。

.sp
.nf
.in +.5i
#@application/octet-stream; \\
    type=tar; \\
    x-conversions=compress [] \\
    access-type=anon-ftp; \\
    name="mh-mime.tar.Z"; \\
    directory="mrose/mh-mime"; \\
    site="ftp.ics.uci.edu"
.in -.5i
.fi
.sp
\*(lq[]\*(rq を指定することで、
空の説明文が指定され、
外部参照のパラメータの始まりが認識されます。
.ne 19
これらのパラメータは以下のような形式をしています。
.sp
.nf
.in +.5i
.ta \w'access-type=  'u
access-type=	通常 \fIanon-ftp\fR または \fImail-server\fR
name=	ファイル名
permission=	\fIread\fR または \fIread-write\fR
site=	ホスト名
directory=	ディレクトリ名 (無くても良い)
mode=	通常 \fIascii\fR または \fIimage\fR (無くても良い)
size=	バイト数
server=	メールアドレス
subject=	送られる Subject
body=	メールサーバーに送られるコマンド
.re
.in -.5i
.fi
.sp

forw 指令文には
フォルダ名と転送されるメッセージを指定する事も出来ます。
もしフォルダが指定されなかった場合の
デフォルトはカレント・フォルダです。
同様に
メッセージが指定されなかった場合の
デフォルトはカレント・メッセージです。
送り出されるメッセージでは message/rfc822 形式になります。
従って、
forw 指令文は
メッセージの取り込みに RFC\-934 ルールではなく、MIME ルールを使うという
点を除けば、\fIforw\fR\0(1) コマンドに似ています。
`\-rfc934mode' オプションを使うと、\fImhn\fR は
RFC\-934 ルールを使って、メッセージの取り込みをします。
このオプションを指定しておくと、
RFC\-934 を満たすユーザー・エージェントは受けとったメッセージを
分割する事が出来ます。\0--\0取り込まれたメッセージが
さらに取り込まれたメッセージを含まないようにします。
この方法の欠点は、取り込まれたそれぞれのメッセージ・ボディの最後に
余分な改行が追加されてしまう点です。

begin 指令文には、
begin と end の組の間に
少なくとも一つのコンテンツが指定されてなければなりません。

これら全ての指令文には
コンテンツの短い説明文を文字 \*(lq[\*(rq と文字 \*(lq]\*(rq の間に含める
事が出来ます。
これは送り出されるメッセージでは \*(lqContent-Description\*(rq 行に
入ります。
また、デフォルトでは、
\fImhn\fR はそれぞれの指令文に対して、一意的な \*(lqContent-ID:\*(rq 行を
生成します。
しかし、
ユーザーは文字 \*(lq<\*(rq と \*(lq>\*(rq を使って、
ID を自ら定義する事が出来ます。

これらは全て同時に使う事が出来ます。
.ne 15
以下にユーザーのメッセージ・フォーム・ファイルの簡単な例を挙げます。
.sp
.nf
.in +.5i
To:
cc:
Subject:
--------
#audio/basic [Flint phone]  \\
    |raw2audio -F < /home/mrose/lib/multi-media/flint.au
#image/gif   [MTR's photo] \\
                    /home/mrose/lib/multi-media/mrose.gif
.in -.5i
.fi
.sp
後の例のために、
このメッセージ・フォーム・ファイルを \fImhncomps\fR と呼ぶ事にします。

既に述べたように、ドラフトには指令文に加えて、
プレーン・テキスト領域を置く事が出来ます。
プレーン・テキスト領域は次の指令文が現われるまで、
またはドラフトの最後までの部分が集められ、テキスト・コンテンツを形成します。
プレーン・テキスト領域で行頭に文字 \*(lq#\*(rq を含めたい場合は
それを2つ続けます。
.ne 6

.sp
.in +.5i
## この行は送出されると、行の最初は一つの # だけになる。
.in -.5i
.sp
もし、プレーン・テキスト領域を指令文より前に終らせたい場合、
例えば、
二つのプレーン・テキスト・コンテンツを連続させたい場合は、
単に一つの \*(lq#\*(rq 文字だけを含む行を挿入します。
.ne 10

.sp
.nf
.in +.5i
これは最初のコンテンツです。
#
そしてこれは二番目です。
.in -.5i
.fi
.sp
最後に、
プレーン・テキスト領域が次の形式の行で始まっている場合、
.sp
.in +.5i
Content-Description: text
.in -.5i
.sp
これがそのプレーン・テキスト・コンテンツの説明文として使われます。
注意: この行はテキストを始める前に空行と共に使わなければなりません。

デフォルトでは、
プレーン・テキスト領域は text/plain コンテンツとして使われます。
これはプレーン・テキスト領域を \*(lq#<\*(rq とタイプ指定で
始める事で、変更可能です。
.ne 11

.sp
.nf
.in +.5i
#<text/richtext
このコンテンツは text/richtext になります。
#
このコンテンツは text/plain になります。
.in -.5i
.fi
.sp
もし \*(lq#<\*(rq 指定を使う場合は、
コンテンツの説明文はこのタイプ指定と同じ行に書かなければならない
点に注意して下さい。

\fImhn\fR はプレーン・テキスト領域については、それがテキスト・コンテンツなら、
そこで使われている文字コードを調べます。そして、ASCII 文字のみで構成されて
いるなら自動的に \fIcharset=\*(lqus-ascii\*(rq\fR パラメータをつけます。
また、8ビット・テキストである場合は、環境変数 $MM_CHARSET が調べられ、
そこに設定されている値が charset の値として使われます。
またこの時、本文は適切に quoted-printable 形式などでエンコードされます。
@BEGIN: MH_PLUS
なお、`\-8bit' オプションが指定されている場合は、このエンコードは行なわず、
生の 8bit のまま送り出すようになります。
@END: MH_PLUS
@BEGIN: JAPAN
また、ISO-2022-JP コードで書かれている場合も適切に charset の値が設定されます。
`\-junet' オプションが指定されている場合は、ドラフト・ファイルをまず、
ISO-2022-JP コードに変換した後に、この処理を行なうようになります。
@END: JAPAN

\fImhn\fR が成功すると、
元々のドラフト・ファイルは、
文字 \*(lq,\*(rq (またはサイト依存のオプション SBACKUP の値)で
始まり、\*(lq.orig\*(rq で終るファイル名にリネームされます。
例えば、
\*(lqdraft\*(rq というファイルを編集してた場合、
\*(lq,draft.orig\*(rq というようなファイル名になります。
これを使えば、\fImhn\fR で作成したファイルを簡単に元に戻す事が出来ます。

`-check' オプションを指定すると、
\fImhn\fR はそれぞれのコンテンツの完全性をチェックします。
つまり、そのチェック結果を \*(lqContent-MD5\*(rq 行に書き出します。

.Uh "自動作成"
MH では \&.mh\(ruprofile に以下の行を追加しない限り、
自動的には \fImhn\fR は呼び出さない事に注意して下さい。
.sp
.in +.5i
automhnproc: mhn
.in -.5i
.sp
これをしない時は、
ドラフトを送る前に明示的に以下のコマンドを使わなければなりません。
.sp
.in +.5i
What now? edit mhn
.in -.5i
.sp

これをする事を忘れないようにするために、MH を調整する事が出来ます。
.ne 10
プロファイルに以下の行がある事を想定してみて下さい。
.sp
.nf
.in +.5i
mcomp:          -editor mprompter -form mhncomps
mprompter:      -noprepend -norapid
mprompter-next: mhn
.in -.5i
.fi
.sp
ここで、\fImcomp\fR は \fIcomp\fR\0(1) へのリンクで、
\fImprompter\fR は \fIprompter\fR\0(1) へのリンクです。
この時、上述のメッセージ・フォーム・ファイル \fImhncomps\fR を使って
.ne 26
メッセージを送る手順は以下の通りです。
.sp
.nf
.in +.5i
% \fBmcomp\fR
To: \fBuser@host\fR
cc:
Subject: \fBmulti-media message\fR
--------
#audio/basic [Flint phone]  \\
    |raw2audio -F < /home/mrose/lib/multi-media/flint.au
#image/gif   [MTR's photo] \\
                    /home/mrose/lib/multi-media/mrose.gif

--------Enter additional text

\fBこのメッセージは3つのコンテンツを含んでいます。\fR
\fB<CTRL-D>\fR
--------

What now? \fBedit\fR (これは \fImhn\fR を呼び出します)

What now? \fBsend\fR
.in -.5i
.fi
.sp
付加的な edit コマンドを打たなければならない事を忘れないようにしなければ
なりませんが、それはやりとりから、かなり明らかな事でしょう。

最後に、
プロファイルに以下の行を追加する事を考えるべきでしょう。
.sp
.in +.5i
lproc: show
.in -.5i
.sp
この場合、
\fImhn\fR をエディタとして呼び出した後で、\fBlist\fR を打った場合、
.sp
.in +.5i
What now? list
.in -.5i
.sp
あなたの期待するように動くでしょう。

.Uh "ファイルをメールで送る"
あなたがファイルの束を誰かに送ろうと思ったら、
シェルスクリプト \fIviamail\fR を走らせる事が出来ます。
これは tarmail コマンドに似たものです。
.sp
.in +.5i
@(MHETCPATH)/viamail mailpath \*(lqsubject\*(rq files\0...
.in -.5i
.sp
\fIviamail\fR は指定されたファイルやディレクトリを \fItar\fR\0(1) で
まとめた後、圧縮し、`subject' と共に `mailpath' へと送ります。
この圧縮ファイルはその大きさによって、
自動的に複数のメッセージへと分割されます。

\fIviamail\fR がそれぞれの分割メッセージを送った後、しばらく
待ってから次を送って欲しいと思うかも知れません。
これは通常、\fIsendmail\fR を走らせていて、多数の分割メッセージが作られる
ような時でしょう。
もし \fIviamail\fR への最初の引数がダッシュ(`\-')で始まっている場合、
これはそれぞれの送出の間に待つべき秒数を表わします。
.ne 6

.sp
.in +.5i
@(MHETCPATH)/viamail -300 mailpath \*(lqsubject\*(rq files\0...
.in -.5i
.sp
これは各送出の間、5分ずつ待ちます。

これらのメッセージを受け取ったら、
まず \fImhn\fR でメッセージの一覧を見て、
その後、`\-store' オプション付きで実行してみましょう。
\fImhn\fR プログラムはアーカイヴを含むただ一つのメッセージを格納します。
その後、`\-show' するとその中身を見る事が出来ます。
それから、`\-store' でそのアーカイヴをファイルに落す事が出来ます。
.ne 26

.sp
.nf
.in +.5i
% mhn -list all
 msg part  type/subtype             size description
   1       message/partial           47K part 1 of 4
   2       message/partial           47K part 2 of 4
   3       message/partial           47K part 3 of 4
   4       message/partial           18K part 4 of 4
% mhn -store all
% mhn -list -verbose last
 msg part  type/subtype             size description
   5       application/octet-stream 118K
             (extract with uncompress | tar xvpf -)
             type=tar
             x-conversions=compress
% mhn -show last
 msg part  type/subtype             size description
   5       application/octet-stream 118K
-- メッセージのヘッダー部分とそれに続いて \fItar\fR の一覧表示がされる。
% mhn -store last
% uncompress < 5.tar.Z | tar xvpf -
.in -.5i
.fi
.sp
または、
`\-auto' オプションを付けると、
\fImhn\fR は自動的に展開までやってくれます。
.ne 26

.sp
.nf
.in +.5i
% mhn -list all
 msg part  type/subtype             size description
   1       message/partial           47K part 1 of 4
   2       message/partial           47K part 2 of 4
   3       message/partial           47K part 3 of 4
   4       message/partial           18K part 4 of 4
% mhn -store all
% mhn -list -verbose last
 msg part  type/subtype             size description
   5       application/octet-stream 118K
             (extract with uncompress | tar xvpf -)
             type=tar
             x-conversions=compress
% mhn -show last
 msg part  type/subtype             size description
   5       application/octet-stream 118K
-- メッセージのヘッダー部分とそれに続いて \fItar\fR の一覧表示がされる。
% mhn -store -auto last
-- \fItar\fR が自動的にファイルの一覧を表示しながら展開もする。
.in -.5i
.fi
.sp
二番目の例では、自動的に \fItar\fR でファイルが展開されます。
慎重なユーザーは決して `\-auto' を \&.mh\(ruprofile ファイルには
書かないでしょう。
正しい手順はまず `\-show' でどんなファイルが展開されるのかを確かめる事です。
それから \fImhn\fR を `\-store' と `\-auto' を付けて起動し、展開をします。

.Uh "ユーザー環境"
\fImhn\fR がどう処理すべきかは表示環境等に依って
変わるでしょうから、
\fImhn\fR は環境変数 \fB$MHN\fR を見ます。
これが設定されている場合、
これは付加的なユーザー・プロファイルの名前を指定します。
つまり、
ユーザーがある表示装置にログインした時、
この環境変数には、その表示装置に適した設定が書いてあるファイルを参照するような
値を設定すべきでしょう。
通常、
以下の形式のエントリだけが必要だと思われます。
.sp
.in +.5i
mhn-show-<type>/<subtype>
.br
mhn-show-<type>
.in -.5i
.sp
最後に、
\fImhn\fR はもう一つの付加的なユーザー・プロファイルを参照しようとします。
.ne 6
e.g.,
.sp
.in +.5i
@(MHETCPATH)/mhn_defaults
.in -.5i
.sp
これは MH のインストールの際に自動的に作られます。
.Fi
^$HOME/\&.mh\(ruprofile~^ユーザーのプロファイル
^$MHN~^付加的なプロファイル・エントリ
^@(MHETCPATH)/mhn_defaults~^システム・デフォルトのプロファイル・エントリ
^@(MHETCPATH)/mhl.headers~^ヘッダーのテンプレート
.Pr
^Path:~^ユーザーの MH ディレクトリを決める
.Ps
^Current\-Folder:~^デフォルトのカレント・フォルダを示す
.Ps
^mhlproc:~^メッセージ・ヘッダーを表示するデフォルトのプログラム
.Ps
^mhn-access-ftp:~^FTP でコンテンツを回収するプログラム
.Ps
^mhn-cache~^外部コンテンツをキャッシュする共用ディレクトリ
.Ps
^mhn-charset-<charset>~^文字集合を表示するための環境のテンプレート
.Ps
^mhn-compose-<type>*~^コンテンツを作成するためのテンプレート
.Ps
^mhn-private-cache~^外部コンテンツをキャッシュする個人ディレクトリ
.Ps
^mhn-show-<type>*~^コンテンツを表示するためのテンプレート
.Ps
^mhn-storage~^コンテンツを格納するディレクトリ
.Ps
^mhn-store-<type>*~^コンテンツを格納するためのテンプレート
.Ps
^moreproc:~^text/plain コンテンツを表示するデフォルトのプログラム
.Sa
mhl(1)
.br
\fIMIME: Format of Internet Message Bodies\fR (RFC\-2045),
.br
\fIMIME: Media Types\fR (RFC\-2046),
.br
\fIMIME: Message Header Extensions for Non-ASCII Text\fR (RFC\-2047),
.br
\fIProposed Standard for Message Encapsulation\fR (RFC\-934).
.De
`+folder'	デフォルトはカレント・フォルダ
.Ds
`msgs'	デフォルトは cur
.Ds
`\-noauto'
.Ds
`\-nocache'
.Ds
`\-nocheck'
.Ds
`\-noebcdicsafe'
.Ds
`\-form\0mhl.headers'
.Ds
`\-headers'
.Ds
`\-pause'
.Ds
`\-rcache\0ask'
.Ds
`\-realsize'
.Ds
`\-rfc934mode'
.Ds
`\-noserialonly'
.Ds
`\-show'
.Ds
`\-noverbose'
.Ds
`\-wcache\0ask'
@BEGIN: JAPAN
.Ds
`\-nojunet'
@END: JAPAN
@BEGIN: MH_PLUS
.Ds
`\-no8bit'
@END: MH_PLUS
.Co
フォルダが指定されると、それがカレント・フォルダになります。
最後に選択されたメッセージがカレント・メッセージになります。
.Bu
マルチパート・コンテンツの中に分割メッセージが含まれている場合は、
`\-store' オプションでうまく集めることが出来ません。
.En