15

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

複数のSMTPサーバーを備えたRailsActionMailer

ユーザーが自分のSMTPクレデンシャルを使用してメールを送信できるようにしているので、実際にはユーザーから送信されます。

ただし、これらはRailsアプリから送信されるため、ユーザーごとに、独自のSMTPサーバーを使用してメールを送信する必要があります。

どうやってやるの?

4

6 に答える 6

61

他の答えに記載されていることを行うことは安全ではありません。ここでは、インスタンス化された変数ではなく、クラス変数を設定しています。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}
于 2011-06-20T15:26:44.143 に答える
12

これは、以前の回答とコメントに基づいて私が思いついた解決策です。これは、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
于 2013-02-01T20:15:48.660 に答える
9

Rails3.2.xの場合

メーラークラスにAbstractController::Callbacksを含め、メーラー内で「after_filter:set_delivery_options」を実行できます。

set_delivery_optionsメソッドは、メーラーアクションで設定されたインスタンス変数にアクセスでき、メールオブジェクトに「メッセージ」としてアクセスできます。

class MyNailer < ActionMailer::Base
  include AbstractController::Callbacks
  after_filter :set_delivery_options

  def nail_it(user)
    @user = user
    mail :subject => "you nailed it"
  end

  private

  def set_delivery_options
    message.delivery_method.settings.merge!(@user.company.smtp_creds)
  end
end
于 2013-07-08T02:06:29.873 に答える
4

Rails 4以降では、delivery_method_optionsパラメーターを介して直接クレデンシャルを提供するように機能します。

class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user]
    @url  = user_url(@user)
    delivery_options = { user_name: params[:company].smtp_user,
                         password: params[:company].smtp_password,
                         address: params[:company].smtp_host }
    mail(to: @user.email,
         subject: "Please see the Terms and Conditions attached",
         delivery_method_options: delivery_options)
  end
end

動的配信オプションを使用したEメールの送信(Railsガイド)を参照してください。

于 2018-10-22T13:05:27.723 に答える
3

各送信アクションの前に、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 = ..
于 2010-04-18T20:31:39.657 に答える
3

誰かがSMTP資格情報と一緒に動的に配信方法を設定する必要がある場合、uは Mail :: Messageインスタンスメソッドを使用してその変数と一緒に配信方法を設定できるので、私の適応したAdityaSanghiバージョンは次のとおりです。

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
于 2015-02-02T10:40:38.697 に答える