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 '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です。こちらも参考にどうぞ。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。