MHN(1)

NAME
mhn - マルチメディア MH

SYNOPSIS
mhn [[+folder] [msgs] | [-file file]]
[-part number]... [-type content]...
[-list [-headers] [-noheaders]
       [-realsize] [-norealsize]] [-nolist]
[-show [-serialonly] [-noserialonly]
       [-form formfile] [-pause] [-nopause]] [-noshow]
[-store [-auto] [-noauto]] [-nostore]
[-cache] [-nocache] [-rcache policy] [-wcache policy]
[-check] [-nocheck]
[-ebcdicsafe] [-noebcdicsafe]
[-rfc934mode] [-norfc934mode]
[-verbose] [-noverbose]
[-junet] [-nojunet]
[-8bit] [-no8bit]
[-help]

DESCRIPTION
mhn コマンドは RFC-2045 で規定されているマルチメディア・メッセージを 扱います。 次の4つのオプションが mhn の行動を規定します。 すなわち、`-list'、`-show'、`-store'、そして `-cache' です。 これらのオプションは全て、いくつかを同時に指定する事も出来ます。 通常、これらのオプションは指定のメッセージの全てのコンテンツ(内容)を 操作するものです。 しかし、`-part' や `-type' オプションを使うと、 操作を行なうコンテンツを(マルチパートの)特定のサブパートや、 特定のタイプのものに限定する事が出来ます。 パート指定はピリオドで分割された数字の列で成り立っています。 例えば、 3つのパートから成るマルチパートに於いては、 これらはそれぞれ 1、2、そして 3 という名前になります。 もし、2番目のパートがさらに、 2つのパートからなるマルチパート・コンテンツであった場合、 これらはそれぞれ 2.1 と 2.2 という名前になります。 `-part' オプションはマルチパートを含むメッセージにのみ効果がある事に 注意して下さい。 もし、メッセージが他の種類のコンテンツであったり、 指定したパート自身がマルチパート・コンテンツであった場合には、 `-part' オプションは操作対象のコンテンツの限定をしません。 コンテンツ指定はコンテンツのタイプとサブタイプから成り立っています。 標準的なコンテンツのタイプとサブタイプは RFC-2046 に書かれています。 共通に使用されるコンテンツのリストは次の通りで、サブタイプは必須です。

タイプ	サブタイプ
----	--------
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

`-type' オプションでコンテンツを指定する際に、サブタイプを問わない場合は、 例えば、"audio" という風にタイプの名前だけを使います。 特定のサブタイプを指定したい場合は、 例えば、"audio/basic" という風に二つの間をスラッシュで区切って 指定します。 `-type' オプションで与えられた値に関わらず、マルチパート・コンテンツ (どのサブタイプでも)は常に扱われる点に注意して下さい。 さらに、`-type' オプションで message/external-body コンテンツの指定を 行なう場合は、`-type' オプションは二回現われなければなりません。 一回は message/external-body のために、 そしてもう一回はその外部参照されたコンテンツのためにです。 それぞれのコンテンツはオプションとして、完全性のチェックを持っているかも 知れません("Content-MD5" ヘッダーの事)。 もし、それがあり、`-check' オプションが指定されると、 mhn はそのコンテンツの完全性をチェックします。 `-file file' オプションによって、フォルダ内のメッセージではなく、 指定のファイルを処理させる事が出来ます。 そのファイルは他の全ての MH メッセージ同様に、 正しい形式のメッセージであるべきです。 メールドロップ形式であるべきではありません (メールドロップ形式のファイルをフォルダ内の MH メッセージの形式に 変換する方法は inc (1) を参照して下さい)。 `-list' オプションを指定すると、mhn は指定されたメッセージの コンテンツの目次を一覧表示します。 `-headers' オプションをつけると、その一覧の上に一行のヘッダー行を表示します。 `-realsize' オプションをつけると、mhn は一覧表示に先立ち、 それぞれのコンテンツの生来の(デコードされた)形式に対して評価をします。 これは少々の遅れを犠牲にして正確なカウントを準備します。 `-show' オプションを指定すると、mhn は指定されたメッセージの コンテンツを表示します。 メッセージのヘッダーは mhlproc で、 フォーマット・ファイル mhl.headers を使って表示されます (フォーマット・ファイルは `-form formfile' オプションで変更できます)。 mhn は異なるコンテンツをどのように表示すべきかを決めるために、 ユーザーのプロファイルの中の情報を見ます。 そこから表示文字列を引き出し、標準入力をそのコンテンツに設定して、 その表示文字列を /bin/sh で実行する事で達成されます。 表示文字列には以下のエスケープを含む事が出来ます。

