一个月前就完成的功能,现在才放上来算是补上吧,之前挖了很多坑,慢慢填。
需求比较简单,就是当用户在平台上报名成功后,邮件服务器会将报名信息发送到我们客服的邮箱。
超级简单的功能,但是因为一些配置问题,还是折腾了半个小时,希望这篇简单的配置博客能帮大家省下20分钟。
①生成mailer相关文件
rails generate mailer NAME [method method] [options]
上面是命令格式,下面是命令,命名可根据个人喜好:
rails g mailer MyMailer
②注册邮箱并开通SMTP
怎么注册就不说了,这里以网易邮箱为例(我注册了一个[email protected]),注册完之后在设置里开启SMTP服务,并设置客户端授权密码(很重要,后面要用到)。
这一步记住两个信息:
客户端授权密码
服务器地址,见图二红框部分(不同邮箱服务器有不同的地址,请自己查询)
③rails中简单配置
执行了①中的命令后,rails会在app目录中生成一个mailers文件夹,里面包含了所有的相关文件。
application_mailer.rb
my_mailer.rb(根据名字自动生成)
这两个文件的简单配置如下:
#application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "[email protected]"
layout 'mailer' #指定了邮件的HTML模板,对应views/layouts/mailer.html.slim,也可以指定其他模板
end
#my_mailer.rb
class MyMailer < ApplicationMailer
#自定义发送邮件函数
def send_mail(to, title, u_id, m_id)
#发送的内容取决于你的业务逻辑,仅供参考
#这里发送了用户和任务的信息
@user = User.select("name, phone").find(u_id)
@user.phone = "tel:" + @user.phone
@mission = Mission.select("title").find(m_id)
title = title +" "+ @user.name + "-" + @mission.title
#返回mail对象
mail(
:subject => title,
:to => to,
:from => "[email protected]",
:date => Time.now
)
end
end
补充,mailer.html.slim(用了slim模板):
body
h3 报名通知
div = @user.name
div
a [href=@user.phone] =<> @user.phone
div = @mission.title
④rails邮件环境配置(重要)
#production.rb
Rails.application.configure do
#...只是为了演示邮箱配置的位置,所以省略了其余的配置...
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"
ActionMailer::Base.smtp_settings = {
:address => "smtp.yeah.net", #邮件服务器地址
:port => 25,
:domain => "yeah.net", #服务器域名,如xxx@yeah.net域名就是yeah.net
:authentication => :login,
:user_name => "xxx", #邮件用户名,如xxx@yeah.net用户名就是xxx
:password => "your_smtp_code", #与登录密码不同,此处是客户端授权密码,切记!
}
end
⑤发送邮件
#调用之前定义的函数
MyMailer.send_mail("这是收件人地址", "这是标题", params[:user_id], params[:mission_id]).deliver
既然rails的环境有development,test,production三种,那么邮箱的配置也可以配置三份,邮箱的配置参考上面的配置即可,下面主要讲讲客服邮箱地址的配置(收件人)。
在相应配置文件中加入:
#development.rb
config.x.service_mail = "[email protected]"
#production.rb
config.x.service_mail = "[email protected]"
发送邮件时:
send_to = Rails.configuration.x.service_mail
MyMailer.send_mail(send_to, "这是标题", params[:user_id], params[:mission_id]).deliver
这样在开发环境和产品环境的收件人就不一样了,有利于测试和正常运营。
很简单的东西,但每次实践都有新的想法。
- 邮件内容是HTML文档,看来自己知识面太窄了。既然是HTML文档,那可玩性就很高啦。
- 有时候发邮件会被分到垃圾邮件里面,现在的邮件过滤器大多使用基于贝叶斯概率的学习算法吧,注意邮件用词能减少成为垃圾的可能。
- 上面虽然只实现了用户报名通知客服的简单功能,但是邮件的玩法还有很多,例如通知用户一些活动,作为找回/修改密码的验证都可以。
多做多思考。