class ActionMailer::ARMailer

Adds sending email through an ActiveRecord table as a delivery method for ActionMailer.

Converting to ActionMailer::ARMailer

Go to your Rails project:

$ cd your_rails_project

Create a new migration:

$ ar_sendmail --create-migration

You’ll need to redirect this into a file. If you want a different name provide the –table-name option.

Create a new model:

$ ar_sendmail --create-model

You’ll need to redirect this into a file. If you want a different name provide the –table-name option.

Change your email classes to inherit from ActionMailer::ARMailer instead of ActionMailer::Base:

--- app/model/emailer.rb.orig   2006-08-10 13:16:33.000000000 -0700
+++ app/model/emailer.rb        2006-08-10 13:16:43.000000000 -0700
@@ -1,4 +1,4 @@
-class Emailer < ActionMailer::Base
+class Emailer < ActionMailer::ARMailer

def comment_notification(comment)
  from comment.author.email

You’ll need to be sure to set the From address for your emails. Something like:

def list_send(recipient)
  from 'no_reply@example.com'
  # ...

Edit config/environment.rb and require ar_mailer.rb:

require 'action_mailer/ar_mailer'

Edit config/environments/production.rb and set the delivery agent:

$ grep delivery_method config/environments/production.rb
config.action_mailer.delivery_method = :activerecord

For Rails 1.x and older:

$ grep delivery_method config/environments/production.rb
ActionMailer::Base.delivery_method = :activerecord

Run ar_sendmail:

$ ar_sendmail

You can also run it from cron with -o, or as a daemon with -d.

See ar_sendmail -h for full details.

Alternate Mail Storage

If you want to set the ActiveRecord model that emails will be stored in, see ::email_class=

Public Class Methods

email_class() click to toggle source

Current email class for deliveries.

# File lib/action_mailer/ar_mailer.rb, line 80
def self.email_class
  @email_class ||= Email
end
email_class=(klass) click to toggle source

Sets the email class for deliveries.

# File lib/action_mailer/ar_mailer.rb, line 87
def self.email_class=(klass)
  @email_class = klass
end

Public Instance Methods

perform_delivery_activerecord(mail) click to toggle source

Adds mail to the Email table. Only the first From address for mail is used.

# File lib/action_mailer/ar_mailer.rb, line 109
def perform_delivery_activerecord(mail)
  email_class = ActionMailer::ARMailer.email_class

  mail.destinations.each do |destination|
    email_class.create :mail => mail.encoded, :to => destination,
                       :from => mail.from.first
  end
end