%a	付加的な引数
%e	排他的な実行
%f	コンテンツが含まれているファイル名
%F	%e、%f 且つ、標準入力はコンテンツではなく端末
%l	コンテンツを表示する前に一覧表示
%p	%l 且つ、確認のために質問をする
%s	サブタイプ名
%d	コンテンツの説明

%e または %F エスケープを含んでいる表示文字列に対しては、 mhn は同時には多くとも一つしか実行しません。 %F エスケープはそのコンテンツを含むファイル名に展開されますが、 %e エスケープはシェルが関係する範囲内では何の展開もしません。 %p エスケープが確認の質問をした時に、 INTR (通常 control-C) を打つと mhn はそのコンテンツは表示しません (%p エスケープは `-nopause' オプションで抑制できます)。 さらに、 mhn がコンテンツを表示する際に、 QUIT (通常 control-\) を打つと mhn は直ちに終らせます。 %a エスケープは "Content-Type" 行のパラメータ列に展開されます。 また、%d エスケープは "Content-Description" 行の内容に展開されます。 もし表示されるコンテンツがマルチパートの場合、 %f と %F エスケープは それぞれの下位のコンテンツを含んだ複数のファイル名に展開されます。 さらに、 標準入力は端末からコンテンツへとはリダイレクトされません。 まず、 mhn はコンテンツを表示するために使うコマンドを決めるために、 次の形式のエントリを探します。

mhn-show-<type>/<subtype>

もし見つからなかった場合は、 mhn は表示コマンドを決めるために、次の形式のエントリを探します。

mhn-show-<type>

もし、見つからなかった場合は、 mhn は次の二つのデフォルトの値を持ちます。

mhn-show-text/plain: %pmoreproc '%F'
mhn-show-message/rfc822: %pshow -file '%F'

もし、いずれも適応されなかった場合は、 mhn はそのメッセージが application/octet-stream コンテンツで "type=tar" パラメータを持っていないかをチェックします。 もしそうなら、 mhn は適切なコマンドを使います(後述)。 もしそうでないなら、 mhn はエラーを出します。 エントリの例は次のような感じです。

mhn-show-audio/basic: raw2audio 2>/dev/null | play
mhn-show-image: xv '%f'
mhn-show-application/PostScript: lpr -Pps

%f または %F エスケープを使う場合、 そのエスケープの回りにシングル・クォートを使うのは良い考えかも知れません。 これはファイル名におかしな文字が含まれる場合、シェルに誤解釈されるのを 防ぐでしょう。 但し、マルチパートに対しては %f や %F は複数ファイルに展開されるので、 その点、注意して下さい。 テキストのコンテンツは非 ASCII 文字を含んでいるかも知れないので、 mhn はそのコンテンツに "charset" パラメータを見つけると、 環境変数 $MM_CHARSET が設定されているかどうかを調べ、 その環境変数の値が、この charset パラメータの値と等しいかどうかを調べます。 もし等しくないないなら、 mhn は以下の形式のエントリを探します。

mhn-charset-<charset>

これには、その文字集合を表示するための環境を作るコマンドが含まれている べきです。 このコマンド文字列は一つの "%s" を含んでいるべきです。 これはコンテンツを表示するためのコマンドが埋められます。 エントリの例は次のような感じです。

mhn-charset-iso-8859-1: xterm -fn '-*-*-medium-r-normal-*-*-120-*-*-c-*-iso8859-*' -e %s

最上位ビットを落してしまうページャー・プログラムも多いという点には 注意して下さい。 しかし、 less プログラムの新しいリリースでは、8ビット文字集合にも 対応しています。 moreproc プロファイル・エントリを less に設定すると、 それが自動的に呼び出されるでしょう。 8ビット文字集合を扱う方法は、 詳しくは less (1) を参照して下さい。 最後に、 mhn はそれぞれのメッセージを 順番に処理していきます。 -- カレント・メッセージを表示するために 実行されたコマンドの全てが終了するまでは 次のメッセージの表示は始まりません。 マルチパート・コンテンツの場合、 コンテンツにはそのパートを順番に表示すべきか同時に表示すべきかを示す 情報が含まれています。 これは特にウィンドーが一つしかない表示装置では矛盾を引き起こすので、 `-serialonly' オプションを付けると、mhn はそれぞれのパートを 決して同時には表示しないようにします。 `-store' オプションを指定すると、mhn は指定されたメッセージの コンテンツを生来の(デコードされた)形式でファイルに格納します。 この際、次の二つの事が決められなければなりません。 そのコンテンツを格納するディレクトリとファイル名です。 ファイルは mhn-storage プロファイル・エントリで指定されたディレクトリ に書き出されます。 例

mhn-storage: /tmp

もし、このエントリが存在しなければ、カレント・ディレクトリが使われます。 mhn は異なるコンテンツをどのように格納すべきかを決めるために、 ユーザーのプロファイルの中の情報を見ます。 これは整形文字列を使うことで達成されます。 整形文字列には以下のエスケープを含む事が出来ます。

%m	メッセージ番号
%P	.パート
%p	パート
%s	サブタイプ

もしコンテンツがマルチパート・コンテンツのサブパートではない場合は、 %p エスケープは無視されます。 もし整形文字列が文字 "+" で始まっている場合、 これらの文字列は無視され、コンテンツはその名前のフォルダに格納されます (整形文字列が文字 "+" だけである場合は、 カレント・フォルダを意味します)。 さらに、 整形文字列が文字 "-" だけである場合は、標準出力を意味します。 まず、 mhn は整形文字列を決めるために、次の形式のエントリを探します。

mhn-store-<type>/<subtype>

もし見つからなかった場合は、 mhn は整形文字列を決めるために、次の形式のエントリを探します。

mhn-store-<type>

もし、見つからなかった場合は、 mhn はそのメッセージが application/octet-stream コンテンツで "type=tar" パラメータを持っていないかをチェックします。 もしそうなら、 mhn は適切なファイル名を使います。 もしコンテンツが application/octet-stream でなかった場合は、 mhn はそのコンテンツが message かどうかをチェックします。 もしそうなら、 mhn は "+" を整形文字列とします。 もしそうでないなら、 mhn は "%m%P.%s" を整形文字列とします。 もし整形文字列が '/' で始まっている場合は、コンテンツは (mhn-storage で与えられたディレクトリやカレント・ディレクトリではなく) 与えられた絶対パスに格納されます。 同様に、 もし整形文字列が '|' で始まっている場合は、 mhn はそのコンテンツを究極的に格納するべきコマンドを実行します。 このコマンドを実行する前には、 mhn は適切なディレクトリに移る点に注意して下さい。 さらに、もし整形文字列が '|' で始まっている場合は、 mhn は整形文字列を処理する際に、表示文字列同様の %a エスケープも 尊重します。 エントリの例は次のような感じです。

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

さらに、 分割メッセージを含むコンテンツを格納しようとする時には、 mhn は全ての分割部分のありかを見つけ、 それに応じてそれらを組み立てようとします。 もし、誰かがメッセージをいくつかの部分に分けて送って来た場合、 それらの全てを一つのフォルダに置いて、次のようにする事が出来ます。

mhn all -store

これで、それらは正しく、各部分の総和を含む一つのメッセージに格納されます。 もし mhn が全ての分割部分を集められなかった場合は、 何も格納はされません。 最後に、 `-auto' オプションが指定された場合で、そのコンテンツに、 そのコンテンツがどういうファイル名に格納すべきかの情報が含まれていた場合は (そしてそのファイル名が '/' で始まらない場合は)、 上述の方式に代わって、そのコンテンツから得られたファイル名が使われます。 `-auto' でない場合は、送り主が指定してきたファイル名は無視される点に 注意して下さい。 message/external-body コンテンツに対しては、 mhn は以下のアクセス・タイプをサポートしています。

afs
anon-ftp
ftp
local-file
mail-server

"anon-ftp" と "ftp" アクセス・タイプに対しては、 もしシステムが TCP/IP への SOCKET インターフェイスをサポートしているなら、 mhn は内蔵の FTP クライアント・ルーチンを使います。 さもなくば、 mhn は、FTP アクセスをするプログラムのパス名を決めるために、 mhn-access-ftp プロファイル・エントリを探します。 例

mhn-access-ftp: myftp.sh

このプログラムは以下の引数と共に起動されます。

FTP サイトのドメイン名
ユーザー名
パスワード
リモート・ディレクトリ
リモート・ファイル名
ローカル・ファイル名
"ascii" または "binary"

このプログラムはファイルの回収が成功した場合にはゼロの終了コードをもって 終了すべきです。 mhn が "Content-ID:" ヘッダーを含む外部参照コンテンツに 遭遇した時、 そのコンテンツがキャッシュを許せば、 mhn のキャッシュ機能に従って、そのコンテンツは読まれ、 キャッシュに書き出されるかも知れません。 mhn のキャッシュ機能は `-rcache' そして `-wcache' オプションで制御されます。 これらはそれぞれ、 キャッシュの際の読まれる時と書き出される時の方針を定義します。 以下の4つの方針のうちの一つが指定できます。 "public" は、mhn が皆がコンテンツのキャッシュにアクセス出来るようにするよう 指示します。 "private" は、mhn がそのユーザー個人のキャッシュを作るよう指示します。 "never" は、mhn がキャッシュを使わないよう指示します。 そして、 "ask" は、mhn がユーザーに尋ねるよう指示します。 コンテンツがキャッシュされるディレクトリは以下の2つがあります。 プロファイル・エントリ mhn-cache は皆が読めるキャッシュを 置くディレクトリを定義します。 そして、 プロファイル・エントリ mhn-private-cache は個人のキャッシュを 置くディレクトリを定義します。 前者は絶対パスのディレクトリ名であるべきです。 例えば、もしシステムのリブートの度にキャッシュが消えるのを気にしないのなら、

mhn-cache: /tmp

という風にしてもいいでしょう。 後者はもし絶対パスでないなら、ユーザーの MH ディレクトリからの相対パスと 考えられます。 例

mhn-private-cache: .cache

(これがデフォルトの値です) message/external-body コンテンツで、アクセス・タイプが "mail-server" のものに遭遇したら、 mhn はそのコンテンツが要求するメールサーバーに メッセージを送信してもいいかどうかを尋ねます。 例

% show 1
Retrieve content by asking mail-server@...
SEND file
? yes
mhn: request sent

あなたの決定がどちらであっても、 mhn はコンテンツに他の何の処理も出来ません。 しかし、 mhn がコンテンツの要求を許された場合(ユーザーが yes と答えた場合)、 それが到着した時に、 元々の message/external-body コンテンツにあった "Content-ID:" 行の値に 対応する行が、送られてきたメッセージのトップレベルにあるべきです。 この時、`-cache' オプションを使って mhn に到着したコンテンツを キャッシュに入れるように指示すべきでしょう。 例

% mhn -cache 2
caching message 2 as file ...

そしたら、 元々の message/external-body コンテンツを再び処理した時には 「正しい事」が起こる事でしょう。 例

% show 1
 ...
mhn プログラムはマルチメディア・メッセージを作成する際に それを手助けする簡単なエディタとしても使えます。 whatnow プログラムから呼ばれた時には、 mhn はドラフトのボディが mhn 作成ファイルとして整形される事を期待します。 この文法は以下の通りです。

   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

基本的に、 ボディは一つまたはそれ以上のコンテンツを含んでいます。 コンテンツは行の最初の文字が "#" になっている事で区別される指令文、 または プレーン・テキスト領域(一行またはそれ以上のテキスト)から成り立ちます。 一つの指令文が複数の行にまたがる場合は、 継続文字 "\" が使われます。 例

#@application/octet-stream; \
    type=tar; \
    x-conversions=compress

指令文には以下の4種類があります。 コンテンツのタイプとサブタイプを名付ける「タイプ指令文」、 同じく、コンテンツのタイプとサブタイプを名付ける「外部タイプ指令文」、 メッセージのダイジェストを転送するために使われる「forw 指令文」、 そして、 マルチパート・コンテンツを作る 「begin 指令文」です。 タイプ指令文には、 タイプとサブタイプの指定が必須です。また文字 ";" で区切って、 パラメータを書く事も出来ます。これは送られるメッセージの "Content-Type" 行のパラメータとなります。 また、そのコンテンツが生来の(デコードされた)形式で保存されているファイル名を 指定する事も出来ます (もしファイル名が文字 "|" で始まっている場合は、 コマンドの出力からコンテンツが得られます)。 もしファイル名が指定されてなかった場合、 mhn は異なるコンテンツをどのように作成すべきかを決めるために、 ユーザーのプロファイルの中の情報を見ます。 そこから作成文字列を引き出し、標準入力をそのコンテンツに設定して、 その作成文字列を /bin/sh で実行する事で達成されます。 作成文字列には以下のエスケープを含む事が出来ます。

%a	付加的な引数
%f	コンテンツが含まれているファイル名
%F	%f 且つ、標準出力はリダイレクトされない
%s	サブタイプ名

まず、 mhn はコンテンツを作成するために使うコマンドを決めるために、 次の形式のエントリを探します。

mhn-compose-<type>/<subtype>

もし見つからなかった場合は、 mhn は作成コマンドを決めるために、次の形式のエントリを探します。

mhn-compose-<type>

もし見つからなかった場合は、 mhn はエラーを出します。 エントリの例は次のような感じです。

mhn-compose-audio/basic: record | raw2audio -F

このようなコマンドはユーザーがログインしている表示環境等に依って 変わるでしょうから、 異なるコンテンツに対する作成文字列の情報は ユーザーのプロファイルに直接書く代わりに 環境変数 $MHN で指定されたファイルに書くべきでしょう。 得られたコンテンツは必要なら base64 形式などでエンコードされ、送り出される メッセージのボディ部分に含められます。 外部タイプ指令文はそのコンテンツ自身を含めるのではなく、 そのコンテンツへの参照を用意します。 送り出されるメッセージでは message/external-body 形式になります。 つまり、 タイプ指令文で使ったようなファイル名を指定するのではなく、 外部参照のパラメータを使います。 これらは通常のパラメータと区別するために、 分離して書かれなければなりません。 例

#@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"

"[]" を指定することで、 空の説明文が指定され、 外部参照のパラメータの始まりが認識されます。 これらのパラメータは以下のような形式をしています。

access-type=	通常 anon-ftp または mail-server
name=	ファイル名
permission=	read または read-write
site=	ホスト名
directory=	ディレクトリ名 (無くても良い)
mode=	通常 ascii または image (無くても良い)
size=	バイト数
server=	メールアドレス
subject=	送られる Subject
body=	メールサーバーに送られるコマンド

forw 指令文には フォルダ名と転送されるメッセージを指定する事も出来ます。 もしフォルダが指定されなかった場合の デフォルトはカレント・フォルダです。 同様に メッセージが指定されなかった場合の デフォルトはカレント・メッセージです。 送り出されるメッセージでは message/rfc822 形式になります。 従って、 forw 指令文は メッセージの取り込みに RFC-934 ルールではなく、MIME ルールを使うという 点を除けば、forw (1) コマンドに似ています。 `-rfc934mode' オプションを使うと、mhn は RFC-934 ルールを使って、メッセージの取り込みをします。 このオプションを指定しておくと、 RFC-934 を満たすユーザー・エージェントは受けとったメッセージを 分割する事が出来ます。 -- 取り込まれたメッセージが さらに取り込まれたメッセージを含まないようにします。 この方法の欠点は、取り込まれたそれぞれのメッセージ・ボディの最後に 余分な改行が追加されてしまう点です。 begin 指令文には、 begin と end の組の間に 少なくとも一つのコンテンツが指定されてなければなりません。 これら全ての指令文には コンテンツの短い説明文を文字 "[" と文字 "]" の間に含める 事が出来ます。 これは送り出されるメッセージでは "Content-Description" 行に 入ります。 また、デフォルトでは、 mhn はそれぞれの指令文に対して、一意的な "Content-ID:" 行を 生成します。 しかし、 ユーザーは文字 "<" と ">" を使って、 ID を自ら定義する事が出来ます。 これらは全て同時に使う事が出来ます。 以下にユーザーのメッセージ・フォーム・ファイルの簡単な例を挙げます。

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

後の例のために、 このメッセージ・フォーム・ファイルを mhncomps と呼ぶ事にします。 既に述べたように、ドラフトには指令文に加えて、 プレーン・テキスト領域を置く事が出来ます。 プレーン・テキスト領域は次の指令文が現われるまで、 またはドラフトの最後までの部分が集められ、テキスト・コンテンツを形成します。 プレーン・テキスト領域で行頭に文字 "#" を含めたい場合は それを2つ続けます。 例

## この行は送出されると、行の最初は一つの # だけになる。

もし、プレーン・テキスト領域を指令文より前に終らせたい場合、 例えば、 二つのプレーン・テキスト・コンテンツを連続させたい場合は、 単に一つの "#" 文字だけを含む行を挿入します。 例

これは最初のコンテンツです。
#
そしてこれは二番目です。

最後に、 プレーン・テキスト領域が次の形式の行で始まっている場合、

Content-Description: text

これがそのプレーン・テキスト・コンテンツの説明文として使われます。 注意: この行はテキストを始める前に空行と共に使わなければなりません。 デフォルトでは、 プレーン・テキスト領域は text/plain コンテンツとして使われます。 これはプレーン・テキスト領域を "#<" とタイプ指定で 始める事で、変更可能です。 例

#<text/richtext
このコンテンツは text/richtext になります。
#
このコンテンツは text/plain になります。

もし "#<" 指定を使う場合は、 コンテンツの説明文はこのタイプ指定と同じ行に書かなければならない 点に注意して下さい。 mhn はプレーン・テキスト領域については、それがテキスト・コンテンツなら、 そこで使われている文字コードを調べます。そして、ASCII 文字のみで構成されて いるなら自動的に charset="us-ascii" パラメータをつけます。 また、8ビット・テキストである場合は、環境変数 $MM_CHARSET が調べられ、 そこに設定されている値が charset の値として使われます。 またこの時、本文は適切に quoted-printable 形式などでエンコードされます。 なお、`-8bit' オプションが指定されている場合は、このエンコードは行なわず、 生の 8bit のまま送り出すようになります。 また、ISO-2022-JP コードで書かれている場合も適切に charset の値が設定されます。 `-junet' オプションが指定されている場合は、ドラフト・ファイルをまず、 ISO-2022-JP コードに変換した後に、この処理を行なうようになります。 mhn が成功すると、 元々のドラフト・ファイルは、 文字 "," (またはサイト依存のオプション SBACKUP の値)で 始まり、".orig" で終るファイル名にリネームされます。 例えば、 "draft" というファイルを編集してた場合、 ",draft.orig" というようなファイル名になります。 これを使えば、mhn で作成したファイルを簡単に元に戻す事が出来ます。 `-check' オプションを指定すると、 mhn はそれぞれのコンテンツの完全性をチェックします。 つまり、そのチェック結果を "Content-MD5" 行に書き出します。 MH では .mh_profile に以下の行を追加しない限り、 自動的には mhn は呼び出さない事に注意して下さい。

automhnproc: mhn

これをしない時は、 ドラフトを送る前に明示的に以下のコマンドを使わなければなりません。

What now? edit mhn

これをする事を忘れないようにするために、MH を調整する事が出来ます。 プロファイルに以下の行がある事を想定してみて下さい。

mcomp:          -editor mprompter -form mhncomps
mprompter:      -noprepend -norapid
mprompter-next: mhn

ここで、mcomp は comp (1) へのリンクで、 mprompter は prompter (1) へのリンクです。 この時、上述のメッセージ・フォーム・ファイル mhncomps を使って メッセージを送る手順は以下の通りです。

% mcomp
To: user@host
cc:
Subject: multi-media message
--------
#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
このメッセージは3つのコンテンツを含んでいます。
<CTRL-D>
--------
What now? edit (これは mhn を呼び出します)
What now? send

付加的な edit コマンドを打たなければならない事を忘れないようにしなければ なりませんが、それはやりとりから、かなり明らかな事でしょう。 最後に、 プロファイルに以下の行を追加する事を考えるべきでしょう。

lproc: show

この場合、 mhn をエディタとして呼び出した後で、list を打った場合、

What now? list

あなたの期待するように動くでしょう。 あなたがファイルの束を誰かに送ろうと思ったら、 シェルスクリプト viamail を走らせる事が出来ます。 これは tarmail コマンドに似たものです。

/usr/local/lib/mh/viamail mailpath "subject" files ...

viamail は指定されたファイルやディレクトリを tar (1) で まとめた後、圧縮し、`subject' と共に `mailpath' へと送ります。 この圧縮ファイルはその大きさによって、 自動的に複数のメッセージへと分割されます。 viamail がそれぞれの分割メッセージを送った後、しばらく 待ってから次を送って欲しいと思うかも知れません。 これは通常、sendmail を走らせていて、多数の分割メッセージが作られる ような時でしょう。 もし viamail への最初の引数がダッシュ(`-')で始まっている場合、 これはそれぞれの送出の間に待つべき秒数を表わします。 例

