Converting all your mailers to the new api in a single commit is pretty daunting and makes them less readable / reusable since now everything has to fit into one big hash at the end of each method. This little patch keeps mailer methods that use the old api working while allowing to use the new api, a smooth transition path!
Usage
class UserMailer < ApplicationMailer::Base include DeprecatedMailerAPI def welcome to "me@example.com" from "you@example.com" subject "blah" end end UserMailer.deliver_welcome
Code
module DeprecatedMailerAPI # call build_mail if mail was not used def process(*args) old = @_message super unless @mail_was_called @_message = old build_mail end end def from(xxx=:read) mail_cache(:from, xxx) end def recipients(xxx=:read) mail_cache(:to, xxx) end def cc(xxx=:read) mail_cache(:cc, xxx) end def bcc(xxx=:read) mail_cache(:bcc, xxx) end def reply_to(xxx=:read) mail_cache(:reply_to, xxx) end def content_type(xxx=:read) mail_cache(:content_type, xxx) end def body(xxx=:read) mail_cache(:body, xxx) end def part(options) key = case options[:content_type] when Mime::TEXT.to_s then :text when Mime::HTML.to_s then :html else raise "Unuspported content_type #{options[:content_type].inspect}" end @mail_cache ||= {} @mail_cache[:parts] ||= {} @mail_cache[:parts][key] = options[:body] end def subject(xxx=:read) mail_cache(:subject, xxx) end def build_mail if @mail_cache[:parts] mail(@mail_cache.except(:parts, :content_type)) do |format| @mail_cache[:parts].each do |f,b| format.send(f) { render :text => b } end end else mail(@mail_cache) end end def mail_cache(k,v) @mail_cache ||= {} if v == :read @mail_cache[k] else @mail_cache[k] = v end end def self.included(base) class << base alias_method :method_missing_without_deprecated, :method_missing # convert old create/deliver_foo to foo().deliver def method_missing(name, *args, &block) if match = /^(create|deliver)_([_a-z]\w*)/.match(name.to_s) mail = method_missing_without_deprecated(match[2], *args, &block) match[1] == "create" ? mail : mail.deliver else method_missing_without_deprecated(name, *args, &block) end end end end end