用Mailtrap测试rails的邮件发送服务

rails程序中的邮件服务,一般都是用rails的ActionMail来提供的。
如何在开发中测试邮件服务?
可以用一个真正存在的邮件服务器来测试,比如在自己的电脑上安装一个邮件发送服务器(我一般用postfix),发送真实的邮件,缺点是需要额外的系统/网络依赖,或者用外部邮件服务器(比如Gmail的smtp服务),同样存在环境依赖,具体详细过程我曾经发过一篇 Blog
也可以在测试环境中将ActionMailer的 deliver_method设置为 :test,这样在测试环境中所有发送的邮件都不会送到邮件发送服务器的任务队列,而是保存在 ActionMailer::Base.deliveries这个Array中,在测试环境中直接访问,至于具体如何测试,rails敏捷开发中的ActionMailer那一章讲的非常详细,我就不多说了。

我要说的是一个postfix替代方案,一个用ruby实现的smtp服务模拟程序,用起来比postfix更加环保,他就是 MailTrap
安装,使用都非常简单
ruby 代码
 
  1. # 安装mailtrap 
  2. sudo gem install mailtrap -y  
  3. # 启动mailtrap  
  4. mailtrap start 
  5. # 关闭mailtrap 
  6. mailtrap stop

Mailtrap启动后,默认监听2525端口并提供smtp通讯服务,将所有信息输出到日志文件,可以在日志文件中查看具体邮件信息。

ruby 代码
  1. tail -f /var/tmp/mailtrap.log  
下面用一个具体的rails程序演示整个过程,首先生成一个rails应用
ruby 代码
  1. rails demo -d sqlite3 -f 
  2. cd demo  

生成ActionMailer的scaffold应用,一个邮件发送模型 OrderMailer以及模型包含的邮件发送方法 sent
ruby 代码
  1. ./script/generate mailer order_mailer sent  

不要忘记在rails中配置邮件发参数
在environment.rb的Rails::Initializer.run块中加入下面代码
ruby 代码
 
  1. config.action_mailer.smtp_settings = {  
  2.   :domain  => 'example.com',  
  3.   :address => 'localhost',  
  4.   :port    => 2525  
  5. }  

done!
然后可以启动一个rails的console,在console中手动测试邮件发送
ruby 代码
 
  1. # 创建mail对象  
  2. mail = OrderMailer.create_sent  
  3. # 设置收件人地址  
  4. mail.to = 'foo@bar.com'  
  5. # 设置发件人地址  
  6. mail.from = 'bar@foo.com'  
  7. # 设置邮件主题  
  8. mail.subject = 'test sent mail'  
  9. # 发送邮件  
  10. OrderMailer.deliver(mail)  

查看mailtrap的log记录,刚刚发送成功的邮件信息已经成功写在log里面了。

你可能感兴趣的:(应用服务器,敏捷开发,网络应用,Ruby,Rails)