1、邮件发送介绍
首先需要发送平台作为中介来为我们发送邮件,我们介绍两个邮件发送平台,其中SendCloud我们用来做我们实际的项目。MailGun平台适合付费用户,我们了解一下即可。
-
SendCloud(https://sendcloud.sohu.com/)
SendCloud平台发送设置比较简单,不需要有自己的域名,可以不进行DNS配置,每天可以免费发送邮件10到50封 -
MailGun(https://www.mailgun.com/)
MailGun平台设置比较复杂,必须有自己的域名,需要进行DNS配置,每天可以免费发送1500封邮件
2、SendCloud邮件发送平台
(1)注册SendCloud,并了解开发文档代码实例
打开https://sendcloud.sohu.com/,点击免费注册。
注册登录后,我们先来看一下SendCloud平台提供的开发文档代码示例,打开链接http://www.sendcloud.net/doc/email_v2/downloads/ruby/ruby_common.rb,会下载下来一个名为ruby_common.rb的文件,用sublime打开文件,会看到下面内容:
-
require 'rest-client'
加载rest-client插件,这个gem我们还没有安装,下面我们会安装 -
:apiUser、:apiKey、:from
这三个参数我们需要在SendCloud平台中找到并替换文件中的代码。 -
:to、:subject、:html
分别代表收件人、邮件主题、邮件内容,我们会将这三个参数设为变量。
(2)安装rest-client插件,在项目命令行下运行gem install 'rest-client'
vagrant@vagrant-ubuntu-trusty-64:/vagrant/data_system$ gem install 'rest-client'
#系统返回信息
Successfully installed rest-client-2.0.2
Parsing documentation for rest-client-2.0.2
Installing ri documentation for rest-client-2.0.2
Done installing documentation for rest-client after 7 seconds
1 gem installed
可能碰到错误:
- ERROR: Could not find a valid gem 'rest-client' (>= 0), here is why:
Unable to download data from https://gems.ruby-china.org/ - bad response Not Found 404 (https://gems.ruby-china.org/specs.4.8.gz)
解决方法:
通过错误信息发现是gem源的问题,我们再安装rails的时候,将gem源换成了国内源,因为下载gem速度更快一些,现在国内gem源不响应了,我们将gem源再换成原先的,运行下面代码:
gem sources --add https://rubygems.org/ --remove https://gems.ruby-china.org/
(3)获取参数:apiUser、:apiKey、:from
打开SendCloud平台(https://sendcloud.sohu.com/email/)
https://sendcloud.sohu.com/email/你可以看到这三个参数,其中:
- :apiUser为xuzhaoning_test_uQgpis
- :apiKey在下图中可以看到,为OVx2d8f0SBFqlshe
- :from为sendcloud@cxSVVBe4BAIvKZwWyHjm4HuvmQld0FRO.sendcloud.org
根据我的示例,写出你自己的:apiUser、:apiKey、:from参数
(4)创建lib/send_mail.rb文件,将代码实例ruby_common.rb文件里面的内容修改为下面的代码。将下面代码粘贴到send_mail.rb文件中,别忘了替换成你自己的:apiUser、:apiKey、:from。
require 'rubygems'
require 'rest-client'
class SendMail
#定义一个类方法,之后可以通过SendMail.send_mail(to,subject,html)来调用这个方法
def self.send_mail(to,subject,html)
response = RestClient.post "http://api.sendcloud.net/apiv2/mail/send",
#使用api_user和api_key进行验证
:apiUser => 'xuzhaoning_test_uQgpis',
#点击左侧菜单API User,点击生成新的API_KEY
:apiKey => '4hBZ7oG2sYqQ2sbk',
#发信人,用正确邮件地址替代
:from => "sendcloud@cxSVVBe4BAIvKZwWyHjm4HuvmQld0FRO.sendcloud.org",
:fromName => "SendCloud",
#收件人地址,用正确邮件地址替代,多个地址用';'分隔
:to => "#{to}",
:subject => "#{subject}",
:html => "#{html}"
return response
end
end
上述代码,除了:from、:apiUser、:apiKey需要替换成自己的外,其他的不需要改动。
代码解析:
-
def self.send_mail(to,subject,html)
我们将示例代码中的def send_mail的实例方法换成类方法,并且传递to,subject,html三个参数。之所以要改成类方法,是因为我们通过SendMail.send_mail(to,subject,html)就可以直接调用这个方法了。传递to,subject,html(收件人、邮件主题、邮件内容)三个参数是因为他们不是一成不变的,会根据注册用户的变化而变化,所以需要通过参数传递。 -
return response
最后返回response,可以直接省略return,只写response也可以。
(5)修改accounts_controller.rb文件,使注册成功的时候给客户注册的邮箱发送欢迎邮件
添加下面三行代码,传给send_mail方法三个参数,分别是收件人邮箱、邮件主题、邮件内容
#参考代码,无需粘贴
#if boolean
subject = "#{name}您好,欢迎加入宠物之家"
html = "#{name}您好,您已注册成功,在宠物之家论坛可以畅所欲言"
response = SendMail.send_mail(email,subject,html)
#参考代码,无需粘贴
# flash.notice = "注册成功!请登录"
SendCloud开发文档:
http://www.sendcloud.net/doc/email_v2/
我们再重新回到注册页面,填写信息提交之后,邮件发送成功了!
3、MailGun邮件发送平台
(1)打开链接https://signup.mailgun.com/new/signup,先进行注册(2019年1月8号测试,该链接已经无法打开,要是你注册的时候也是这样,那就看一下代码思路即可)
需要注意几点:
- 注册时Add payment info now按钮不需要选择
-
注册完成后,需要到注册时输入的邮箱里面确认一下邮件,输入你的电话号码,收到验证码,验证一下。验证完成后登录,你会发现Domains菜单下有一个DomainName,这是你的域名。
点开这个域名后,会有Domain Information的信息,这些信息我们会在程序中配置
(2)Rails可以用generate指令产生Mailer类別,在终端项目目录下输入rails generate mailer UserMailer,会生成一个user_mailer.rb文件
vagrant@vagrant-ubuntu-trusty-64:/vagrant/data_symtem$ rails generate mailer UserMailer
#系统返回信息
create app/mailers/user_mailer.rb
invoke erb
create app/views/user_mailer
(3)在刚刚生成的app/mailers/user_mailer.rb文件中添加信息
#参考代码,无需粘贴
#class UserMailer < ApplicationMailer
default from: "postmaster@sandboxc630d********加密********256568938a7.mailgun.org" #Default SMTP Login
def welcome_email(account)
@account = account
mail(to: @account.email, subject: '欢迎您来到宠物之家')
end
代码解析:
- postmaster@sandboxc630d********加密********256568938a7.mailgun.org
这个需要替换成你自己的第(1)步中Domain Information图片信息中的Default SMTP Login信息
(4)在accounts_controller.rb中,create_account的action中SendColud相关的代码去掉,改成UserMailer.welcome_email(@account).deliver
#原代码
subject = "#{name}您好,欢迎加入宠物之家"
html = "#{name}您好,您已注册成功,在宠物之家论坛可以畅所欲言啦~"
response = SendMail.send_mail(email,subject,html)
#改成
UserMailer.welcome_email(@account).deliver
(5)创建app/views/user_mailer/welcome_email.html.erb文件,并添加下面内容:
<h4>你好<%= @account.name,欢迎来到宠物之家 %></h4>
(6)根据第(1)步截图中Domain Information里面的值,在 config/environments/development.rb文件中配置以下信息
#参考代码,无需粘贴
#config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:authentication => :plain,
:address => "smtp.mailgun.org",
:port => 587,
:domain => "sandboxc630d**************256568938a7.mailgun.org",
:user_name => "postmaster@sandboxc630d**************256568938a7.mailgun.org",
:password => "23beadb408fb***************ca2248-3b1f59cf-5cc2d348"
}
#参考代码,无需粘贴
#end
代码解析:
-
:address、:user_name、:password
分别对应第(1)步中Domain Information图片信息中的SMTP Hostname、Default SMTP Login、Default Password -
:domain
也就是你的域名,Domain Information图片信息中Default SMTP Login@后面的信息。
(7)MailGun更适合付费发送,现在邮件发送需要先授权一下收件人
https://app.mailgun.com/app/account/authorized打开这个网址,点击Invite New Recipient按钮,添加收件人的邮箱。
授权完收件邮箱,现在启动项目,我们开始注册测试一下
- 第一次注册,邮箱会收到一封这样的邮件,点击I Agree按钮
在命令行ctrl+c停止项目,输入rails c进入控制台,输入Account.last.delete删除掉刚刚注册的邮箱
vagrant@vagrant-ubuntu-trusty-64:/vagrant/data_system$ rails c
irb(main):001:0> Account.last.delete
=> #<Account id: 2, name: "xzn", email: "1369822836@qq.com", password: qbRA3yu/7nM=, role: 0, status: 0, created_at: "2018-12-28 09:31:22", updated_at: "2018-12-28 09:31:22", auth_token: "IWHJjiPAWopQtQlc9MNNvQ">
-
进行第二次注册,能正常收到邮件啦
邮件有可能会发送到你的垃圾邮箱里面去,这个需要注意
4、DNS配置(自己需要有已备案的域名)
打开网址https://www.dnspod.cn/console/dns,微信扫码登录
点击添加域名,将自己的域名添加上
添加完成后,点域名链接,进入到这个页面点击添加记录
同时我们打开https://app.mailgun.com/app/domains点击相应域名的链接,下拉找到下列信息
根据这些信息我们添加我们的记录,添加完成后的效果是这样的:
两张图片中的列名名字对应:
- Hostname—主机记录
- Type—记录类型
- Enter This Value—记录值
- Priority—MX优先级
注意事项:添加记录类型为TXT,记录值为k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6Vo5Ne2AxVOfnQoWv8qgifSnwChtsjvUSeu04P9oUoY3aV38aHxdvArl0cY2FKDTYw7dd2U52kf2k2Vl+VBUyfUGAhfw2Re3M/hlbEnwM9UQjYHt9xy/CMEtxd2K1Fjc4bmfBtmA5bThKI7Wlf92uIchuYFsBP7xLCoLUUzaNBwIDAQAB的这条记录,他的主机记录是pic._domainkey而不是pic._domainkey.xzn.org
网友评论