/usr/local/lib/mh/viamail -300 mailpath "subject" files ...

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

% 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
-- メッセージのヘッダー部分とそれに続いて tar の一覧表示がされる。
% mhn -store last
% uncompress < 5.tar.Z | tar xvpf -

または、 `-auto' オプションを付けると、 mhn は自動的に展開までやってくれます。 例

% 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
-- メッセージのヘッダー部分とそれに続いて tar の一覧表示がされる。
% mhn -store -auto last
-- tar が自動的にファイルの一覧を表示しながら展開もする。

二番目の例では、自動的に tar でファイルが展開されます。 慎重なユーザーは決して `-auto' を .mh_profile ファイルには 書かないでしょう。 正しい手順はまず `-show' でどんなファイルが展開されるのかを確かめる事です。 それから mhn を `-store' と `-auto' を付けて起動し、展開をします。 mhn がどう処理すべきかは表示環境等に依って 変わるでしょうから、 mhn は環境変数 $MHN を見ます。 これが設定されている場合、 これは付加的なユーザー・プロファイルの名前を指定します。 つまり、 ユーザーがある表示装置にログインした時、 この環境変数には、その表示装置に適した設定が書いてあるファイルを参照するような 値を設定すべきでしょう。 通常、 以下の形式のエントリだけが必要だと思われます。

