`
cowoo
  • 浏览: 48955 次
  • 性别: Icon_minigender_1
社区版块
存档分类

使用ActionMailer发送邮件(smtp方式)

阅读更多
前一段用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 代码
 
  1. class Notifier < ActionMailer::Base  
  2.   def test()  
  3.       @recipients = "xxx@xxx.com"  
  4.       @subject = "test the send email by ror through gmail."  
  5.   end  
  6. end  


而调用的时候是调用Notifier.deliver_test这么来调用,而在ActionMailer里面,是调用的perform_delivery_smtp(mail)这个方法
ruby 代码
 
  1. def perform_delivery_smtp(mail)  
  2.     destinations = mail.destinations  
  3.     mail.ready_to_send  
  4.   
  5.     Net::SMTP.start(server_settings[:address], server_settings[:port], server_settings[:domain],  
  6.         server_settings[:user_name], server_settings[:password], server_settings[:authentication]) do |smtp|  
  7.             smtp.sendmail(mail.encoded, mail.from, destinations)  
  8.         end  
  9.     end  
  10. end  


可以看到,这个方法里面调用的是Net::SMTP包里面的方法,于是我又打开Net::SMTP这个类,结果发现这个类在一开始就说:
ruby 代码
 
  1. # This library does NOT provide functions to compose internet mails.  
  2. # You must create them by yourself. If you want better mail support,  
  3. # try RubyMail or TMail. You can get both libraries from RAA.  

也就是说只能访问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 代码
 
  1. ActionMailer::Base.raise_delivery_errors = true  
  2.    
  3. ActionMailer::Base.perform_deliveries = true  
  4. ActionMailer::Base.default_charset = "utf-8"  
  5.          
  6.                
  7. ActionMailer::Base.delivery_method = :msmtp  
  8.                
  9. module ActionMailer  
  10.     class Base  
  11.         def perform_delivery_msmtp(mail)  
  12.             IO.popen("d:\\msmtp -t -C d:\\.msmtprc -a gmail --""w"do |sm|  
  13.                 sm.puts(mail.encoded.gsub(/\r/, ''))  
  14.                 sm.flush  
  15.             end  
  16.         end  
  17.     end  
  18. end  

然后就可以使用gmail发信了,至于发送邮件的代码,请参考《Agile。。。》以及wiki.rubyonrails.org。
分享到:
评论
10 楼 blackanger 2007-05-28  
引用
gmail的smtp是带ssl身份认证的,缺省的ActionMailer只能做文本身份认证,ssl的smtp都用不成。
有一个插件可以让ActionMailer支持ssl。看看CruiseControl.rb就知道怎么用了。

多谢。。。
9 楼 blackanger 2007-05-28  
我也是那么设置的啊。。。
8 楼 cowoo 2007-05-27  
引用
gmail的smtp是带ssl身份认证的,缺省的ActionMailer只能做文本身份认证,ssl的smtp都用不成。
有一个插件可以让ActionMailer支持ssl。看看CruiseControl.rb就知道怎么用了。


对啊,msmtp是支持的啊,我的Xp是这么设置的

account gmail
host smtp.gmail.com
auth on
user XXXx@gmail.com
password XXXXX
tls on
port 587
tls_starttls on
from XXXx@gmail.com
maildomain gmail.com
account default : gmail
7 楼 gigix 2007-05-27  
blackanger 写道
搂主好,我有个问题,我用的是msmtp的方式,是在linux下,我的路径是

IO.popen("/usr/local/msmtp/bin/msmtp -t -C /usr/local/msmtp/bin/.msmtprc -a gmail --", "w") do |sm| 

点了发送按钮一会发送成功,一会就报错,不知道什么原因。信件是收不到。我也是连的gmail,配置就是把楼主上面的msmtp配置改了下用户名和密码。希望帮我解决一下,谢谢了。
Errno::EPIPE in Send emailController#sendemail

Broken pipe

RAILS_ROOT: script/../config/..
Application Trace | Framework Trace | Full Trace

config/environment.rb:77:in `write'
config/environment.rb:77:in `puts'
config/environment.rb:77:in `perform_delivery_msmtp'
config/environment.rb:76:in `popen'
config/environment.rb:76:in `perform_delivery_msmtp'
app/controllers/send_email_controller.rb:15:in `sendemail'
-e:4:in `load'
-e:4


