Mail::Message モジュール
Mail::Message の概要
このオブジェクトモジュールはメールの解析と、
解析されたデータ構造へのさまざまな操作手段を提供してくれます。
少し詳しく説明すると、このモジュールはメールを解析し、
(multipart でない場合)
header -> body
(multipart の場合)
header -> preamble -> part1 -> part2 -> trailor
のようにオブジェクトが数珠つなぎのようなデータ構造を作ります。
ちなみに鎖の鎖の鎖の間の double link list です。
Mail::Message のクラスは
このようなデータ構造に対して、さまざまなオペレーションを提供します。
この鎖の部分部分それぞれが Mail::Message オブジェクトです。
つまり一通のメールはメールヘッダから始まるオブジェクトの鎖として
表現されます。
header は Mail::Message のタイプが text/rfc822-headers で、
data が Mail::Header オブジェクトになります。
一方 part1 は
text/plain
で、
data 部分が文字列へのリファレンスです。
参照:
Mail::Message モジュールのマニュアル
Mail::Message モジュール: 解析する
parse() メソッドは
引数で与えられた
ファイル(名)かファイルディスクリプタに対し
メッセージの解析をします。
get_data_type_list()
は
鎖の列の情報を返します。
情報は HASH ARRAY の形で返されます。
例えば 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
Mail::Message モジュール: 新しいメッセージを作る
new() メソッドは通常、新しいメッセージを作る際に使われます。
MIME/multipart 専用のためのメソッドもあります。
build_mime_multipart_chain($args)
parse_and_build_mime_multipart_chain($args)
build_mime_header($args)
しかしながら、MIME/mulitpart の作成には
Mail::Message::Compose クラスがあります。
実のところ、このクラスの実態は MIME::Lite そのものです :-)
Mail::Message モジュール: ヘッダの操作
dup_header() メソッドは
RFC822 型のメッセージのヘッダ部分のみのコピーを行ないます。
メールの本体の部分はそのままです。
複製されたヘッダオブジェクトからのリンクは
メールの本体です。
|<--------------- メール本体 ------------->
header0 ----> part1 -> part2 -> ...
A
|
dup_header0 ---
rfc822_message_header()
はメッセージの中のヘッダ部分のオブジェクトを返します。
文字列ではないことに注意して下さい。
head_message() は鎖の先頭のオブジェクトを返します。
last_message() は鎖の最後のオブジェクトを返します。
そのため、通常、図の header オブジェクトを返すことになりますので、
多くの場合 rfc822_message_header() と等価です。
header_data_type()
はメール全体のタイプ(文字列)を返します。
つまり、このメッセージは単なるテキストなのかマルチパートなのか?などを
教えてくれます。
Mail::Message モジュール: メッセージ本文の操作
以下では、このような鎖を例にとるとします。
(multipart でない場合)
header -> body
(multipart の場合)
header -> preamble -> part1 -> part2 -> trailor
まず header_data_type()
はメール全体のタイプ(文字列)を返します。
つまり、このメッセージは単なるテキストなのかマルチパートなのか?などを
教えてくれます。
つまり header の Content-Type で得られる情報です。
rfc822_message_body() メソッドは
body ないしは part1 の部分のオブジェクトを返します。
rfc822_message_body_head() メソッドも同じ操作をします。
head_message() は鎖の先頭のオブジェクトを返します。
last_message() は鎖の最後のオブジェクトを返します。
そのため、通常、図の header オブジェクトを返すことになりますので、
多くの場合 rfc822_message_header() と等価です。
last_message() は鎖の最後の部分なのでメッセージ本文の最後になります。
get_first_plaintext_message($args)
は
鎖の中で最初の plain/text タイプの Mail::Message オブジェクトを返します。
フィルタリングでは最初の
plain/text タイプのメッセージ部分に着目することが多いので
この関数を使うと便利です。
Mail::Message モジュール: オブジェクトの検索
find() メソッドは Mail::Message の特定のタイプを探し、
最初に見つけたオブジェクトを返します。
Mail::Message モジュール: メッセージを表示する。
print() メソッドは文字どおり print です。
通常は引数で出力するファイルディスクリプタを渡して下さい。
print() には CRLF なのか LF なのかを指定する mode という概念があります。
このために
set_print_mode(mode) および
reset_print_mode()
というメソッドがあります。
通常は raw で、SMTP の時だけは smtp を指定して下さい。
Mail::Message モジュール: 便利な関数
サイズ
size()
はオブジェクトのサイズを返します。
メール全体ではありません。
header_size()
や
body_size()
を使うと、ヘッダやメール本文全体の長さを教えてくれます。
is_empty()
はオブジェクトが空かどうかを教えてくれます。
一般的な情報
envelope_sender()
は
メールの送信者情報(文字列)を返します。
get_data_type()
は
Mail::Message オブジェクトのタイプ(文字列)を返します。
これは、メール全体のタイプ(マルチパートとか text/plain)
どではなく、鎖の各部分のオブジェクトのタイプであることに注意して下さい。
Mail::Message 内の構造
num_paragraph()
は
その Mail::Message オブジェクトの中に
何個のパラグラフがあるか(数字)を返します。
nth_paragraph(数字)
は
数字番目のパラグラフの内容を文字列として返します。
例えば、一番目のパラグラフは 0 ではなく 1 と指定して下さい。
header()
は
MIME/multipart の各ブロックにあるヘッダ部分を返します。
data()
は、データの部分です。
それぞれ
header_in_body_part($size)
data_in_body_part($size)
の alias です。