ActionMailer现在的实现只支持smtp和Sendmail两种方式发送邮件,配置分别如下:
Java代码 复制代码
1. # ActionMailer::Base.delivery_method = :smtp
2. # ActionMailer::Base.smtp_settings = SMTP_SETTINGS
3. ActionMailer::Base.delivery_method = :sendmail
4. ActionMailer::Base.sendmail_settings = SENDMAIL_SETTINGS
5. SMTP_SETTINGS = {
6. :address => "smtp.gmail.com",
7. :port => 587,
8. :domain => "beyondrails.com",
9. :authentication => :login,
10. :user_name => "beyondrails@gmail.com",
11. :password => "password"
12. }
13. SENDMAIL_SETTINGS = {
14. :location => '/usr/sbin/sendmail',
15. :arguments => '-i -t'
16. }
# ActionMailer::Base.delivery_method = :smtp
# ActionMailer::Base.smtp_settings = SMTP_SETTINGS
ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = SENDMAIL_SETTINGS
SMTP_SETTINGS = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "beyondrails.com",
:authentication => :login,
:user_name => "beyondrails@gmail.com",
:password => "password"
}
SENDMAIL_SETTINGS = {
:location => '/usr/sbin/sendmail',
:arguments => '-i -t'
}
为什么只支持这两种方式呢?让我们看下ActionMailer::Base的源码:
Java代码 复制代码
1. module ActionMailer
2. class Base
3. class << self
4. def method_missing(method_symbol, *parameters)#:nodoc:
5. case method_symbol.id2name
6. when /^create_([_a-z]\w*)/ then new($1, *parameters).mail
7. when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver!
8. when "new" then nil
9. else super
10. end
11. end
12. end
13. def deliver!(mail = @mail)
14. raise "no mail object available for delivery!" unless mail
15. logger.info "Sent mail:\n #{mail.encoded}" unless logger.nil?
16. begin
17. send("perform_delivery_#{delivery_method}", mail) if perform_deliveries
18. rescue Exception => e # Net::SMTP errors or sendmail pipe errors
19. raise e if raise_delivery_errors
20. end
21. return mail
22. end
23. private
24. def perform_delivery_smtp(mail)
25. destinations = mail.destinations
26. mail.ready_to_send
27.
28. Net::SMTP.start(smtp_settings[:address], smtp_settings[:port], smtp_settings[:domain],
29. smtp_settings[:user_name], smtp_settings[:password], smtp_settings[:authentication]) do |smtp|
30. smtp.sendmail(mail.encoded, mail.from, destinations)
31. end
32. end
33.
34. def perform_delivery_sendmail(mail)
35. IO.popen("#{sendmail_settings[:location]} #{sendmail_settings[:arguments]}","w+") do |sm|
36. sm.print(mail.encoded.gsub(/\r/, ''))
37. sm.flush
38. end
39. end
40. end
41. end
42. end
module ActionMailer
class Base
class << self
def method_missing(method_symbol, *parameters)#:nodoc:
case method_symbol.id2name
when /^create_([_a-z]\w*)/ then new($1, *parameters).mail
when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver!
when "new" then nil
else super
end
end
end
def deliver!(mail = @mail)
raise "no mail object available for delivery!" unless mail
logger.info "Sent mail:\n #{mail.encoded}" unless logger.nil?
begin
send("perform_delivery_#{delivery_method}", mail) if perform_deliveries
rescue Exception => e # Net::SMTP errors or sendmail pipe errors
raise e if raise_delivery_errors
end
return mail
end
private
def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
Net::SMTP.start(smtp_settings[:address], smtp_settings[:port], smtp_settings[:domain],
smtp_settings[:user_name], smtp_settings[:password], smtp_settings[:authentication]) do |smtp|
smtp.sendmail(mail.encoded, mail.from, destinations)
end
end
def perform_delivery_sendmail(mail)
IO.popen("#{sendmail_settings[:location]} #{sendmail_settings[:arguments]}","w+") do |sm|
sm.print(mail.encoded.gsub(/\r/, ''))
sm.flush
end
end
end
end
end
我们可以清楚的看到ActionMailer的调用顺序,首先是method_missing捕捉deliver_xxx方法,然后进入deliver!方法,然后根据deliver_method进入perform_deliver_xxx方法。
可以看到,sendmail方式的实现也非常简单,直接使用IO.popen方法来调用系统命令。
使用Sendmail这一Linux下高性能邮件服务器发送邮件,可以避免使用Gmail等邮件系统提供的smtp服务不稳定或需要Recaptcha图片验证等麻烦问题。
分享到:
相关推荐
此外,还可以利用`MvcMailer`库,这是一个专门为ASP.NET MVC设计的邮件发送工具,它通过ActionMailer.NET库为每个邮件创建一个MVC控制器,使邮件定制更加直观。 从提供的压缩包文件"MvcMailer-master"来看,这可能...
email-spec, 在使用ActionMailer或者Pony的ruby 应用中,收集 testing/minitest匹配器的集合和用于测试电子邮件的Cucumber 步骤 电子邮件规范用于 RSpec 。MiniTest 和 Cucumber 步骤的匹配器集合,使测试邮件顺利...
使用Roadie时,开发者可以轻松地将其集成到Ruby项目中,比如与ActionMailer(Rails的邮件发送工具)配合使用。只需要在配置好ActionMailer后,设置`:delivery_method`为`:roadie`,并指定基础URL,Roadie就会自动...
actionmailer-2.3.5.gem
capybara-email, 使用Capybara测试你的ActionMailer和Mailer消息 CapybaraEmail 轻松测试 ActionMailer 和邮件在你的集成测试中安装将此行添加到你的应用程序的Gemfile中:gem 'capybara-email'然后执行: $ bund
3. 在你的ActionMailer类中,定义一个方法来设置邮件的属性,如主题、发件人、收件人等,并指定使用哪个模板。例如: ```ruby class UserMailer def welcome_email(user) @user = user mail(to: user.email, ...
本篇将详细讲解如何使用ActionMail来实现邮件功能。 首先,理解ActionMail的工作原理至关重要。ActionMail基于MVC(模型-视图-控制器)架构,它将邮件的发送逻辑视为一个“动作”,并提供了模板来处理邮件内容的...
与ActionMailer一起使用时,它可与ActiveRecord Mailer和。 如果您要结合自动浏览器解决方案(例如Selenium)来测试电子邮件,则需要在测试环境中使用 。 (这是因为您的测试过程和服务器过程是不同的,因此需要...
在Ruby on Rails框架中,我们经常使用ActionMailer模块来处理邮件发送。LetterOpener可以很好地与ActionMailer集成,作为其强大的调试工具。 在压缩包子文件的文件名称列表中,“letter_opener-master”可能表示这...
mail_safe 在开发使用ActionMailer的应用程序时,邮件保险箱提供了一个安全网。 它可以防止电子邮件逃逸。 一旦安装并配置了该gem,就可以确保您的应用不会将电子邮件发送到外部电子邮件地址。 取而代之的是,通常会...
用于通知的电子邮件通知程序,不依赖于 ActionMailer,可以在 Rails 之外使用,即与 Grape 一起使用。 截至目前,它仅支持文本电子邮件。 作为一种传递方法,它可以使用或或您定义的自定义方法。 为什么? 我已经...
actionmailer-2.3.11 安装redmine必须的gem插件
一个ActionMailer适配器,可使用SendGrid的HTTPS Web API(而不是SMTP)发送电子邮件。 与Rails 5和Sendgrid API v3兼容。 安装 将此行添加到您的应用程序的Gemfile中: gem 'sendgrid-actionmailer' 用法 为您的...
滴头 使用基于规则的滴灌广告系列系统来干燥您的邮件程序代码,该系统可与Rails和ActionMailer一起使用。好处: 从控制器中删除邮件状态逻辑依靠活动记录范围以DRY方式制作复杂的DRIP广告系列为什么: 我需要一个...
要求您将需要设置一个邮戳帐户,服务器和发件人签名(或经过验证的域)才能使用它。 有关设置的详细信息,请查看。 另外,您将需要带有版本1.0及更高版本。 支持的Rails版本Rails 6.0 Rails 5.0 Rails 4.x Rails 3.x...
ResqueMailer是一个用于异步处理邮件的库,它结合了Resque的工作队列系统和ActionMailer的功能,旨在提高应用性能,避免在发送大量邮件时阻塞主线程。而Devise则是一个灵活的身份验证解决方案,用于管理用户注册、...
**Ruby-Mail:深入理解Ruby邮件库** Ruby-Mail是一个强大的Ruby库,专为处理电子邮件而设计。这个库使得在Ruby应用程序中创建、解析、发送和接收邮件变得轻而易举。Mail库提供了丰富的功能,包括解析MIME(多用途...
这篇博文将深入探讨Rails中的邮件支持。 首先,让我们了解一下Action Mailer。它是Rails内置的一个组件,专门用于发送电子邮件。它的工作原理是通过创建一个名为Mailer的类,该类定义了如何构建和发送邮件。例如,...
ResqueMailer 一个gem插件,允许ActionMailer准备的消息异步传递。 假设您正在使用进行后台作业。 请注意,Resque :: Mailer的最新(2.0+)版本仅适用于Rails 3.x或更高版本。 对于与Rails 2兼容的版本,在Gemfile中...
把它想象成 ActionMailer,但用于定时电子邮件序列。 它还可以执行其他操作,例如发送短信。 入门 开始使用 Heya 很容易: 安装 Heya gem 将此行添加到应用程序的 Gemfile 中: gem "heya" , github : "honey...