ruby-on-rails - 一斉送信 - rails5 メール送信




Actionmailer/Ruby on Railsを使用して、複数の動的smtpで電子メールを送信する方法 (4)

私はこの記事を見ましたが、私のものは少し異なります:

複数のSMTPサーバーを備えたRails ActionMailer

自分のSMTP認証情報を使ってメールを送信できるようにしています。

しかし、それらはRailsアプリから送られるので、自分のSMTPサーバーを使って電子メールを送信する必要がある各ユーザーのための手段です。

どうやってやるの?


各送信アクションの前にActionMailer :: Base設定値を設定するだけです。

smtp_config = user.smtp_configuration

ActionMailer::Base.username = smtp_config.username
ActionMailer::Base.password = smtp_config.password
ActionMailer::Base.server = ..
ActionMailer::Base.port = ..
ActionMailer::Base.authentication = ..

他の答えに記載されていることをすることは安全ではありません。 インスタンス化された変数ではなく、ここでクラス変数を設定しています。 Railsコンテナがフォークしている場合、これを行うことができますが、アプリケーションはコンテナの実装の詳細に依存します。 あなたが新しいRubyプロセスをフォークしていないなら、あなたはここで競合条件を持つことができます。

ActionMailer :: Baseを拡張しているモデルが必要です。メソッドを呼び出すと、Mail :: Messageオブジェクトが返されます。 これがインスタンスオブジェクトで、設定を変更する場所です。 設定はハッシュだけなのでインラインにすることもできます。

msg = MyMailer.some_message
msg.delivery_method.settings.merge!(@user.mail_settings)
msg.deliver

上記のmail_settingsが適切なキーを持ついくつかのハッシュを返す場所IE

{:user_name=>username, :password=>password}

ここで私が前の答えとコメントに基づいて思いついた解決策があります。 これは、 ActionMailerインターセプタクラスを使用します

class UserMailer < ActionMailer::Base
  default from: proc{ @user.mail_settings[:from_address] }      

  class DynamicSettingsInterceptor
     def self.delivering_email(message)
       message.delivery_method.settings.merge!(@user.mail_settings)
     end
   end
   register_interceptor DynamicSettingsInterceptor
end

誰かがsmtp資格情報と一緒に配信方法を動的に設定する必要がある場合は、 Mail :: Messageインスタンスメソッドを使用して配信方法を変数と一緒に設定して、Adatta Sanghiのバージョンを追加することができます:

class MainMailer < ActionMailer::Base
  WHATEVER_CONDITION = true # example only f.e. @ser

  include AbstractController::Callbacks
  after_filter :set_delivery_options

  private
  def set_delivery_options
    settings = {
    :address => 'smtp.mandrillapp.com', # intentionally
    :port => 587, # intentionally
    :domain => 'your_domain', #insetad of localhost.localdomain'
    :user_name => 'smtp_username',
    :password => 'smtp_password',
    :authentication => 'PLAIN' # or smthing else
}
    if WHATEVER_CONDITION
      message.delivery_method(:smtp, settings)
    end
  end
end




actionmailer