module Mail # == Sending Email with SMTP # # Mail allows you to send emails using SMTP. This is done by wrapping Net::SMTP in # an easy to use manner. # # === Sending via SMTP server on Localhost # # Sending locally (to a postfix or sendmail server running on localhost) requires # no special setup. Just to Mail.deliver &block or message.deliver! and it will # be sent in this method. # # === Sending via MobileMe # # Mail.defaults do # delivery_method :smtp, { :address => "smtp.me.com", # :port => 587, # :domain => 'your.host.name', # :user_name => '', # :password => '', # :authentication => 'plain', # :enable_starttls_auto => true } # end # # === Sending via GMail # # Mail.defaults do # delivery_method :smtp, { :address => "smtp.gmail.com", # :port => 587, # :domain => 'baci.lindsaar.net', # :user_name => '', # :password => '', # :authentication => 'plain', # :enable_starttls_auto => true } # end # # === Others # # Feel free to send me other examples that were tricky # # === Delivering the email # # Once you have the settings right, sending the email is done by: # # Mail.deliver do # to 'mikel@test.lindsaar.net' # from 'ada@test.lindsaar.net' # subject 'testing sendmail' # body 'testing sendmail' # end # # Or by calling deliver on a Mail message # # mail = Mail.new do # to 'mikel@test.lindsaar.net' # from 'ada@test.lindsaar.net' # subject 'testing sendmail' # body 'testing sendmail' # end # # mail.deliver! class SMTP def initialize(values) self.settings = { :address => "localhost", :port => 25, :domain => 'localhost.localdomain', :user_name => nil, :password => nil, :authentication => nil, :enable_starttls_auto => true }.merge!(values) end attr_accessor :settings # Send the message via SMTP. # The from and to attributes are optional. If not set, they are retrieve from the Message. def deliver!(mail) # Set the envelope from to be either the return-path, the sender or the first from address envelope_from = mail.return_path || mail.sender || mail.from_addrs.first if envelope_from.blank? raise ArgumentError.new('A sender (Return-Path, Sender or From) required to send a message') end destinations ||= mail.destinations if mail.respond_to?(:destinations) && mail.destinations if destinations.blank? raise ArgumentError.new('At least one recipient (To, Cc or Bcc) is required to send a message') end message ||= mail.encoded if mail.respond_to?(:encoded) if message.blank? raise ArgumentError.new('A encoded content is required to send a message') end smtp = Net::SMTP.new(settings[:address], settings[:port]) if settings[:enable_starttls_auto] smtp.enable_starttls_auto if smtp.respond_to?(:enable_starttls_auto) end smtp.start(settings[:domain], settings[:user_name], settings[:password], settings[:authentication]) do |smtp| smtp.sendmail(message, envelope_from, destinations) end self end end end