Rails 動的にメールサーバを変更してアドレスごとに異なるメールを送信する方法
Railsではメーラークラスを使ってメールを送信することができる.
メーラーの設定は一般的にconfig/environments/以下に設定ファイルを
config.action_mailer.default_url_options = { :host => "localhost", :port => 3000 } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 000, :domain => 'example.com', :user_name => "メールサーバ認証用ユーザー", :password => "メールサーバ認証用パスワード", :authentication => 'plain', :enable_starttls_auto => true, }
などとして設定するのだが,単一のメールアドレスだけでなく複数のアドレスから送信したい場合があると思う.
例:このコントローラーからはAのアドレスで送って,違うコントローラーからはBのアドレスで送りたい
そんな際の実装をやってみたのでメモに残しておく.
最初に断っておくと,これが正攻法かどうかわからない.
調べてもあまりやりたいことが見つからなかったので間に合わせにこのように実装しただけだ.
方法はメーラークラスにおいてmail toをする前にsmtp_settingsを書き換えてしまえばいい.
class UserMailer < ActionMailer::Base def sender_send sender receiver set_smtp_settings sender mail to: “#{receiver.name}@sample.com", subject: "ActionMailer test" end private def set_smtp_settings sender ActionMailer::Base.smtp_settings = { address: 'sender.jp', port: 0, authentication: "login", user_name: "sender@sample.com", openssl_verify_mode: 'none', password: "#{sender.password}", } end end
こうするとsenderごとに異なるメールサーバやメールアドレスで送ることができる.
もちろん事前にsenderのメールサーバの設定をしておかないと送信できない.