Mail::Message モジュール Mail::Message の概要 Mail::Message クラスはメールの解析と、 解析されたデータ構造へのさまざまな操作手段を提供します。 もう少し詳しく説明すると、このモジュールはメールを解析し、 (いわゆるテキストメールの場合) header -> body (マルチパートの場合) header -> preamble -> part1 -> part2 -> trailor のようにオブジェクトが数珠つなぎとなったデータ構造を作ります。 ちなみに、鎖と鎖の間は double link list です。 Mail::Message のクラスは、 このようなデータ構造に対して、 さまざまな操作を行なうメソッドを提供しています。 この鎖の部分部分それぞれが Mail::Message オブジェクトです。 つまり一通のメールは、 メールヘッダから始まるオブジェクトの鎖として表現されます。 (マルチパートの場合) header -> preamble -> part1 -> part2 -> trailor を例に取りましょう。 この左端(メールヘッダ)は、 Mail::Message のタイプが text/rfc822-headers で、 その data が Mail::Header オブジェクトになります。 一方 part1 は text/plain で、 オブジェクトのデータ部分は、 文字列(テキスト)へのリファレンスです。 参照: Mail::Message モジュールのマニュアル(英語) Mail::Message モジュール: 解析する parse() メソッドは、 引数で与えられたファイル(名)かファイルディスクリプタからデータを読み込み、 そのデータ(メッセージ)の解析を試みます。 data_type_list() は鎖の列の情報を ARRAY REFERENCE の形で返します。 たとえば MIME/Multipart は次のように表現されます (ちなみに、以下の表示はデバッグモードで出力されるものです)。 type[ 1]: text/rfc822-headers | multipart/mixed type[ 2]: multipart/mixed | multipart/mixed type[ 3]: multipart.preamble | multipart/mixed type[ 4]: multipart.delimiter | multipart/mixed type[ 5]: text/plain | multipart/mixed type[ 6]: multipart.delimiter | multipart/mixed type[ 7]: image/gif | multipart/mixed type[ 8]: multipart.close-delimiter | multipart/mixed type[ 9]: text/plain | multipart/mixed 真中の列が各オブジェクトの種別を表しています。 右端はメール全体の mime type です。 Mail::Message モジュール: 新しいメッセージを作る new() メソッドは通常、新しいメッセージを作る際に使われます。 MIME/multipart 作成専用のメソッドもあります。 build_mime_multipart_chain($args) parse_and_build_mime_multipart_chain($args) build_mime_header($args) 注意: これらのメソッドは使わないでください。 現状、これらのメソッドを直接呼び出していないので、 将来、これらは private methods に移行するかもしれません。 MIME/mulitpart の「作成」には Mail::Message::Compose クラスを使っています。 そして、このクラスの実態は CPAN の MIME::Lite そのものです :-) Mail::Message モジュール: ヘッダの操作 dup_header() メソッドは RFC822 型メッセージのヘッダ部分のみをコピーします。 メール本体の部分はそのままです。 複製されたヘッダオブジェクトからのリンクはメールの本体です。 つまり、ヘッダだけ枝分かれしている状態ですね。 $header1 = $message0->dup_header0; |<--------------- メール本体 -------------> $header0 ---> part1 -> part2 -> ... A | $header1 ------+ whole_message_header() メソッドはメッセージ中の「ヘッダ部分のオブジェクト」を返します。 「文字列ではない」ことに注意して下さい。 __head_message() は鎖の先頭のオブジェクトを返します。 __last_message() は鎖の最後のオブジェクトを返します。 モジュールの中で使われていますが、 これらはプライベート・メソッドなので、 これらのメソッドは使わないで下さい。 将来、これらのコードは消去します。 なお __head_message() は、 通常、図の header オブジェクトを返すことになるので、 たいていの場合 whole_message_header() と等価です。 whole_message_header_data_type() メソッドはメール全体のタイプ(文字列)を返します。 つまり、このメッセージは単なるテキストなのかマルチパートなのか? などの情報を教える関数です。 Mail::Message モジュール: メッセージ本文の操作 本節では、次のようなオブジェクトの鎖を例にとることにします。 (multipart でない場合) header -> body (multipart の場合) header -> preamble -> part1 -> part2 -> trailor (一部、前述の繰り返しになります)。 whole_message_header_data_type() メソッドはメール全体のタイプ(文字列)を返します。 つまり、header の Content-Type で得られる情報です。 whole_message_body() メソッドは body ないしは part1 の部分のオブジェクトを返します。 whole_message_body_head() メソッドも同じ返り値です。 __head_message() は鎖の先頭のオブジェクトを返します。 __last_message() は鎖の最後のオブジェクトを返します。 そのため、通常、図の header オブジェクトを返すことになりますので、 たいていの場合 whole_message_header() と等価です。 __last_message() は、 鎖の最後の部分なのでメッセージ本文の最後(図の右端のオブジェクト)になります。 find_first_plaintext_message($args) は、 鎖の中で最初の plain/text タイプの Mail::Message オブジェクトを返します。 フィルタリングでは最初の plain/text タイプのメッセージ部分に着目することが多いため、 この関数を使うと便利です。 Mail::Message モジュール: オブジェクトの検索 find() メソッドは、 特定のタイプの Mail::Message オブジェクトを探し、 最初に見つけたオブジェクトを返します。 注意: ヘッダの Content-Type: を返すわけではありません。 Mail::Message モジュール: メッセージを表示する。 print() メソッドは文字どおり表示(print)です。 通常、 引数で「出力するファイルディスクリプタ」を渡して下さい。 print() には CRLF なのか LF なのかを指定する mode という概念があります。 このために set_print_mode(mode) および reset_print_mode() というメソッドがあります。 通常は raw で、SMTP の時だけは smtp を指定して下さい。 Mail::Message モジュール: 便利な関数 サイズ size() は(鎖の一つ一つの Mail::Message)オブジェクトのサイズを返します。 注意: メール全体のサイズを返すわけではありません。 なお、 header_size() や body_size() を使うと、ヘッダサイズやメール本文全体の長さを教えてくれます。 is_empty() はオブジェクトのデータが空かどうかを教えてくれます。 これらもフィルタリングのコードを書く際に有用です。 一般的な情報 envelope_sender() はメールの送信者情報(文字列)を返します。 文字どおり、いわゆる Envelope Sender 情報です。 data_type() メソッドは Mail::Message オブジェクトのタイプ(文字列)を返します。 これは、 メール全体のタイプ(マルチパートとか text/plain)ではなく、 鎖の各部分のオブジェクト・タイプであることに注意して下さい。 encoding_mechanism() メソッドは Mail::Message オブジェクトのエンコーディングメカニズム(文字列)を返します。 エンコーディングされていない場合 undef が返ります。 これは、 メール全体のタイプ(マルチパートとか text/plain)ではなく、 鎖の各部分のオブジェクト・タイプであることに注意して下さい。 Mail::Message オブジェクト内部の構造を知る num_paragraphs() メソッドは、 その Mail::Message オブジェクトの中に 何個のパラグラフがあるか(数字)を返します。 nth_paragraph(数字) メソッドは 「数字」番目のパラグラフの内容を文字列として返します。 なお、 一番目のパラグラフは 0 ではなく 1 と指定して下さい。 ここは、 (あえてC言語風ではなく) 人間に分かりやすいように「 1から始まる」仕様になっています。 参照 Mail::Message モジュールマニュアル(英語)