mime-construct - MIME メッセージを生成し、(指定されれば) メールする
mime-construct switch...
申し訳ないが、意味のある概略を示すのは難しい。例を見てほしい。
mime-construct は MIME メッセージを生成し、(デフォルトでは) メールする。 このコマンドは完全にコマンドラインから制御される。 他のプログラム (あるいはプログラムのように振舞いたい人) によって利用されることを想定して設計された。
これらの引き数は、メッセージのトップレベルヘッダにテキストを追加する。 またメッセージの送信先を制御する。
このスイッチは sendmail に -t スイッチを渡す (mime-construct はユーザが与えたヘッダを解釈しない)。 したがってメッセージの送信先をヘッダで指定していない場合は、 本当にまったく何も行われない。
multipart/mixed
である。
boundary
の設定は mime-construct が与えるので、
ここには書かないこと。
--multipart type を指定して、メッセージをシングルパートにしても構わない。 このときは与えた type は単に無視される。
このテキストにはデフォルトは無い。 どうやら最近では、 メッセージの先頭に MIME の説明を書くのは、 飛行機に乗った人にシートベルトの締め方を説明するのと 同じような扱いになったようだ。
メッセージがシングルパートになってしまった場合に、 --prelude を指定していても構わない。 このテキストは単に無視される。
これらのスイッチは、パート毎ヘッダ (per-part header) を制御する。 メッセージが multipart ではなくなった場合には、 これらは実際にはトップレベルのヘッダにデータを追加することになる。
これらはすべて、すぐつぎのパートの出力にしか適用されない。 各パートが出力されると、それぞれデフォルトの値にリセットされる。 これらのスイッチを指定して、後続のパートを指定しないのは意味をなさない。 よってそのようにすると、 mime-construct は文句を撒き散らして死ぬ。
filename
属性の値を name にして
Content-Disposition: attachment
ヘッダを追加する。
mime-construct はファイルを添付して送信する場合に良く用いられるので、
これはその利便のためのものである。
--attachment name を用いても、 mime-construct が name というファイルから 実際にデータを読むわけではないことに注意。 これは単にヘッダでの名前に過ぎない。 メッセージのこのパートに入るべき実際のデータは、 通常の「パート出力」スイッチ (後述) から読み込まれる。
与えるデータは、エンコード済のものであってはならない。 mime-construct は、データをここで指定した type に従って実際にエンコードする。 有効なエンコード形式は、 7bit, 8bit, binary, quoted-printable, base64 である。 エンコードを自分で指定すると、簡単に不正な MIME メッセージになりうる。
text/plain
になる。
type には type のプロパーだけでなくオプションを含めることもできる。
この全部が単に Content-Type:
の後に追加され、
ヘッダに積まれる。
これらのスイッチはデータをメッセージの本文に追加する。 このうちのひとつを、multipart メッセージの各パートにつきひとつずつ指定する (または multipart メッセージでなければ一つだけを指定する)。
str の末尾に改行がないと思われる場合は、含めるようにすること。
末尾の改行がないと、
このパートは base64
でエンコードされることになってしまうだろう
(なぜなら quoted-printable
にはこのようなデータストリームを
エンコードできないような制限が人為的に導入されているからである)。
通常 path や str は、前に別の 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
) なども使える。
詳細は perlfunc の open()
の説を参照のこと。
これは 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>