Ok…it’s neither pretty nor clean nor idiomatic Ruby (I’m a nuby ;),
but as a dirty hack it works (unless you fetch the body…that is).
Let me know if you have any questions:
#!/usr/bin/env ruby
require ‘rubygems’
require ‘ferret’
include Ferret
include Ferret::Document
require ‘net/imap’
index = Index::Index.new(:path=>"/path/to/index/goes/here")
$count = 0
$imap = Net::IMAP.new(‘server_ip_address_goes_here’, 143, false)
$imap.login(‘username_goes_here’, ‘password_goes_here’)
print $imap.examine(“INBOX”)
def index_it(imapobj, index, box)
imapobj.search([“ALL”]).each do |message_id|
begin
msg = imapobj.fetch(message_id, “(UID RFC822.SIZE ENVELOPE
BODY[TEXT])”)[0]
envelope = msg.attr[“ENVELOPE”]
body = msg.attr[“BODY[TEXT]”]
uid = msg.attr[“UID”]
size = msg.attr[“RFC822.SIZE”]
date = envelope.date
subject = envelope.subject
if envelope.from != nil and envelope.from.size > 0
from = envelope.from[0].name
end
sender = envelope.sender
to = envelope.to
in_reply_to = envelope.in_reply_to
doc = Document.new
doc << Field.new(“id”, message_id, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“body”, body, Field::Store::NO,
Field::Index::TOKENIZED)
doc << Field.new(“from”, from, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“subject”, subject, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“date”, date, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“uid”, uid, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“size”, size, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“sender”, sender, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“in_reply_to”, in_reply_to, Field::Store::YES,
Field::Index::TOKENIZED)
doc << Field.new(“mailbox”, box, Field::Store::YES,
Field::Index::UNTOKENIZED)
index << doc
$count = $count + 1
print "#{$count} : #{from} <==> #{subject}\n"
$retry = 0
rescue => detail
print detail
print detail.backtrace.join("\n")
print "Retrying"
$retry = 1 + $retry
if $retry < 20
retry
else
print "Retry threshold reached. Exiting..."
exit!(99)
end
$retry = 0
end
end
end
$imap.examine(“INBOX”)
$imap.list("", “*”).each do |box|
name = box.name
print “NAME: #{name}:#{box.class}\n”
if name and name != “” and name !~/customflags/
begin
$imap.select(name)
index_it($imap, index, name)
rescue => detail
print "ERROR: " + detail.message + “\n”
end
end
end