Debian パッケージ courier-maildrop

makemime

名称

makemime -- MIMEフォーマットのメッセージの作成

書式

makemime [options...]

makemime [@filename]

説明

makemimeは任意の階層を持った MIMEフォーマットのメッセージを作成します。 makemimeは別個のファイルを複数読み込み、 MIMEエンコードし、基本のMIMEヘッダを追加し、 コマンドラインで指定されたヘッダを追加します。 結果は別のファイルに書き出すか、標準出力に出力されます。 複合MIMEフォーマットのメッセ—ジを作成するには、makemimeを複数のパイプラインで組み合わせます。 オプション指定によりmakemime自身に fork() させて、パイプライン設定の面倒をやってもらえます。

makemimeへのオプションはコマンドラインで直接指定します。 あるいは @filename でファイルからオプションを読み込ませることもできます。 "@&n" はオプションをファイルデスクプリタ n番から読み込みます。 "@-" は "@&0"の省略形で、オプションを標準入力から読み込みます。

オプションがファイルやパイプから読み込まれる場合、 各オプションごとに1行でなければなりません。 引数を伴うオプションでは、その引数は次行に続けて記述します。

オプションがファイルやパイプから読み込まれる場合、 前置された空白は無視されます。 また、空行や'#'文字ではじまる行も無視されます。

オプションとその引数にはシェルにとって特別な意味を持つ文字、 例えば('や')'を含む場合があります。 これらの文字はコマンドラインからの指定ではシェルに解釈されないように バックスラッシュでエスケープしなければなりません。 オプションがファイルやパイプから読み込まれる場合には これらの文字にバックスラッシュを付けてはいけません。 また、ヘッダの内容は空白を含む場合が多く、 コマンドラインでは "..." 等で囲まなければなりません。 これもファイルやパイプから読み込まれる場合には、 "..." 等で囲む必要はありません。

makemimeはMIME化すべき内容を別のファイルから読み込みます。 これにはパイプを指定することもできます。 オプションと内容とで同じパイプから読み込むこともできます。 この場合、単独の "-" だけの行がオプションの終わりを表し、 パイプ入力の残りは入力内容として扱われます。 (そのように扱うようにオプションで指定する必要がありますが。) もちろん、1つのパイプから入力される内容ファイルは1つだけです。

MIMEの概要

MIMEフォーマットのメッセージはいくつかのMIMEセクションを含みます。 MIMEヘッダにはいくつかのMIMEセクション全体をどう扱うか (例えば単にまとめられているとか、同じ内容の別の表現だとかとか)が記述されます。 この文ではMIMEについて簡単簡素に概説します。 この説明はmakemimeユーティリティの機能に主眼を置いています。 MIMEフォーマット化メッセージについて詳細は RFC 2045RFC 2046RFC 2047RFC 2048RFC 2049を参照してください。

MIMEメッセージ中で各ファイルは独立したMIMEセクションを構成します。 MIMEセクションは最低1行のヘッダ、 "Content-Type:"を含みます。 "Content-Type:"ヘッダはファイルがどんな種類のデータなのかを示します。 他のヘッダもありますが、その順番は問われません。 MIMEヘッダの後に空行が続き、 適切にエンコードされたファイルの中身が続きます。 makemimeでエンコードされた場合は必ず "Content-Transfer-Encoding:"という別のヘッダが追加されます。 このヘッダはファイルがどのようにエンコードされたのかを示すもので、 なくてもかまいませんが makemimeでは必ず付け加えられます。

このヘッダがない場合、MIMEエンコードは "7bit"が標準で用いられます。 7bitエンコーディングは US-ASCII文字だけで構成されたテキストファイルの場合にのみ使用できます。 "8bit"エンコーディングは上位ビットも利用している文字コード体系の テキストファイルの場合に使用されます。 8ビットエンコーディングには"quoted-printable"というものもあります。 "base64"エンコーディングは、 (テキストデータ以外の) バイナリデータを含むファイルの場合に用いられます。

