名前

mime-construct - MIME メッセージを生成し、(指定されれば) メールする


書式

mime-construct switch...

申し訳ないが、意味のある概略を示すのは難しい。例を見てほしい。


説明

mime-construct は MIME メッセージを生成し、(デフォルトでは) メールする。 このコマンドは完全にコマンドラインから制御される。 他のプログラム (あるいはプログラムのように振舞いたい人) によって利用されることを想定して設計された。


オプション

グローバル設定

--debug
デバッグをオンにする。

--help
利用法を示して die する。

--output
生成したメッセージをメールせず、標準出力に表示する。 これを用いると --bcc の情報は失われる。

--subpart
トップレベルの MIME メッセージではなく、 他の MIME メッセージから利用可能な subpart を生成する。 これを指定すると --output が有効になり、 内部的な記号の意味も少々変わる。例を見てほしい。

--version
このオプションのみが指定された場合はバージョンを表示して成功終了する。 他のオプションが指定された場合はバージョンを表示して die する。

メインヘッダ

これらの引き数は、メッセージのトップレベルヘッダにテキストを追加する。 またメッセージの送信先を制御する。

--bcc address
address を送信リストに追加する。 もちろんこのとき、実際にはヘッダには何も追加されない。 実際にはメールを送信しないとき (--output--subpart を用いたとき) は、--bcc は何の効果も持たない。

--cc address
addressCc: のリストに追加する。

--embedded-to
生成されたメッセージを、 --to, --cc, --bcc で指定された宛先に加え、 既にヘッダにリストされている送信先にも送る。 これが意味を持つのは、 --header スイッチを使って、自前で To:, Cc: などのヘッダを追加した場合である。 この場合は --to--cc は用いないほうが良い。 これらのオプションは、 既にメッセージにあるヘッダにエントリを追加するのではなく、 新しいヘッダを生成してしまうからである。

このスイッチは sendmail に -t スイッチを渡す (mime-construct はユーザが与えたヘッダを解釈しない)。 したがってメッセージの送信先をヘッダで指定していない場合は、 本当にまったく何も行われない。

--header str
任意のテキストをヘッダに追加する。 str は何でも良く、複数行でも構わない。 このようにすれば不正なメッセージを生成することもできる。 str に空行を入れれば、メッセージを台無しにもできる。

--multipart str
multipart の content type とオプションを指定する。 デフォルトは multipart/mixed である。 boundary の設定は mime-construct が与えるので、 ここには書かないこと。

--multipart type を指定して、メッセージをシングルパートにしても構わない。 このときは与えた type は単に無視される。

--prelude str
str をマルチパートの序文 (prelude text) に追加する。 --prelude を複数回指定すると、 それらの str は結合されて用いられる。

このテキストにはデフォルトは無い。 どうやら最近では、 メッセージの先頭に MIME の説明を書くのは、 飛行機に乗った人にシートベルトの締め方を説明するのと 同じような扱いになったようだ。

メッセージがシングルパートになってしまった場合に、 --prelude を指定していても構わない。 このテキストは単に無視される。

--subject str
メッセージの subject を指定する。

--to address
addressTo: リストに追加する。

パート毎ヘッダ

これらのスイッチは、パート毎ヘッダ (per-part header) を制御する。 メッセージが multipart ではなくなった場合には、 これらは実際にはトップレベルのヘッダにデータを追加することになる。

これらはすべて、すぐつぎのパートの出力にしか適用されない。 各パートが出力されると、それぞれデフォルトの値にリセットされる。 これらのスイッチを指定して、後続のパートを指定しないのは意味をなさない。 よってそのようにすると、 mime-construct は文句を撒き散らして死ぬ。

--attachment name
filename 属性の値を name にして Content-Disposition: attachment ヘッダを追加する。 mime-construct はファイルを添付して送信する場合に良く用いられるので、 これはその利便のためのものである。

--attachment name を用いても、 mime-constructname というファイルから 実際にデータを読むわけではないことに注意。 これは単にヘッダでの名前に過ぎない。 メッセージのこのパートに入るべき実際のデータは、 通常の「パート出力」スイッチ (後述) から読み込まれる。

--encoding type
このパートに対して指定したいエンコード形式を指定する。 しかし通常はこのスイッチは用いるべきでない。 このスイッチが指定されなければ、 mime-construct が適切なエンコード形式を選択する。

