簡體   English   中英

如何使用Actionmailer / Ruby on Rails發送具有多個動態smtp的電子郵件

[英]How to send emails with multiple, dynamic smtp using Actionmailer/Ruby on Rails

我看到這篇文章但我的略有不同:

Rails ActionMailer具有多個SMTP服務器

我允許用戶使用自己的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

對於Rails 3.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

只需在每個發送操作之前設置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憑證一起動態設置傳遞方法,你可以使用Mail :: Message實例方法設置傳遞方法和它的變量,所以我的addapted Aditya 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

從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

請參閱使用動態傳送選項發送電子郵件(Rails指南)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM