TMailはメールを簡単に扱うためのクラスライブラリです。
ヘッダはひとつひとつがオブジェクトとして表現され、ヘッダを「文字列」としてでなく
(めんどくさん文法に一切関ることなく)「オブジェクト」とそのプロパティとして読み書きを
することができます。
また、MIMEマルチパートにも対応しています。
読みこみ時はヘッダに従って本文を分割し、書きこみ時には適当にバウンダリを設定して
再構成します。
一方で、TMailはメール本文の内容には一切関与しません。文字コードも勝手には変換 しませんし、行末コードも変えません。Base64のデコードもしません。それはライブラリの 利用者側で content-* ヘッダあたりを見て判断する必要があります。
メールボックスを調べてなにかしたいとしましょう。 例として、/var/spool/mail/aamine がメールボックスのファイルだとすると、 このメールボックスのメールには、次のようにアクセスできます。
require 'tmail' require 'loader' MboxLoader.new( '/var/spool/mail/aamine' ).each do |port| tmail = TMail.new( port ) endport はメール一通に対応しているファイル名のようなもので、それを引数にTMail オブジェクトを生成します。
では、だれからメールが来ているのか表示させてみます。 次のコードが上の例の each の中にあると思ってください。
puts tmail.from_phraseこれで、From: の"phrase"部分(friendly from などと呼ばれることもあります)が ずらっと表示されます。
この程度なら grep のほうが簡単ですが、TMailのいいところは、どんなに 複雑になっても対応できることです。たとえば、他のヘッダも見て本文をデコードするとか、 From: だけじゃなく Sender: も確かめるとか。ちなみに、ヘッダの日本語も自動的に デコードされます。
簡単に、TMailライブラリを構成するクラス間の関係について書きます。
中心はTMailクラスです。ひとつのメールがひとつのTMailとして表現され、 (たぶんたくさんの)ヘッダフィールドと本文を含んでいます。
「ヘッダフィールド」とはようするに To: や From: のことです。ひとつの
ヘッダフィールドがひとつのHeaderFieldオブジェクトになります。
ヘッダフィールドオブジェクトはTMailの中に 'to' => Toヘッダフィールド
のような連想配列として格納されていて、TMail#[] や TMail#fetch でとりだせます。
ヘッダはいろいろな種類があるので、それに対応するクラスもいろいろ用意されています。
たとえば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である配列になっていて、tmail.partsで参照できます。