public
Description: download email from POP3 or IMAP and do stuff with it.
Homepage:
Clone URL: git://github.com/look/fetcher.git
Luke Francl (author)
Sun Feb 15 19:16:47 -0800 2009
commit  d1a1363ba8000bc52e4ac4ecdfb1809ec1d1d210
tree    6b5384d4d053ce3bc2c71aae34ebf37261c226ef
parent  74a33412f3a219c0aa8a7e5cb02fa6e6f3c900a2
name age message
file .gitignore Sun Feb 15 19:08:08 -0800 2009 start .gitignore file [Luke Francl]
file MIT-LICENSE Sun Jun 24 09:26:19 -0700 2007 adding license info and fixing version of daemo... [dweinand]
file README.rdoc Sun Feb 15 19:16:47 -0800 2009 attempt to fix hyperlinks. Stupid RDoc. [Luke Francl]
file Rakefile Tue May 29 14:14:27 -0700 2007 adding initial version of fetcher plugin [dweinand]
directory generators/ Thu Jul 05 05:26:42 -0700 2007 fix some problems with the daemon template that... [look]
file init.rb Tue May 29 14:14:27 -0700 2007 adding initial version of fetcher plugin [dweinand]
file install.rb Tue May 29 14:14:27 -0700 2007 adding initial version of fetcher plugin [dweinand]
directory lib/ Sun Feb 24 20:33:00 -0800 2008 Add two new options to the IMAP fetcher: proces... [look]
directory tasks/ Tue May 29 14:14:27 -0700 2007 adding initial version of fetcher plugin [dweinand]
directory test/ Fri Jun 15 15:46:49 -0700 2007 changes to factory method and better documentation [dweinand]
file uninstall.rb Tue May 29 14:14:27 -0700 2007 adding initial version of fetcher plugin [dweinand]
README.rdoc

Fetcher

Fetcher is a simple message fetcher perfect for using in a daemon or via cron.

It implements the following common pattern:

  1. Connect to a server
  2. Download available messages
  3. Send each message to another object for further processing
  4. Remove downloaded messages from the remote server

Install using:

  script/plugin install git://github.com/look/fetcher.git

Usage

Create a new fetcher object like the following:

  @fetcher = Fetcher.create({:type => :pop,
                             :receiver => IncomingMailHandler,
                             :server => 'mail.example.com',
                             :username => 'jim',
                             :password => 'test'})

The receiver object is expected to have a receive method that takes a message as its only argument (e.g., the way ActionMailer::Base.recieve works; but you don’t have to use ActionMailer.).

Call fetch to download messages and process them.

  @fetcher.fetch

Configuration

The following options can be passed to the Fetcher.create factory method:

type
POP or IMAP
server
The IP address or domain name of the server
port
The port to connect to (defaults to the standard port for the type of server)
ssl
Set to any value to use SSL encryption
username
The username used to connect to the server
password
The password used to connect to the server
authentication
The authentication scheme to use (IMAP only). Supports LOGIN, CRAM-MD5, and PASSWORD (defaults to PLAIN)
use_login
Set to any value to use the LOGIN command instead of AUTHENTICATE. Some servers, like GMail, do not support AUTHENTICATE (IMAP only).
sleep_time
The number of seconds to sleep between fetches (defaults to 60 seconds; valid only for the generated daemon)
processed_folder
The name of a folder to move mail to after it has been processed (IMAP only). NOTE: If not specified, mail is deleted.
error_folder
The name a folder to move mail that causes an error during processing (IMAP only). Defaults to bogus.

Daemon generator

The Fetcher plugin comes with a generator to create a daemon:

  script/generate fetcher_daemon MailerDaemon

You should monitor the daemon using monit or god to ensure it does not crash.

Running via cron

You can also run the Fetcher periodically via cron. It is important to ensure that only one instance is running at one time, and for that the Lockfile gem is recommended.

Here is an example script to be with script/runner via cron:

  begin
    Lockfile.new('cron_mail_fetcher.lock', :retries => 0) do
      config = YAML.load_file("#{RAILS_ROOT}/config/mail.yml")
      config = config[RAILS_ENV].to_options

      fetcher = Fetcher.create({:receiver => MailReceiver}.merge(config))
      fetcher.fetch
    end
  rescue Lockfile::MaxTriesLockError => e
    puts "Another fetcher is already running. Exiting."
  end

Extending

You can subclass Fetcher::Base or one of the protocol-specific classed to override the standard behavior.

Further documentation

<shameless-plug>

You can read more about how to use the Fetcher in the PeepCode book Receiving Email with Ruby.

</shameless-plug>

Credit & Copyright

Created by Dan Weinand and Luke Francl. Development supported by Slantwise Design.

Licensed under the terms of the MIT License. Be excellent to each other.