ActionMailer in standalone apps

Today someone in #ruby-lang asked if you could use Rails’ ActionMailer also in standalone ruby applications. That user left after a short time and the question stayed unanswered, although it is my opinion quite interesting :) So I started digging a little bit through the documentation and came up with a quite basic solution which actually holds no real suprises.


require 'rubygems'
require 'pp'
require_gem 'actionmailer'
ActionMailer::Base.template_root = 'templates'
ActionMailer::Base.delivery_method = :test
class TestMailer < ActionMailer::Base
  def test
    @recipients = 're@domain.com'
    @subject = 'Hello World'
    @from = 'sender@domain.com'
  end
end
if $0 == __FILE__
  TestMailer.deliver_test
  ActionMailer::Base.deliveries.each do |mail| 
    puts "#{'='*60}"
    puts "Subject: #{mail.subject}"
    puts "From: #{mail.from}"
    puts "To: #{mail.to}"
    puts "#{'-'*60}"
    puts "#{mail.body}"
  end
end

As in Rails you simply create an ActionMailer subclass and do the deliver_action thing with it. The only thing that is slightly different here, is that you have to specify a template_root directory. The rest of the configuration should be the same as for its use in a Rails webapp (for details please read the manual) In this case I use the ’templates’ folder in the same directory as the script (actually in the pwd but anyway ;)).

So for this example you would have to have following folder structure

./templates
./templates/test_mailer
./templates/test_mailer/test.rhtml
./test.rb

Running this script should give you the expected mail :)

Note: I haven’t tested it with anything but the :test delivery_method, so perhaps there are some hidden problems :)