rails3邮件发送 以及 OpenSSL::SSL::SSLError错误解决

今天在做一个php的项目实现邮件发送功能的时候突然想起rails里的邮件功能还没有实现(以前配置了两三天都没有搞好,还以为是环境问题)。今天又重新去配置了一下,奇迹般的成功了happy,2013的第一天一个好的开始,希望今年能让自己脱胎换骨,沉下心来做一个真正的码农。

在这里几记录一下

现在的邮件发送功能基本上都是调用的gmail和163等的邮件服务器,自己基本上不会在服务器上面搭建邮件服务器了下面以gmail为例说一下rails3的邮件发送机制

首先配置SMTP

将下面的配置放到environment.rb 最后,记住一定是最后(这个很重要

 ActionMailer::Base.raise_delivery_errors = true
 ActionMailer::Base.delivery_method = :smtp
 ActionMailer::Base.smtp_settings = {
   :address => "smtp.gmail.com",
   :port => 587,
   #:domain => "whot.city-china.com.cn",
   :user_name => "***********@gmail.com",
   :password => "*************",
   :authentication => :plain,
   :enable_starttls_auto => true
 }

然后在mailers里面创建一个Notifier 类继承ActionMailer

class Notifier < ActionMailer::Base
  delivers_from 'system@loudthinking.com'

  def welcome(recipient)
    @recipient = recipient
    mail(:to => recipient,
         :subject => "[Signed up] Welcome #{recipient}")
  end
end

再写erb文件,views中创建notifier/welcome文件,此文件里面就是邮件内容,如:

<!DOCTYPE html>
 <html>
 <head>
 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
 </head>
 <body>
 <h1>Welcome to example.com, <%= @user.name %></h1>
 <p>
 You have successfully signed up to example.com,
 your username is: <%= @user.login %>.<br/>
 </p>
 <p>
 To login to the site, just follow this link: <%= @url %>.
 </p>
 <p>Thanks for joining and have a great day!</p>
 </body>
 </html>

最后在对应的controller里面调用,调用很简单

Notifier.welcome(@user).deliver

好了,大功告成,但是这种方法并不是太好,发邮件最好是使用异步方式,rails3的ActionMailer并没有提供异步方式,在rails4中已经实现了这一功能,rails3需要借助一些gem正在研究中,待续……

详细请看 http://api.rubyonrails.org/

本人还是新手,有什么说的不对的地方欢迎指正,也欢迎一起探讨异步方式,提供一些大家用过的gem

另外我是在配置完上面后遇到了 OpenSSL::SSL::SSLError 这类型的错误的话,看你的ssl gem包是否有,如果没有就在Gemfile里面加上 gem ‘ssl’ 然后bundle install  我是这样解决了问题的