=head1 名前 mime-construct - MIME メッセージを生成し、(指定されれば) メールする =head1 書式 B I... 申し訳ないが、意味のある概略を示すのは難しい。例を見てほしい。 =head1 説明 B は MIME メッセージを生成し、(デフォルトでは) メールする。 このコマンドは完全にコマンドラインから制御される。 他のプログラム (あるいはプログラムのように振舞いたい人) によって利用されることを想定して設計された。 =head1 オプション =head2 グローバル設定 =over 4 =item B<--debug> デバッグをオンにする。 =item B<--help> 利用法を示して die する。 =item B<--output> 生成したメッセージをメールせず、標準出力に表示する。 これを用いると B<--bcc> の情報は失われる。 =item B<--subpart> トップレベルの MIME メッセージではなく、 他の MIME メッセージから利用可能な subpart を生成する。 これを指定すると B<--output> が有効になり、 内部的な記号の意味も少々変わる。例を見てほしい。 =item B<--version> このオプションのみが指定された場合はバージョンを表示して成功終了する。 他のオプションが指定された場合はバージョンを表示して die する。 =back =head2 メインヘッダ これらの引き数は、メッセージのトップレベルヘッダにテキストを追加する。 またメッセージの送信先を制御する。 =over 4 =item B<--bcc> I
I
を送信リストに追加する。 もちろんこのとき、実際にはヘッダには何も追加されない。 実際にはメールを送信しないとき (B<--output> や B<--subpart> を用いたとき) は、B<--bcc> は何の効果も持たない。 =item B<--cc> I
I
を B のリストに追加する。 =item B<--embedded-to> 生成されたメッセージを、 B<--to>, B<--cc>, B<--bcc> で指定された宛先に加え、 既にヘッダにリストされている送信先にも送る。 これが意味を持つのは、 B<--header> スイッチを使って、自前で B, B などのヘッダを追加した場合である。 この場合は B<--to> や B<--cc> は用いないほうが良い。 これらのオプションは、 既にメッセージにあるヘッダにエントリを追加するのではなく、 新しいヘッダを生成してしまうからである。 このスイッチは sendmail に B<-t> を渡す (B はユーザが与えたヘッダを解釈しない)。 したがってメッセージの送信先をヘッダで指定していない場合は、 本当にまったく何も行われない。 =item B<--header> I 任意のテキストをヘッダに追加する。 I は何でも良く、複数行でも構わない。 このようにすれば不正なメッセージを生成することもできる。 I に空行を入れれば、メッセージを台無しにもできる。 =item B<--multipart> I multipart の content type とオプションを指定する。 デフォルトは C である。 C の設定は B が与えるので、 ここには書かないこと。 B<--multipart> type を指定して、メッセージをシングルパートにしても構わない。 このときは与えた type は単に無視される。 =item B<--prelude> I I をマルチパートの序文 (prelude text) に追加する。 B<--prelude> を複数回指定すると、 それらの I は結合されて用いられる。 このテキストにはデフォルトは無い。 どうやら最近では、 メッセージの先頭に MIME の説明を書くのは、 飛行機に乗った人にシートベルトの締め方を説明するのと 同じような扱いになったようだ。 メッセージがシングルパートになってしまった場合に、 B<--prelude> を指定していても構わない。 このテキストは単に無視される。 =item B<--subject> I メッセージの subject を指定する。 =item B<--to> I
I
を B リストに追加する。 =back =head2 パート毎ヘッダ これらのスイッチは、パート毎ヘッダ (per-part header) を制御する。 メッセージが multipart ではなくなった場合には、 これらは実際にはトップレベルのヘッダにデータを追加することになる。 これらはすべて、すぐつぎのパートの出力にしか適用されない。 各パートが出力されると、それぞれデフォルトの値にリセットされる。 これらのスイッチを指定して、後続のパートを指定しないのは意味をなさない。 よってそのようにすると、 B は文句を撒き散らして死ぬ。 =over 4 =item B<--attachment> I C 属性の値を I にして C ヘッダを追加する。 B はファイルを添付して送信する場合に良く用いられるので、 これはその利便のためのものである。 B<--attachment> I を用いても、 B が I というファイルから 実際にデータを読むわけではないことに注意。 これは単にヘッダでの名前に過ぎない。 メッセージのこのパートに入るべき実際のデータは、 通常の「パート出力」スイッチ (後述) から読み込まれる。 =item B<--encoding> I このパートに対して指定したいエンコード形式を指定する。 しかし通常はこのスイッチは用いるべきでない。 このスイッチが指定されなければ、 B が適切なエンコード形式を選択する。 与えるデータは、エンコード済のものであってはならない。 B は、データをここで指定した I に従って実際にエンコードする。 有効なエンコード形式は、 B<7bit>, B<8bit>, B, B, B である。 エンコードを自分で指定すると、簡単に不正な MIME メッセージになりうる。 =item B<--part-header> I 任意のテキストをパート毎ヘッダに追加する。 I は何でも良く、複数行でも構わない。 このようにすれば不正なメッセージを生成することもできる。 I に空行を入れれば、メッセージを台無しにもできる。 =item B<--type> I 指定しないとデフォルトは C になる。 I には type のプロパーだけでなくオプションを含めることもできる。 この全部が単に C の後に追加され、 ヘッダに積まれる。 =back =head2 パート出力 これらのスイッチはデータをメッセージの本文に追加する。 このうちのひとつを、multipart メッセージの各パートにつきひとつずつ指定する (または multipart メッセージでなければ一つだけを指定する)。 =over 4 =item B<--file> I =item B<--string> I ファイル I の内容か、 文字列 I をこのパートの本文に用いる。 I の末尾に改行がないと思われる場合は、含めるようにすること。 末尾の改行がないと、 このパートは C でエンコードされることになってしまうだろう (なぜなら C にはこのようなデータストリームを エンコードできないような制限が人為的に導入されているからである)。 =item B<--subpart-file> I =item B<--subpart-string> I I や I の内容を、このパートの本文とするのではなく、 このパートのサブパートとして扱う。 すなわちこれらのデータにはヘッダとテキストの両方が含まれているとみなす。 またこのパートに対しては、B<--type> も B<--encoding> も用いてはならない。 通常 I や I は、前に別の B を B<--subpart> スイッチ付きで実行した出力であることが多いだろう。 =back B<--file> および B<--subpart-file> に与える引き数には、ちょっとした仕掛けをすることもできる。 与えた I に対応するファイルがない場合は、 これに対して通常の Perl の open() が適用される。 L<"例"> を見よ。 =head1 例 これらの例では、$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 から読み込むならC&=4>) なども使える。 詳細は L の open() の説を参照のこと。 これは B を複数回起動し、 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 - =head1 バグ メッセージ本文は常にメモリに保存される。 よってシステムのメモリよりも大きな本文を扱おうとすると問題が起きるだろう。 =head1 著者 Roderick Schertler =cut