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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 1、邮件发送介绍首先需要发送平台作为中介来为我们发送邮件,我们介绍两个邮件发送平台,其中SendCloud我们用来做我们实际的项目。MailGun平台适合付费用户,我们了解一下即可。SendCloud(https://sendcloud.sohu.com/)SendCloud平台发送设置比较简单,不需要有自己的域名,可以不进行DNS配置,每天可以免费发送邮件10到50封MailGun(https://www.mailgun.com/)MailGun平台设置比较复杂,必须有自己的域名,需要进行DNS配置,每天可以免费发送1500封邮件

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打开文件,会看到下面内容:


image.png


代码解析:


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/



image.png


你可以看到这三个参数,其中:


:apiUser为xuzhaoning_test_uQgpis


:apiKey在下图中可以看到,为OVx2d8f0SBFqlshe


:from为sendcloud@cxSVVBe4BAIvKZwWyHjm4HuvmQld0FRO.sendcloud.org(注意域名前面要加sendcloud@)


根据我的示例,写出你自己的:apiUser、:apiKey、:from参数


image.png


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,那么到邮箱里面会看到邮件

image.png


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


3、MailGun邮件发送平台


(1)打开链接https://signup.mailgun.com/new/signup,先进行注册(2019年1月8号测试,该链接已经无法打开,要是你注册的时候也是这样,那就看一下代码思路即可)

需要注意几点:


注册时Add payment info now按钮不需要选择


注册完成后,需要到注册时输入的邮箱里面确认一下邮件,输入你的电话号码,收到验证码,验证一下。验证完成后登录,你会发现Domains菜单下有一个DomainName,这是你的域名。


image.png

点开这个域名后,会有Domain Information的信息,这些信息我们会在程序中配置


image.png


(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按钮


image.png


在命令行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">


进行第二次注册,能正常收到邮件啦

邮件有可能会发送到你的垃圾邮箱里面去,这个需要注意


image.png


4、DNS配置(自己需要有已备案的域名)


打开网址https://www.dnspod.cn/console/dns,微信扫码登录

点击添加域名,将自己的域名添加上


image.png


添加完成后,点域名链接,进入到这个页面点击添加记录


image.png

同时我们打开https://app.mailgun.com/app/domains点击相应域名的链接,下拉找到下列信息


image.png



image.png


根据这些信息我们添加我们的记录,添加完成后的效果是这样的:


image.png


两张图片中的列名名字对应:


Hostname—主机记录


Type—记录类型


Enter This Value—记录值


Priority—MX优先级


注意事项:添加记录类型为TXT,记录值为k=rsa;

p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6Vo5Ne2AxVOfnQoWv8qgifSnwChtsjvUSeu04P9oUoY3aV38aHxdvArl0cY2FKDTYw7dd2U52kf2k2Vl+VBUyfUGAhfw2Re3M/hlbEnwM9UQjYHt9xy/CMEtxd2K1Fjc4bmfBtmA5bThKI7Wlf92uIchuYFsBP7xLCoLUUzaNBwIDAQAB的这条记录,他的主机记录是pic._domainkey而不是pic._domainkey.xzn.org


目录
相关文章
|
7月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
7月前
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
141 0
|
7月前
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
82 0
|
7月前
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
89 0
|
8月前
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
9月前
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
10月前
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
10月前
|
Ruby
|
10月前
|
JSON 数据格式 Ruby
|
10月前
|
调度 Ruby