June 21, 2007

Rubyでメールの仕分け

とある事情で大量のメールの仕分けをする必要がでてきました。仕分けといってもメーラーによって行われる単純なルール(例えばアドレスがhogeだったらadaフォルダに保存する)で解決できればよかったのですが、本文中に含まれる50個程度の指定語句(5から6桁の数字)に従って仕分けを行うという作業です。
メールの数はおよそ500通。ルールを50回も入力するのは少し面倒です。また人力で仕分けした場合は、一通あたり30秒だとして約4時間のかったるい作業になります。そういうことならプログラムを書いてしまったほうが効率がいいような気がしてきました。というかこれは後付の理由で、メールを処理するプログラムを書いてみたくなっただけです(笑)。

ブツは例によってRubyでこしらえることにします。メールを扱うRubyのライブラリがないか探してみると、TMailというのが様々なメール形式に対応しているようで使いやすそうなので、これを利用することにしました。

TMailですが非常に細かいところまで気が配られていて、1通ごとのメールのヘッダや本文、添付ファイルの処理だけではなく、メールをまとめて管理する枠組みであるメールボックスについてもUNIX系のqmailやMaildir形式に対応しているようです。ただし今回、対象となるメールはすべてM$謹製のOutlook Expressで保存されたメールでしたので、直接メールボックスのままTMailでメールを扱うことができませんでした。しかしOutlook Expressのメールをドラックアンドドロップでウィンドウ外に保存すると、実はTMailでも対応しているMh形式の1通ごとのメールになりますので、あとはこれを処理して目標を達成しました。

TMailの使い方ですが、以下のような感じでコードを書くと、色々とメールの処理が行えます。

require 'tmail'
require 'nkf'

mail = TMail::Mail::load('from_outlook_express.eml')

# 件名の取得
subject = NKF::nkf('-s', mail.subject) rescue nil

# 本文の取得
body = nil
if mail.multipart? then
    mail.parts.each{|part|
        if part.content_type =~ /text/ &&
                part.disposition !~ /(?:attachment|inline)/ then
            begin
                body = NKF::nkf('-s', part.body)
                break
            rescue
            end
        end
    }
else
    body = NKF::nkf('-s', mail.body) rescue nil
end

作ったスクリプトはmail_sorter.rbです。こちらも参考にどうぞ。

15:56 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/574
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。