web-dev-qa-db-ja.com

Rails MucleedsのSMTPサーバーを持つActionMailer

Railsアプリケーションで2つの異なるSMTPサーバーを使用する必要があります。 ActionMailerが構築される方法は、サブクラスのための異なるSMTP_Settingsを持つことはできません。メッセージが送信されているときはいつでも、各メーラークラスのSMTP設定をリロードすることができましたが、それは私のコントロールの外側にある例外調節子プラグインをめちゃくちゃにします(私もそれを混乱さない限り)。誰もがこのような何かのための解決策/プラグインを持っていますか?

理想的には持って行きたいです

_class UserMailer < ActionMailer::Base; end
_

そしてenvironment.rbに設定します

_ActionMailer::Base.smtp_settings = standard_smtp_settings
UserMailer.smtp_settings = user_smtp_settings
_

したがって、ExceptionNotifierを含むマイメーラのほとんどはデフォルト設定をピックアップしますが、USERMailerは有料リレーサービスを使用します。

30
user189053

Oreillyの記事に基づいて、私はここで書いた解決策を思い付きました。 http://transfs.com/devblog/2009/12/03/custom-smtp-settings-for-a-specific-actionmailer -subclass

これが関連コードです。

class MailerWithCustomSmtp < ActionMailer::Base
  SMTP_SETTINGS = {
    :address => "smtp.gmail.com",
    :port => 587,
    :authentication => :plain,
    :user_name => "[email protected]",
    :password => 'password',
  }

  def awesome_email(bidder, options={})
     with_custom_smtp_settings do
        subject       'Awesome Email D00D!'
        recipients    '[email protected]'
        from          '[email protected]'
        body          'Hope this works...'
     end
  end

  # Override the deliver! method so that we can reset our custom smtp server settings
  def deliver!(mail = @mail)
    out = super
    reset_smtp_settings if @_temp_smtp_settings
    out
  end

  private

  def with_custom_smtp_settings(&block)
    @_temp_smtp_settings = @@smtp_settings
    @@smtp_settings = SMTP_SETTINGS
    yield
  end

  def reset_smtp_settings
    @@smtp_settings = @_temp_smtp_settings
    @_temp_smtp_settings = nil
  end
end
 _
21
jkrall

Rails 4.2以降の解決策

config/secrets.yml:

_production:
  gmail_smtp:
    :authentication: "plain"
    :address: "smtp.gmail.com"
    :port: 587
    :domain: "zzz.com"
    :user_name: "[email protected]"
    :password: "zzz"
    :enable_starttls_auto: true
  mandrill_smtp:
    :authentication: "plain"
    :address: "smtp.mandrillapp.com"
    :port: 587
    :domain: "zzz.com"
    :user_name: "[email protected]"
    :password: "zzz"
    :enable_starttls_auto: true
  mailgun_smtp:
    :authentication: "plain"
    :address: "smtp.mailgun.org"
    :port: 587
    :domain: "zzz.com"
    :user_name: "[email protected]"
    :password: "zzz"
    :enable_starttls_auto: true
_

config/innernitions/production.rb:

_config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = Rails.application.secrets.gmail_smtp
_

App/Mailers/Application_Mailer.rb:

_class ApplicationMailer < ActionMailer::Base
  default from: '"ZZZ" <[email protected]>'

  private

  def gmail_delivery
    mail.delivery_method.settings = Rails.application.secrets.gmail_smtp
  end

  def mandrill_delivery
    mail.delivery_method.settings = Rails.application.secrets.mandrill_smtp
  end

  def mailgun_delivery
    mail.delivery_method.settings = Rails.application.secrets.mailgun_smtp
  end
end
_

App/Mailers/user_mailer.rb:

_class UserMailer < ApplicationMailer
  # after_action :gmail_delivery, only: [:notify_user]
  after_action :mandrill_delivery, only: [:newsletter]
  after_action :mailgun_delivery, only: [:newsletter2]

  def newsletter(user_id); '...' end # this will be sent through mandrill smtp
  def newsletter2(user_id); '...' end # this will be sent through mailgun smtp
  def notify_user(user_id); '...' end # this will be sent through gmail smtp
end
_
11
Lev Lukomsky

この問題にこの問題に近づいて、レールの後のバージョン(3+)で、これを試してください。

http://guides.rubyonRails.org/action_mailer_basics.html#sending-Emails-With-Dynamic-Delivery-Options

10
bodacious

Rails-2.3。*

# app/models/user_mailer.rb
class UserMailer < ActionMailer::Base
  def self.smtp_settings
    USER_MAILER_SMTP_SETTINGS
  end

  def spam(user)
    recipients user.mail
    from '[email protected]'
    subject 'Enlarge whatever!'
    body :user => user
    content_type 'text/html'
  end
end

# config/environment.rb
ActionMailer::Base.smtp_settings = standard_smtp_settings
USER_MAILER_SMTP_SETTINGS = user_smtp_settings

# From console or whatever...
UserMailer.deliver_spam(user)
 _
2
Kostia

https://github.com/antycaliendo/action_mailer_callbacks

私はこのプラグインが私のために問題をきっと簡単に解決するのを助けました(<5分)。私は単にplaed_deliverの特定のメーラーの@@ smtp_settingsを変更してから、After_Deliverのデフォルトに戻します。このアプローチを使用すると、@@ smtp_settingsがデフォルトと異なるメーラにコールバックを追加する必要があります。

class CustomMailer < ActionMailer::Base

  before_deliver do |mail|
    self.smtp_settings = custom_settings
  end

  after_deliver do |mail|
    self.smtp_settings = default_settings
  end

  def some_message
    subject "blah"
    recipients "[email protected]"
    from "[email protected]"
    body "You can haz Ninja rb skillz!"
    attachment some_doc
  end

end
 _
0
bkidd