テキスト文書を含むMIMEセクションは、 "Content-Type:"ヘッダを"text/plain"に、HTML文書の場合には "text/html"に設定します。 他にもほとんど用いられることのないいくつかの内容タイプがあります。 他の内容を含むMIMEセクションには別の "Content-Type:"ヘッダが適切に付けられます。たとえば、 "image/gif"とか、"audio/x-wav"とかです。

テキストの内容をもつMIMEセクションが base64エンコーディングを使用してもかまいません。 7bit8bitquoted-printableのエンコーディングの使用は限定されません。 "text/pdf"セクションはPDFファイルを示しますが、 たいていバイナリデータを含むので base64エンコーディングが用いられます。 また、通常バイナリデータとなる image/gifaudio/x-wavの場合でも、base64以外のエンコーディングを用いることができます。 ただし、それが印刷可能な文字だけで構成できる場合です。 (そんなことはまずありえませんけれども。)

MIMEセクションは他の任意のヘッダを持つことがあります。 例えば "Content-Disposition:"や "Content-ID:"や "Content-Name:"です。 これらのヘッダの使い方について詳しくは適切なRFCを参照してください。 これらのヘッダはあとで説明するようにmakemime-aオプションを指定することにより追加できます。 これらのヘッダはMIMEフォーマットのメッセージを作成するときの全体の構造には 影響しませんし、makemimeはこれらのヘッダを解釈しません。 単純に要求に従いそれらを追加するだけです。

複数のファイルが単一のMIMEメッセージに構成されるには次の手順を踏みます。 まず最初に個別のファイルのMIMEセクションが作成され、 そしてそれらを含む単一のMIMEセクションが作成されます。 "multipart/mixed"というMIMEセクションは 異なるものの複数のMIMEセクションをまとめたものです。 "multipart/alternative"というMIMEセクションは 同じものの別々の表現、 例えば単純なテキスト表現とHTML表現されたメッセージのような MIMEセクション同士をまとめたものです。 他の"multipart"のMIMEセクションについてはそれぞれのRFCで定義されています。

単一のMIMEセクションの作成

makemime {-c "type"} [-e "encoding"] [-o outputfile] [-C "charset"] [-N "name"] [-a "header: value"...] {filename}

-cオプションで指定された filenameが読み込まれ、エンコードされ、 "Content-Type: type"ヘッダと "Content-Transfer-Encoding:"ヘッダが追加され、標準出力に出力されます。typeにはmultipart以外の有効なMIMEタイプを指定します。 filenameに "-" を指定すると標準入力から読み込まれます。 filename に "&n" を指定するとファイルデスクプリタn番から読み込まれます。

-Cオプションはtext/plainでのcharsetアトリビュートを設定します。 -Nオプションは Content-Type:ヘッダの nameアトリビュートを設定します。

encoding引数は指定すべきで、指定することには重要な効果があります。 しなければなりません。 encodingは次のうちどれかでなければなりません: 7bit8bitquoted-printablebase64

もしencodingが指定されない場合、 makemimefilename ファイルを2回読み込みます。 1回目でどのエンコーディング手法を使うのがいいか判断し、 2回目で実際にfilenameの内容をエンコードします。 もし filename がパイプの場合には、makemime は一時ファイルを作成します。これは filenameが大きなサイズの場合には非効率です。 しかしfilenameのサイズが小さい場合には makemimeにエンコーディングを判断させるのは便利です。

encoding を指定しないでさらに typeautoを指定することができます。 この場合には、判断されたencodingに基づいて、 "Content-Type:"ヘッダをtext/plainapplication/octet-streamに自動設定します。

通常はMIMEセクションを標準出力に出力しますが、 -oオプションで outputfileを指定するとそこへ出力します。outputfile は "&n"の形式でも指定でき、 この場合はファイルデスクプリタ n番に出力されます。