gmail的smtp是带ssl身份认证的,缺省的ActionMailer只能做文本身份认证,ssl的smtp都用不成。
有一个插件可以让ActionMailer支持ssl。看看CruiseControl.rb就知道怎么用了。
6 楼 cowoo 2007-05-27  
这几天比较忙,呵呵<br/>
看你的错误好像是跟linux的管道机制有关吧,这方面我也不熟哦。另外,你都在linux下了,为什么不配一个sendmail呢?还要用gmail这么麻烦的方式?
5 楼 blackanger 2007-05-27  
发了三天了。。。唉,亏我还一直关注着。91683
4 楼 blackanger 2007-05-25  
搂主好,我有个问题,我用的是msmtp的方式,是在linux下,我的路径是

IO.popen("/usr/local/msmtp/bin/msmtp -t -C /usr/local/msmtp/bin/.msmtprc -a gmail --", "w") do |sm| 

点了发送按钮一会发送成功,一会就报错,不知道什么原因。信件是收不到。我也是连的gmail,配置就是把楼主上面的msmtp配置改了下用户名和密码。希望帮我解决一下,谢谢了。
Errno::EPIPE in Send emailController#sendemail

Broken pipe

RAILS_ROOT: script/../config/..
Application Trace | Framework Trace | Full Trace

