使用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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值