与えるデータは、エンコード済のものであってはならない。 mime-construct は、データをここで指定した type に従って実際にエンコードする。 有効なエンコード形式は、 7bit, 8bit, binary, quoted-printable, base64 である。 エンコードを自分で指定すると、簡単に不正な MIME メッセージになりうる。

--part-header str
任意のテキストをパート毎ヘッダに追加する。 str は何でも良く、複数行でも構わない。 このようにすれば不正なメッセージを生成することもできる。 str に空行を入れれば、メッセージを台無しにもできる。

--type type
指定しないとデフォルトは text/plain になる。 type には type のプロパーだけでなくオプションを含めることもできる。 この全部が単に Content-Type: の後に追加され、 ヘッダに積まれる。

パート出力

これらのスイッチはデータをメッセージの本文に追加する。 このうちのひとつを、multipart メッセージの各パートにつきひとつずつ指定する (または multipart メッセージでなければ一つだけを指定する)。

--file path
--string str
ファイル path の内容か、 文字列 str をこのパートの本文に用いる。

str の末尾に改行がないと思われる場合は、含めるようにすること。 末尾の改行がないと、 このパートは base64 でエンコードされることになってしまうだろう (なぜなら quoted-printable にはこのようなデータストリームを エンコードできないような制限が人為的に導入されているからである)。

--subpart-file path
--subpart-string str
pathstr の内容を、このパートの本文とするのではなく、 このパートのサブパートとして扱う。 すなわちこれらのデータにはヘッダとテキストの両方が含まれているとみなす。 またこのパートに対しては、--type--encoding も用いてはならない。

通常 pathstr は、前に別の mime-construct--subpart スイッチ付きで実行した出力であることが多いだろう。

--file および --subpart-file に与える引き数には、ちょっとした仕掛けをすることもできる。 与えた path に対応するファイルがない場合は、 これに対して通常の Perl の open() が適用される。 を見よ。


これらの例では、$nl には改行文字が含まれているとする。 他の変数の内容も、それぞれ単語が意味する通りである。

シンプルなメッセージを送信する。

    mime-construct --to "$recip" --subject 'hi there' --string "$body"

標準入力からメッセージを読み込んで送信する。

    fortune | mime-construct --to "$recip" --subject fortune --file -

ほとんどの人は、添付ファイルは multipart メッセージだと思っているが、 実はそうでなくても良い。この例はカレントディレクトリのすべてのファイルを zip でまとめ、シングルパートメッセージの添付ファイルとして送信する。

    zip -q - * |
        mime-construct --to "$recip" --subject 'zipped directory' \
            --attachment dir.zip --type application/zip --file -

これは zip ファイルを multipart メッセージの添付ファイルとして送信し、 先頭のパートに適当なテキストを追加している。

    mime-construct --to "$recip" --subject 'Mars or bust' \
        --string "$explanatory_text" \
        --type application/zip --attachment $zip --file $zip

与えるファイル名に対しては、Perl の open() に対する表現をすべて利用できる。 例えば以下のようにすれば複数のプロセスを起動できる。

    mime-construct --to "$recip" --subject "$subject" \
        --string "Here are those two files you wanted.$nl" \
        --type application/x-gzip --file 'gzip -c file1 |' \
        --type application/x-gzip --file 'gzip -c file2 |'

あるいは通常以外のファイルディスクリプタ (ディスクリプタ 4 から読み込むなら<&=4) なども使える。 詳細は perlfuncopen() の説を参照のこと。

これは mime-construct を複数回起動し、 subpart を生成する例である。 これはトップレベルに 2 つのパートを含むメッセージを生成する。 最初のパートは何らかのテキストで、 二番目のパートはダイジェストである。 後者のダイジェスト自体も、 たくさんの messages/rfc822 パートからなるマルチパートメッセージになっている。

    msg_args=
    for msg in $msg_list
    do
        msg_args="$msg_args --type message/rfc822 --file $msg"
    done
    set fnord
    for recip in $recip_list
    do
        set "$@" --bcc $recip
    done
    shift
    mime-construct --subpart --multipart multipart/digest $msg_args |
        mime-construct \
            --header "To: Digest recipients:;$nl" \
            --subject 'Foo digest' \
            "$@" \
            --file $introduction \
            --subpart-file -


バグ

メッセージ本文は常にメモリに保存される。 よってシステムのメモリよりも大きな本文を扱おうとすると問題が起きるだろう。


著者

Roderick Schertler <roderick@argon.org>