前一段用Ruby on Rails完成了一个应用,在使用ActionMailer发送邮件的时候遇到了一些问题,大概了解了ActionMailer使用smtp发送邮件的一些原理,是记。
使用ActionMailer的smtp发送电子邮件的一个基本要领就是要使用本地的smtp服务器,否则就无法发送成功(我目前的理解是这样)。在Windows下,我测试了一下,WebMail还是比较好用的。当然,你也可以使用msmtp这种工具来使用远程的mail服务器,比如gmail,这个我在后面讲到。
最开始的时候,按照《Agile Web Develepment with Rails》这本书上面进行配置,所有的可能都试过了,163的邮箱、学校的邮箱都试过了,就是不行。出现的状况是发送半天说发送成功,但是实际上根本没有收到邮件。网上翻来覆去的找啊,基本上所有关于Rails发送邮件的资料都扫了一眼,测试多次也不行。心想,这就奇了怪了。对了,忘了说了,我一直是在windows下开发,因为服务器是windows 2003的系统,所以一直在windows下写,免得到时候出这样那样的问题。
后来实在没有办法,把ActionMailer的源码翻出来看,终于发现问题的所在。我们使用ActionMailer的时候是这么用的:
ruby 代码
- class Notifier < ActionMailer::Base
- def test()
- @recipients = "xxx@xxx.com"
- @subject = "test the send email by ror through gmail."
- end
- end
而调用的时候是调用Notifier.deliver_test这么来调用,而在ActionMailer里面,是调用的perform_delivery_smtp(mail)这个方法
ruby 代码
- def perform_delivery_smtp(mail)
- destinations = mail.destinations
- mail.ready_to_send
-
- Net::SMTP.start(server_settings[:address], server_settings[:port], server_settings[:domain],
- server_settings[:user_name], server_settings[:password], server_settings[:authentication]) do |smtp|
- smtp.sendmail(mail.encoded, mail.from, destinations)
- end
- end
- end
可以看到,这个方法里面调用的是Net::SMTP包里面的方法,于是我又打开Net::SMTP这个类,结果发现这个类在一开始就说:
ruby 代码
也就是说只能访问local的smtp服务器。我不知道ActionMailer在后面的版本里面是否注意到这个问题,但是1.12里面一直有这个问题。
接下来问题就好解决了,有两种解决方案,一种是在本机装一个smtp服务器,我试了一下,WinWebMail还不错,比较容易配置和管理:)
另外一种解决方法就是使用msmtp,因为自己配Mail服务器有时候会被当成垃圾邮件,于是准备就使用Gmail来发信。说一下我的配置:
msmtp放在d:盘根目录下面,它的配置文件.msmtprc也放在那个目录下面,内容为:
account gmail
host smtp.gmail.com
auth on
user mygmail@gmail.com
password mypasswd
tls on
tls_starttls on
from mygmail@gmail.com
maildomain gmail.com
account default : gmail
有的时候需要在里面加上一句port 587,我遇见的情况是在我的Windows XP上需要加,而在Windows 2003上不需要。
接下来,在environment.rb的config那段代码里面加入
ruby 代码
- ActionMailer::Base.raise_delivery_errors = true
-
- ActionMailer::Base.perform_deliveries = true
- ActionMailer::Base.default_charset = "utf-8"
-
-
- ActionMailer::Base.delivery_method = :msmtp
-
- module ActionMailer
- class Base
- def perform_delivery_msmtp(mail)
- IO.popen("d:\\msmtp -t -C d:\\.msmtprc -a gmail --", "w") do |sm|
- sm.puts(mail.encoded.gsub(/\r/, ''))
- sm.flush
- end
- end
- end
- end
然后就可以使用gmail发信了,至于发送邮件的代码,请参考《Agile。。。》以及wiki.rubyonrails.org。
分享到:
相关推荐
email-spec, 在使用ActionMailer或者Pony的ruby 应用中,收集 testing/minitest匹配器的集合和用于测试电子邮件的Cucumber 步骤 电子邮件规范用于 RSpec 。MiniTest 和 Cucumber 步骤的匹配器集合,使测试邮件顺利...
用于ActionMailer的 SMTP API集成。 请上查看该协议的详细信息。 安装 将Mandriller宝石添加到您的Gemfile中。 gem "mandriller" 并运行bundle install 。 将以下内容添加到config/environments/任何环境设置中...
mail_safe 在开发使用ActionMailer的应用程序时,邮件保险箱提供了一个安全网。 它可以防止电子邮件逃逸。 一旦安装并配置了该gem,就可以确保您的应用不会将电子邮件发送到外部电子邮件地址。 取而代之的是,通常会...
capybara-email, 使用Capybara测试你的ActionMailer和Mailer消息 CapybaraEmail 轻松测试 ActionMailer 和邮件在你的集成测试中安装将此行添加到你的应用程序的Gemfile中:gem 'capybara-email'然后执行: $ bund
与ActionMailer一起使用时,它可与ActiveRecord Mailer和。 如果您要结合自动浏览器解决方案(例如Selenium)来测试电子邮件,则需要在测试环境中使用 。 (这是因为您的测试过程和服务器过程是不同的,因此需要...
一个ActionMailer适配器,可使用SendGrid的HTTPS Web API(而不是SMTP)发送电子邮件。 与Rails 5和Sendgrid API v3兼容。 安装 将此行添加到您的应用程序的Gemfile中: gem 'sendgrid-actionmailer' 用法 为您的...
actionmailer-2.3.5.gem
尽管使用 Mass Mandrill 发送电子邮件看起来像使用 ActionMailer 发送电子邮件,但 Mass Mandrill 不依赖于 Rails,它可以在非 Rails 应用程序中使用。 Mass Mandrill 支持批量电子邮件发送和 Mandrill 模板。 要...
ResqueMailer 一个gem插件,允许ActionMailer准备的消息异步传递。 假设您正在使用进行后台作业。 请注意,Resque :: Mailer的最新(2.0+)版本仅适用于Rails 3.x或更高版本。 对于与Rails 2兼容的版本,在Gemfile中...
继承现有Rails邮件中的MandrillMailer类,以使用其基于模板的电子邮件通过Mandrill发送事务性电子邮件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'mandrill_mailer' 然后执行: $ bundle install 或将其...
在现实世界中,您的应用程序发送的电子邮件的收件人不是您自己的电子邮件,因此您必须破解您的数据库或使用自定义 smtp 来获取电子邮件。 您是否配置并运行了重新定义电子邮件收件人的本地 smtp?
把它想象成 ActionMailer,但用于定时电子邮件序列。 它还可以执行其他操作,例如发送短信。 入门 开始使用 Heya 很容易: 安装 Heya gem 将此行添加到应用程序的 Gemfile 中: gem "heya" , github : "honey...
用于通知的电子邮件通知程序,不依赖于 ActionMailer,可以在 Rails 之外使用,即与 Grape 一起使用。 截至目前,它仅支持文本电子邮件。 作为一种传递方法,它可以使用或或您定义的自定义方法。 为什么? 我已经...
它提供了一个delivery_method基于SparkPost API,使越来越设置,并通过SparkPost在Rails应用程序相当简单发送电子邮件。 入门 将宝石添加到您的Gemfile gem 'sparkpost_rails' 然后运行bundle命令进行安装。 ...
actionmailer-2.3.11 安装redmine必须的gem插件
滴头 使用基于规则的滴灌广告系列系统来干燥您的邮件程序代码,该系统可与Rails和ActionMailer一起使用。好处: 从控制器中删除邮件状态逻辑依靠活动记录范围以DRY方式制作复杂的DRIP广告系列为什么: 我需要一个...
Postmark Rails Gem是ActionMailer通过发送电子邮件的插件。 该gem的创建旨在实现快速实施,并完全支持所有。用法请参阅以获取有关库功能的详细说明。 有关一般Postmark API的详细信息,请查看。要求您将需要设置一...
我的任务是保存我们发送给用户的所有电子邮件-当然不是内容,而是至少电子邮件和主题(或模板)。 如果您发送大量电子邮件并想知道该特定用户收到了哪些电子邮件,这将非常有用。 一种简单的方法是在每个...
Actionmailer是Rails中使用的电子邮件框架,它也可以在Rails之外使用。 尽管premailer-rails具有某些特定于Rails的功能,但它在没有Rails的情况下也可以工作,使其与sinatra等其他框架兼容。这个怎么运作premailer-...
默认情况下,Pong使用作为ActionMailer的传递方法。 除了通过mailgun-ruby轻松集成之外,没有其他特殊原因,因为它们有免费计划,每月发送的邮件过多,目的是偶尔发送电子邮件警报。 由于免费计划不允许临时发送,...