TMail user manual


ライブラリの概略

TMailはメールを簡単に扱うためのクラスライブラリです。
ヘッダはひとつひとつがオブジェクトとして表現され、ヘッダを「文字列」としてでなく (めんどくさん文法に一切関ることなく)「オブジェクト」とそのプロパティとして読み書きを することができます。

また、MIMEマルチパートにも対応しています。
読みこみ時はヘッダに従って本文を分割し、書きこみ時には適当にバウンダリを設定して 再構成します。

一方で、TMailはメール本文の内容には一切関与しません。文字コードも勝手には変換 しませんし、行末コードも変えません。Base64のデコードもしません。それはライブラリの 利用者側で content-* ヘッダあたりを見て判断する必要があります。

ありがちな使いかた

実際に(少しは)使える例としてサンプルの fromcheck.rb を見てみます。


require 'tmail/tmail'

unless ARGV[0] then
  puts "usage:  fromcheck.rb "
end

m = MhLoader.new( ARGV[0] )
m.each_mail do |port|
  tmail = TMail.new( port )
  puts tmail.from_phrase(nil) || tmail.from
end

見てのとおり、非常に簡潔です。 最初半分は見てのとおりです。MhLoader.new からが TMail に独自なコードです。 MhLoader は Mh メールボックスを扱うクラスで、他に Mbox と Maildir の ローダがあります。ローダーは、メールボックスごとの違いを吸収して、 例えばアクセスするなら each_mail で統一的に扱えるようにしてくれます。

そのローダのイテレータ each_mail からは、引数 port を渡されます。 これは Port (の下位)クラスのインスタンスで、ファイル名のオブジェクト表現の ようなものです。TMail オブジェクトはこれを引数に生成します。

TMail が生成できたら、あとは好きにいじるだけです。from_phrase は From: ヘッダの"phrase"部分(friendly from などと呼ばれることもあります)を 取得するメソッドです。これは格納されていないこともあるので、ないときは from アドレスを直に表示することにします。

この程度なら grep のほうが簡単ですが、TMailのいいところは、ここからどんなに 複雑になっても対応できることです。たとえば、他のヘッダも見て本文をデコードするとか、 From: だけじゃなく Sender: も確かめるとか。また、ヘッダの日本語も自動的に デコードされます。

TMailのオブジェクト構成

簡単に、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 メソッドで参照できます。

さらに、各メールボックスの差異を吸収するために各種ローダーがあり、 それぞれのメールボックスの扱い方にしたがってポートを生成します。 ポートは一つのメールと一対一に存在しするメールの抽象表現になります。


Copyright(c) 1998-1999 Minero Aoki.