私はこの投稿を見ましたが、私のものは少し異なります:
複数のSMTPサーバーを備えたRailsActionMailer
ユーザーが自分のSMTPクレデンシャルを使用してメールを送信できるようにしているので、実際にはユーザーから送信されます。
ただし、これらはRailsアプリから送信されるため、ユーザーごとに、独自のSMTPサーバーを使用してメールを送信する必要があります。
どうやってやるの?
私はこの投稿を見ましたが、私のものは少し異なります:
複数のSMTPサーバーを備えたRailsActionMailer
ユーザーが自分のSMTPクレデンシャルを使用してメールを送信できるようにしているので、実際にはユーザーから送信されます。
ただし、これらはRailsアプリから送信されるため、ユーザーごとに、独自のSMTPサーバーを使用してメールを送信する必要があります。
どうやってやるの?
他の答えに記載されていることを行うことは安全ではありません。ここでは、インスタンス化された変数ではなく、クラス変数を設定しています。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
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
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ガイド)を参照してください。
各送信アクションの前に、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 = ..
誰かが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