makemimeはその他のヘッダを自動生成しません。 特に、 "Mime-Version:" ヘッダはMIMEフォーマットの電子メールには必要です。 追加するヘッダは-aオプションで指定できます。複数のオプション指定で複数のヘッダが追加できます。 makemimeはMIMEセクションにヘッダを追加すること以上のことを行いません。

"Mime-Version:"ヘッダは最上位レベルのMIMEセクションでのみ必要です。 複合MIMEにまとめられる個別のMIMEセクションにはこのヘッダは不要です。

注:

-cオプションは最初に指定しなければなりません。 残りのオプションは -c オプションの後に指定します。

複合MIMEコレクションの作成

makemime {-m "multipart/type"} [-e "encoding"] [-o outputfile] [-a "header: value"...] {filename}

-mオプションは -cオプションと似ていますが、3つの点で異なります。

typeは "multipart/mixed"か "multipart/alternative"か、あるいは他の種類の複合(multipart)タイプでなければなりません。 さらに、"encoding"は "7bit" か "8bit" のどちらかで、指定されない場合 "8bit" になります。さらに、 filenameは普通のファイルではなく、 MIMEセクションでなければなりません。 通常、 filenameファイルは直前に実行されたmakemimeにより作成されたものですが (-c オプションのようにパイプを指定してつなげることもできます) 、他の手段で作成されたものでもかまいません。

-mオプションはfilenameで指定された1つのMIMEセクションだけを含む、 複合MIMEコレクションを作成します。 出力は標準出力か、パイプかoutputfileになります。

複合MIMEコレクションへの追加

makemime {-j file1} [-o outputfile] {file2}

このオプションでは複合MIMEコレクションにMIMEセクションを追加します。 file1は以前に-mオプションで作成された複合MIMEコレクションです。 file2は以前に-cオプションで作成されたMIMEセクションです。 -jオプションは file2のMIMEセクションを file1の複合MIMEコレクションに追加します。 結果は標準出力に出力されるか、 outputfileに出力されます。

file1file2 は "@&n" 形式で指定することも可能で、この場合ファイルデスクプリタ n番から読み込まれます。 outputfileもファイルデスクプリタで指定可能です。

file1file2makemime により作成されるのが理想です。 もちろん他のソフトウェアで作成されたMIMEフォーマットのファイルを 用いることもできますが、注意深く行ってください。 makemimeはMIME解析用ではなく、MIME作成用ツールです。 既存の複合MIMEコレクションにMIMEセクションを追加するためには いくらかのMIMEの解析が必要です。 複合MIMEコレクションのMIMEヘッダが簡単な場合には makemimeによる解析はうまくいきます。が難解なMIMEヘッダの場合にはmakemimeがこんがらがってうまく扱えないかもしれません。

再帰的な複合MIMEコレクション

複合MIMEコレクションはMIMEセクションだけでなく、 他の複合MIMEコレクションを含むことができます。 -m オプションと -j オプションにはMIMEセクションの代わりにそのまま複合MIMEコレクションを 指定することができます。 複合MIMEコレクションはMIMEセクションの特別な種類にすぎないからです。 次の例では単純テキストあるいはHTMLとして表示可能な文書に、 添付ファイルをつける例を考えてみます:

1. text/plain MIMEセクションと text/html MIMEセクションを持つ、複合MIMEコレクションを作成します。

2. 上で作成された複合MIMEコレクションと、 添付ファイルのMIMEセクションを持つ、 複合MIMEセクションを作成します。

こんな感じになります:

# メッセージのテキスト版とHTML版それぞれにMIMEヘッダを追加

makemime -c "text/plain; charset=iso-8859-1" -o tmp1.txt msg.txt
makemime -c "text/html; charset=iso-8859-1" -o tmp1.html msg.html

# それらを1つのmultipart/alternative複合コレクションに結合

makemime -m "multipart/alternative" -a "Content-Disposition: inline" \
                                    -o tmp.ma1 tmp1.txt
makemime -j tmp.ma1 -o tmp.ma2 tmp1.html

# 添付画像にMIMEヘッダを追加

