ActionMailer邮件发送

技术分享 Finley Fu 2018-10-18 1评论 607
使用邮箱注册,找回密码都需要发送邮件验证码,E-mail寄送都是现代网站必备的一项功能。Rails的ActionMailer元件提供了很方便的Email整合。

一、ActionMailer配置

        开发模式在文件 config/environments/development.rb 中设置,有任何错误会进行提示,当然,生产模式设置为true。

# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = true

        寄信方式的选项包括有:test:sendmailsmtp三种可以选择。sendmail是使用服务器的/usr/bin/sendmail程式,不过因为因为不是每台服务器都有适当安装sendmail。而:test代表并不会实际寄信出去,而是存在ActionMailer::Base.deliveries阵列中方便做自动化测试。

        推荐使用smtp方式进行发送邮件,下面以163邮箱为例,配置development.rb,当然生产环境需要配置production.rb。因为我使用https访问,所以设置了ssl为true,端口也由25变为465。

ActionMailer::Base.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default :charset => "utf-8"
config.action_mailer.default_url_options = { :host => 'xxxxxx' }
ActionMailer::Base.smtp_settings = {  
  :address => "smtp.163.com",
  :port => 465,
  :domain => "163.com",
  :authentication => :login,
  :user_name => "xxxx@163.com",
  :password => "xxxxxx",
  :ssl=> true
}

        注意:这里的password不是邮箱登陆密码,而是授权码。

二、发送邮件

        使用rails的generate命令生成所需文件,下面代码会在 app/mailers文件夹下生成一个user_mailer.rb文件,这就是我们后续发送邮件所需的文件。

rails generate mailer UserMailer
         在user_nailer.rb中添加一个方法,其中defult为发送默认发件人,subject为邮箱标题,to为收件人,date为发送日期

class UserMailer < ApplicationMailer
  default from: "xxxxxx@163.com"
	 
  def create_user(params = {})
    @str  = params[:str]
    mail( :subject => params[:title], 
      :to => params[:email], 
      :date => Time.now
    ) 
   end
end

          在app/views/user_mailer/下新建文件create_user.html.erb,此文件用于生成邮件内容,具体样式可自定义,注意:email所需样式都要包含在此文件中,否则不生效

<p>
   <%= @str %>
</p>

        当然,我们也可以发送纯文本邮件,只需将create_user.html.erb改为create_user.text.erb,然后在文件中写入

这是个纯文本邮件<%= str %>
        至此,邮件发送程序完成,打开rails console,执行
UserMailer.create_user(params).deliver_now!

        即可完成邮件发送

        当然我们不能每次调试邮件内容都真正发送一个邮件,这样就降低了工作效率,那么letter_opener这个gem就为我们提供了开发预览功能,在Gemfile

gem "letter_opener", :group => :development
        然后将config.action_mailer.delivery_method改成:letter_opener,这样在开发模式下就可以用浏览器进行预览。