mhn-show-<type>/<subtype>
mhn-show-<type>

最後に、 mhn はもう一つの付加的なユーザー・プロファイルを参照しようとします。 e.g.,

/usr/local/lib/mh/mhn_defaults

これは MH のインストールの際に自動的に作られます。
$HOME/.mh_profile    ユーザーのプロファイル
$MHN    付加的なプロファイル・エントリ
/usr/local/lib/mh/mhn_defaults    システム・デフォルトのプロファイル・エントリ
/usr/local/lib/mh/mhl.headers    ヘッダーのテンプレート
Path:    ユーザーの MH ディレクトリを決める
Current-Folder:    デフォルトのカレント・フォルダを示す
mhlproc:    メッセージ・ヘッダーを表示するデフォルトのプログラム
mhn-access-ftp:    FTP でコンテンツを回収するプログラム
mhn-cache    外部コンテンツをキャッシュする共用ディレクトリ
mhn-charset-<charset>    文字集合を表示するための環境のテンプレート
mhn-compose-<type>*    コンテンツを作成するためのテンプレート
mhn-private-cache    外部コンテンツをキャッシュする個人ディレクトリ
mhn-show-<type>*    コンテンツを表示するためのテンプレート
mhn-storage    コンテンツを格納するディレクトリ
mhn-store-<type>*    コンテンツを格納するためのテンプレート
moreproc:    text/plain コンテンツを表示するデフォルトのプログラム
mhl(1)
MIME: Format of Internet Message Bodies (RFC-2045),
MIME: Media Types (RFC-2046),
MIME: Message Header Extensions for Non-ASCII Text (RFC-2047),
Proposed Standard for Message Encapsulation (RFC-934).
`+folder'    デフォルトはカレント・フォルダ
`msgs'    デフォルトは cur
`-noauto' `-nocache' `-nocheck' `-noebcdicsafe' `-form mhl.headers' `-headers' `-pause' `-rcache ask' `-realsize' `-rfc934mode' `-noserialonly' `-show' `-noverbose' `-wcache ask' `-nojunet' `-no8bit' フォルダが指定されると、それがカレント・フォルダになります。 最後に選択されたメッセージがカレント・メッセージになります。 マルチパート・コンテンツの中に分割メッセージが含まれている場合は、 `-store' オプションでうまく集めることが出来ません。