makemime -c "image/gif" -a "Content-Disposition: attachment" \
                        -o tmp2.gif attachment.gif

# 全部をまとめたmultipart/mixed複合コレクションを作成

makemime -m "multipart/mixed" -a "Mime-Version: 1.0" \
                              -o tmp.mm1 tmp.ma2
makemime -j tmp.mm1 -o output.msg tmp2.gif

output.msgファイルに MIMEコレクションが出来上がります。 Subject:From:To:の各ヘッダを付け加えて (もちろん -aオプションで指定することもできます)、 そのまま送信可能です。

パイプによる複合MIMEの作成

複数のMIMEセクションから複合MIMEを作成するにはいくつか方法があります。 1つは各MIMEセクションを一時ファイルに作成して、それを あとで1つの複合MIMEコレクションにまとめる方法です。 もう1つのちょっと複雑な方法は、パイプでmakemime同士をつなぐことにより、 一時ファイルを作成せずに済ませる方法です。

この方法は手動でも実行できますが、makemimeに自動的に行わせることもできます。makemimeはパイプを自ら設定して自分自身を複数起動することにより 1つのMIMEコレクションにまとめます。 その複雑さの度合いは、 システムのオープン可能なファイル/パイプ数に制限されます。

-c-m-j各オプションで、入力ファイル名の代わりに、 左括弧、追加オプション、右括弧を書くことができます。 ( -oオプションは出力ファイルの指定なのでここには含まれません。) 左括弧および右括弧は単独の引数です。 通常、makemimeでは-c-m-jオプションはどれか1つしか指定できませんが、 左括弧と右括弧の間に追加の -c-m-jオプションを書くと、括弧内部の出力が、 外側への入力であると解釈されます。 直前の例では、3番目と4番目のmakemimeの起動は以下のように1つで書くことができます:

makemime -j \(                                           \
               -m "multipart/alternative"                \
               -a "Content-Disposition: inline" tmp1.txt \
             \) -o tmp.ma2                               \
             tmp1.html

シェルによる解釈を防ぐために括弧の前にバックスラッシュが追加されていることに 注意してください。 オプションをファイルから与える場合には、 オプションファイルは以下のようになります:

-j
   (
      -m
          multipart/alternative
      -a
          Content-Disposition: inline
      tmp1.txt
   )
   -o
      tmp.ma2
 tmp1.html

この構造はメモリとリソースの許す限り、いくつでもネストすることができます。 以前の例をすべてこの方法で書くと以下のようになります:

makemime -j                                                 \
         \(                                                 \
            -m "multipart/mixed"                            \
            -a "Mime-Version: 1.0"                          \
            \(                                              \
                -j                                          \
                \(                                          \
                   -m "multipart/alternative"               \
                   -a "Content-Disposition: inline"         \
                   \(                                       \
                      -c "text/plain; charset=iso-8859-1"   \
                      msg.txt                               \
                   \)                                       \
                \)                                          \
                \(                                          \
                    -c "text/html; charset=iso-8859-1"      \
                    msg.html                                \
                \)                                          \
            \)                                              \
         \)                                                 \
         -o output.msg                                      \
         \(                                                 \
            -c "image/gif"                                  \
            -a "Content-Disposition: attachment"            \
            attachment.gif                                  \
         \)

オプションをファイルから与える場合には:

-j
(
   -m
       multipart/mixed
   -a
       Mime-Version: 1.0
   (
       -j
       (
           -m
               multipart/alternative
           -a
               Content-Disposition: inline
           (
               -c
                   text/plain; charset=iso-8859-1
               msg.txt
           )
       )
       (
           -c
               text/html; charset=iso-8859-1
           msg.html
       )
   )
)
-o
   output.msg
(
   -c
       image/gif
   -a
       Content-Disposition: attachment
   attachment.gif
)

関連項目

maildrop(1), maildropfilter(5), reformail(1), reformime(1), egrep(1), grep(1), courier(8), sendmail(8), RFC 2045, RFC 2046, RFC 2047, RFC 2048, RFC 2049.