みずぎわブログ

技術系のことや日々に考えたことを書き連ねます

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のメールサーバの設定をしておかないと送信できない.