config/environment.rb:77:in `write'
config/environment.rb:77:in `puts'
config/environment.rb:77:in `perform_delivery_msmtp'
config/environment.rb:76:in `popen'
config/environment.rb:76:in `perform_delivery_msmtp'
app/controllers/send_email_controller.rb:15:in `sendemail'
-e:4:in `load'
-e:4

3 楼 javafifth 2006-12-01  
这回行了,谢谢。上次错的原因有两个,一是没有下载win32版本的msmtp,二是路径写错了。不过ror的提示也很有意思,它不说没有找到文件,而是说限制访问,让我以超级用户的身份对目录忙活了半天。
2 楼 cowoo 2006-12-01  
我没有遇到过这种情况,不清楚你这个是没有权限访问msmtp还是controller里面的问题。

我是直接下载msmtp的包,然后把WinXP or newer那个里面的msmtp.exe扔到D:就好了,然后就可以访问了。

我猜想可能有几个原因,一个是controller里面的权限问题,一个是操作系统的权限问题(你是用什么用户运行的服务器?)
1 楼 javafifth 2006-12-01  
我用的也是 win2003 ,可是运行却得到下面错误:<br/>
<br/>
<h1>   Errno::EACCES        in UsersController#create    </h1>
<pre>Permission denied - d:\msmtp -t -C d:\.msmtprc -a gmail --<br/><br/>说限制访问,那该如何做以允许访问 msmtp 呢?</pre>
<div id='dictdiv' style='margin: 5px; font-family: arial; font-size: 13px; display: none;'> </div>
<div id='dictaudio'> </div>

相关推荐

    使用ActionMail发送邮件

    # 或者 deliver_later 如果你想异步发送邮件 flash[:success] = '欢迎注册!我们已向您发送了一封欢迎邮件。' redirect_to root_path else render 'new' end end ``` 总结起来,ActionMail在Rails中提供了一...

    asp.net mvc 网站发邮件

    总结起来,ASP.NET MVC中的邮件发送涉及SMTP服务器配置、MailMessage对象创建以及使用SmtpClient发送邮件。而MvcMailer库则提供了一种更方便的方式来管理和定制邮件模板,使得在ASP.NET MVC项目中处理邮件变得更加...

    Ruby-LetterOpener在浏览器中预览邮件代替发送

    通常,当我们在应用中发送邮件,它们会直接进入真实的SMTP服务器并被发送出去。使用LetterOpener,我们可以拦截这些邮件并在本地环境中查看,无需实际发送。 这个库的工作原理是在本地创建一个临时Web服务器,显示...

    mailgun-rails-example:使用 Mailgun 的 API 或 SMTP 使用 Ruby on Rails 发送电子邮件

    发送邮件只需调用这个方法: ```ruby UserMailer.welcome_email(User.find(1)).deliver_now ``` 如果你想使用SMTP,可以将`delivery_method`设置为`:smtp`,并提供SMTP服务器的设置。例如: ```ruby config....

    Ruby-MailCatcher一个抓取和查看邮件的web工具

    MailCatcher作为SMTP服务器,监听特定端口(默认1025),当你的应用程序尝试通过SMTP协议发送邮件时,MailCatcher会拦截这些邮件,而不是真正将其发送出去。邮件被截获后,其内容会被存储,并在Web界面中展示,包括...

    rails 邮件支持

    在生产环境中,你需要配置SMTP服务器来实际发送邮件。这通常在`config/environments/production.rb`中进行: ```ruby config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { ...

    sendgrid-actionmailer:通过ActionMailer提供的Rails支持

    一个ActionMailer适配器,可使用SendGrid的HTTPS Web API(而不是SMTP)发送电子邮件。 与Rails 5和Sendgrid API v3兼容。 安装 将此行添加到您的应用程序的Gemfile中: gem 'sendgrid-actionmailer' 用法 为您的...

    Ruby-Mail一个Ruby邮件库

    Ruby-Mail不仅限于构造和解析邮件,它还可以通过SMTP(简单邮件传输协议)发送邮件。只需配置SMTP服务器的详细信息,就能轻松发送邮件。 ```ruby mail.delivery_method :smtp, { address: 'smtp.gmail.com', port...

    Mailer:“邮件程序”将信件发送到指定的地址

    它的使用方式相对更底层,灵活性更高,但可能需要更多的代码来实现相同的功能。 在实际开发中,为了确保邮件的安全性和可靠性,通常会结合使用验证机制(防止垃圾邮件)、错误处理(邮件发送失败时的重试或通知)、...

    mandrill_mailer:发送Mandrill模板电子邮件的小工具

    继承现有Rails邮件中的MandrillMailer类,以使用其基于模板的电子邮件通过Mandrill发送事务性电子邮件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'mandrill_mailer' 然后执行: $ bundle install 或将其...

    deliver_to_me:Ruby on Rails 插件,它提供了一个新的 ActionMailer

    在现实世界中,您的应用程序发送的电子邮件的收件人不是您自己的电子邮件,因此您必须破解您的数据库或使用自定义 smtp 来获取电子邮件。 您是否配置并运行了重新定义电子邮件收件人的本地 smtp?

    ralis gem files

    ActionMailer 提供了一种方便的方式来定义和发送邮件,可以将视图模板转化为电子邮件内容。在 Rails 2.3.4 中,它可能支持多种邮件传输协议(如 SMTP, Sendmail 或 File),并且允许开发者定义邮件模板,以适应不同...

    Rails实现的简历系统

    配置SMTP服务器信息后,ActionMailer可以与Gmail、SendGrid等服务集成,实现邮件的可靠发送。 综上所述,这个简历系统涵盖了Rails开发中的多个重要方面,从用户交互(图片上传、验证码)、数据管理(查询、分页、...

    详解Ruby on Rails中的mailer相关使用

    - 生产和开发环境的`delivery_method`应设置为`:smtp`,以通过SMTP服务器发送邮件。 10. **样式处理**: - HTML邮件中的样式应尽可能使用行内样式,因为某些邮件客户端可能不支持外部样式表。可以使用`premailer-...

    rails2.3.2 ExceptionNotifier 配置

    此外,如果你的应用使用的是Rails 2.x版本,可能需要处理ActionMailer的配置,确保它可以正确地发送邮件。这通常涉及到设置SMTP服务器信息,例如在`config/environment.rb`中: ```ruby ActionMailer::Base.smtp_...

    Rails Recipes

    6. 电子邮件:Rails提供ActionMailer,一个方便发送邮件的组件。书中会介绍如何配置SMTP服务器,创建邮件模板,以及处理订阅和通知等邮件场景。 通过这些“食谱”,开发者可以解决日常开发中遇到的问题,提高代码...

    rails本地安装包完整版

    3. **actionmailer-2.1.0.gem**:ActionMailer使得在Rails应用中发送和接收电子邮件变得简单。它提供了一个抽象层,可以方便地创建、发送和接收邮件,同时处理SMTP服务器的配置和其他邮件相关的设置。 4. **...

    ROR安装必备所有架包

    `actionmailer`是Rails用于发送电子邮件的组件,它允许开发者用Ruby编写邮件逻辑,处理SMTP服务器的连接和邮件发送。`actionmailer-1.3.5.gem`确保了这一功能的实现,简化了应用程序中的邮件通信。 `rake`是一个...

    resque_failed_job_mailer

    概述 每当resque作业失败时,使用resque-failed-job-mailer gem来发送电子邮件以及整个异常回溯。安装可以使用内置的Rails插件脚本来完成插件的安装。 从Rails应用程序的根目录发出以下命令: $ ./script/rails ...

Global site tag (gtag.js) - Google Analytics