TMailはメールを簡単に扱うためのクラスライブラリです。
ヘッダはひとつひとつがオブジェクトとして表現され、ヘッダを「文字列」としてでなく
(めんどくさん文法に一切関ることなく)「オブジェクト」とそのプロパティとして読み書きを
することができます。
また、MIMEマルチパートにも対応しています。
読みこみ時はヘッダに従って本文を分割し、書きこみ時には適当にバウンダリを設定して
再構成します。
一方で、TMailはメール本文の内容には一切関与しません。文字コードも勝手には変換 しませんし、行末コードも変えません。Base64のデコードもしません。それはライブラリの 利用者側で content-* ヘッダあたりを見て判断する必要があります。
実際に(少しは)使える例としてサンプルの fromcheck.rb を見てみます。
require 'tmail/tmail' unless ARGV[0] then puts "usage: fromcheck.rb見てのとおり、非常に簡潔です。 最初半分は見てのとおりです。MhLoader.new からが TMail に独自なコードです。 MhLoader は Mh メールボックスを扱うクラスで、他に Mbox と Maildir の ローダがあります。ローダーは、メールボックスごとの違いを吸収して、 例えばアクセスするなら each_mail で統一的に扱えるようにしてくれます。" end m = MhLoader.new( ARGV[0] ) m.each_mail do |port| tmail = TMail.new( port ) puts tmail.from_phrase(nil) || tmail.from end
そのローダのイテレータ each_mail からは、引数 port を渡されます。 これは Port (の下位)クラスのインスタンスで、ファイル名のオブジェクト表現の ようなものです。TMail オブジェクトはこれを引数に生成します。
TMail が生成できたら、あとは好きにいじるだけです。from_phrase は From: ヘッダの"phrase"部分(friendly from などと呼ばれることもあります)を 取得するメソッドです。これは格納されていないこともあるので、ないときは from アドレスを直に表示することにします。
この程度なら grep のほうが簡単ですが、TMailのいいところは、ここからどんなに 複雑になっても対応できることです。たとえば、他のヘッダも見て本文をデコードするとか、 From: だけじゃなく Sender: も確かめるとか。また、ヘッダの日本語も自動的に デコードされます。
簡単に、TMailライブラリを構成するクラス間の関係について書きます。
中心はTMailクラスです。ひとつのメールがひとつのTMailとして表現され、 (たぶんたくさんの)ヘッダフィールドと本文を含んでいます。
「ヘッダフィールド」とはようするに To: や From: のことです。ひとつの
ヘッダフィールドがひとつのHeaderFieldオブジェクトになります。
ヘッダフィールドオブジェクトはTMailの中に 'to' => Toヘッダフィールド
のようなハッシュとして格納されていて、TMail#[] や TMail#fetch でとりだせます。
ちなみに、tmail['From'] も tmail['FrOm'] も tmail['FROM'] も同じヘッダです。
ヘッダはいろいろな種類があるので、それに対応するクラスもいろいろ用意されています。
たとえばTo:ヘッダはMaddrHクラスで表現され、Subject:はStringHクラスで表現されます。
to_s body inspect のように共通するメソッドもありますが、そのクラスに独自のメソッドも
たくさんあります。
Toヘッダならaddrsというメソッドがあります。これはそのヘッダで記載されている
アドレスの配列を返すメソッドで、 tmail['to'].addrs.each do |adr| ... end の
ようにすればToのアドレス全てに対するくりかえしが行なえるわけです。
また、前節の例でも使いましたが、よく参照されるヘッダに関しては、簡易アクセス用の メソッドが定義されています。たとえば、from や from_phrase、to、subject などです。
本文は文字列としてbodyメソッドで参照できます。MIMEマルチパートボディは、ひとつの パートがひとつのTMailである配列になっていて、parts メソッドで参照できます。
さらに、各メールボックスの差異を吸収するために各種ローダーがあり、 それぞれのメールボックスの扱い方にしたがってポートを生成します。 ポートは一つのメールと一対一に存在しするメールの抽象表現になります。