Ruby mail example - search an IMAP mail server

Here is a Ruby mail program that I use to search my IMAP mailbox with combinations of search criteria. It is a mixture of several different Ruby-based approaches I found on the Internet for searching email systems.

Note that you don't need all the comments at the front as I've shown. It's just that I can't remember all the crazy flags that can be used, and at this time I'm not going to take the time to write a better mail system interface, although IMHO a better interface is surely needed.

Ruby mail program (Ruby IMAP example)

Without any further ado, here is my "Ruby mail" program source code that lets you search your email with powerful options/combinations:

require 'net/imap'

# mostly written by Al Alexander, http://DevDaily.com
# (okay, okay, i copied a lot of it and glued it together)

# ==========
# IMAP FLAGS
# ==========
# BEFORE <date>:  8-Aug-2002.
# BODY <string>:
# CC <string>:
# FROM <string>:
# NEW:  messages with the \Recent, but not the \Seen, flag set.
# NOT <search-key>:
# OR <search-key> <search-key>: "or" two search keys together.
# ON <date>:
# SINCE <date>:
# SUBJECT <string>:
# TO <string>:

# ===============
# ENVELOPE FIELDS
# ===============
# date:
# subject:
# from:     an array of Net::IMAP::Address
# sender:   an array of Net::IMAP::Address
# reply_to: an array of Net::IMAP::Address
# to:       an array of Net::IMAP::Address
# cc:       an array of Net::IMAP::Address
# bcc:      an array of Net::IMAP::Address

# ==============
# ADDRESS FIELDS
# ==============

# name:
# route:
# mailbox:
# host:

server = "MY-MAILSERVER"    # change this for your system
user = "MY-USERNAME"        # change this for your system
pass = "MY-PASSWORD"        # change this for your system
#folder = "INBOX.Sent"      # shows how to specify a different folder
folder = "INBOX"

imap = Net::IMAP.new(server)
imap.login(user, pass)
imap.select(folder)

# "SINCE", "1-Apr-2003"
#imap.search(["FROM", "ann", "NOT", "NEW", "SINCE", "1-Apr-2003", 
#             "BODY", "tree"]).each do |msg_id|
#imap.search(["TO", "reggie", "BODY", "vacation"]).each do |msg_id|

imap.search(["FROM", "fred", "BODY", "ssh").each do |msg_id|
  msg = imap.fetch(msg_id, "(UID RFC822.SIZE ENVELOPE BODY[TEXT])")[0]
  body = msg.attr["BODY[TEXT]"]
  puts "#{body}"

  #envelope = msg.attr["ENVELOPE"]
  #uid = msg.attr["UID"]
  #size = msg.attr["RFC822.SIZE"]
  #puts "To: #{to}"

  env = imap.fetch(msg_id, "ENVELOPE")[0].attr["ENVELOPE"]
  puts "#{env.from[0].name}: \t#{env.subject}"
end

imap.logout
imap.disconnect

Feel free to copy this Ruby program and use it however you want to. You can do much more powerful and interesting things by reading your mail server than I'm doing here. For instance, I used to have a Java program that would do something like this, then send "interesting" email messages to my pager. Now of course you might send them to your cell phone or Blackberry or Treo devices instead.

Comments