[英]How de we send out 5000 emails per hour using actionmailer in ruby on rails?
[英]How to send emails with multiple, dynamic smtp using Actionmailer/Ruby on Rails
我看到這篇文章但我的略有不同:
我允許用戶使用自己的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.