来自:
http://www.beyondrails.com/blogs/11
ActionMailer现在的实现只支持smtp和Sendmail两种方式发送邮件,配置分别如下:
# 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的源码:
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图片验证等麻烦问题。
分享到:
相关推荐
email-spec, 在使用ActionMailer或者Pony的ruby 应用中,收集 testing/minitest匹配器的集合和用于测试电子邮件的Cucumber 步骤 电子邮件规范用于 RSpec 。MiniTest 和 Cucumber 步骤的匹配器集合,使测试邮件顺利...
actionmailer-2.3.5.gem
capybara-email, 使用Capybara测试你的ActionMailer和Mailer消息 CapybaraEmail 轻松测试 ActionMailer 和邮件在你的集成测试中安装将此行添加到你的应用程序的Gemfile中:gem 'capybara-email'然后执行: $ bund
与ActionMailer一起使用时,它可与ActiveRecord Mailer和。 如果您要结合自动浏览器解决方案(例如Selenium)来测试电子邮件,则需要在测试环境中使用 。 (这是因为您的测试过程和服务器过程是不同的,因此需要...
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 一个gem插件,允许ActionMailer准备的消息异步传递。 假设您正在使用进行后台作业。 请注意,Resque :: Mailer的最新(2.0+)版本仅适用于Rails 3.x或更高版本。 对于与Rails 2兼容的版本,在Gemfile中...
把它想象成 ActionMailer,但用于定时电子邮件序列。 它还可以执行其他操作,例如发送短信。 入门 开始使用 Heya 很容易: 安装 Heya gem 将此行添加到应用程序的 Gemfile 中: gem "heya" , github : "honey...
看起来不是真的DRY,但是可以使用。 我通过ActionMailer API进行了查看,但没有像AR甚至ActionController那样的钩子。 这就是为什么我在AM上编写了这个微小的1Kb扩展名,为Notifier类添加after_deliver回调的原因。...
在Rails 3.0及更高版本中,ActionMailer使用Mail,并且可以处理您的电子邮件发送和解析需求。 描述: TMail是Ruby的邮件处理库。 它将邮件抽象为可用的对象,使您可以读取,设置,添加和删除标题和邮件正文。 ...
在现实世界中,您的应用程序发送的电子邮件的收件人不是您自己的电子邮件,因此您必须破解您的数据库或使用自定义 smtp 来获取电子邮件。 您是否配置并运行了重新定义电子邮件收件人的本地 smtp?
该gem提供了SparkPost与ActionMailer的无缝集成。 它提供了一个delivery_method基于SparkPost API,使越来越设置,并通过SparkPost在Rails应用程序相当简单发送电子邮件。 入门 将宝石添加到您的Gemfile gem '...
尽管使用 Mass Mandrill 发送电子邮件看起来像使用 ActionMailer 发送电子邮件,但 Mass Mandrill 不依赖于 Rails,它可以在非 Rails 应用程序中使用。 Mass Mandrill 支持批量电子邮件发送和 Mandrill 模板。 要...
Actionmailer是Rails中使用的电子邮件框架,它也可以在Rails之外使用。 尽管premailer-rails具有某些特定于Rails的功能,但它在没有Rails的情况下也可以工作,使其与sinatra等其他框架兼容。这个怎么运作premailer-...
松弛::邮件ActionMailer启发了消息对象。用法将Gemfile gem 'slack-mail'添加到您的Gemfile并安装它。 # Basic usage.Slack :: Mail . new ( text : "..." ) . deliver_now# Using `ActiveJob` to send async (if ...
如何使用我的插件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'http-actionmailer' 然后执行: $ bundle 或自己安装为: $ gem install http-actionmailer 贡献 贡献方向在这里。 执照 根据的规定,该...