Custom smtp settings for Rails Mailers
I have to define different smtp settings per mailer. Lets say, I want to use different SendGrid accounts to send emails. Rails Mailers use global ActionMailer::Base.smtp_settings. If you want custimize smtp settings per mailer you cant just do MyMailer.smtp_settings = {...}And got work done. Actually you can, but it will set this settings globally. The easiest way, is just to redefine smtp settings for particular mailer
class MyMailer < ActionMailer::Base def self.smtp_settings { ... } end end
And if I want to set different smtp settings for few mailers and make them easy configurable.
I can use next approach: Load configuration for yaml file for each mailer.
Code for it:
Create parent mailer, lets say ApplicationMailer
class ApplicationMailer def self.smtp_settings Hash[SmtpSettings.send(self.to_s.underscore)].symbolize_keys rescue Settingslogic::MissingSetting ActionMailer::Base.smtp_settings end end
class MyMailer < ApplicationMailer end
And create settings:
class SmtpSettings < Settingslogic source Rails.root.join("config/smtp_settings.yml") namespace Rails.env end
smtp_settings.yml:
common: &default_settings my_mailer: address: smtp.sendgrid.net port: 25 authentication: :plain development: <<: *default_settings staging: <<: *default_settings test: <<: *default_settings production: <<: *default_settings
Thats all. Now its easy to configure smtp settings per mailer and per environment. Set mailtrap.io account for dev and stagign and use SendGrid for prod.










