【Ruby on Rails全栈课程】3.7 邮件发送(SendCloud、MailGun)

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插件
  • 在Gemfile文件中添加代码gem "rest-client"
#邮件
gem "rest-client"
  • 再运行bundle install安装rest-client插件
vagrant@vagrant-ubuntu-trusty-64:/vagrant/data_system$ bundle install

可能碰到错误:
ERROR: Could not find a valid gem 'rest-client' (>= 0), here is why: Unable to download data from [https://gems.ruby-china.org/](https://gems.ruby-china.org/) - bad response Not Found 404 ([https://gems.ruby-china.org/specs.4.8.gz](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(注意域名前面要加sendcloud@)
    根据我的示例,写出你自己的: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)
  puts "=我在终端打印的信息=====#{response}"
#参考代码,无需粘贴
#  flash.notice = "注册成功!请登录"

代码解析:

  • puts "====#{response}"
    在终端打印出你发送邮件的状态。可能有以下几种情况:
    情况一:result为true,代表邮件发送成功,如果邮箱里面没有发现邮件,很可能在垃圾邮件里面。
    =我在终端打印的信息====={"result":true,"statusCode":200,"message":"请求成功","info":{"emailIdList":["[1547387146303_106646_12494_290.sc-10_9_13_213-inbound0$276782280@qq.com](mailto:1547387146303_106646_12494_290.sc-10_9_13_213-)]}}
    情况二:result为false,代表邮件发送失败,我们再看message里的信息为"发信人地址from格式错误",这是因为lib/send_mail.rb文件中的:from参数配置错误,可以检查一下域名是否粘贴少了几位或者域名前面没有加sendcloud@
    =我在终端打印的信息====={"result":false,"statusCode":40802,"message":"发信人地址from格式错误","info":{}}

SendCloud开发文档:
http://www.sendcloud.net/doc/email_v2/

(6)测试,我们重新回到注册页面,填写信息提交。

提交后,先到终端看一下打印信息,如果result为true,那么到邮箱里面会看到邮件


如果result为false,就需要看message里面的提示信息,找到对应信息并检查改正。改完之后ctrl+c停止项目,rails c进入控制台,删掉刚刚注册的信息Account.last.deleteexit退出控制台,rails s启动项目,重新查看终端打印信息。

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

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵宁一

点赞是最好的赞赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值