美文网首页ruby小白课程实战--宠物论坛
【Ruby on Rails实战】3.7 邮件发送(SendCl

【Ruby on Rails实战】3.7 邮件发送(SendCl

作者: 808cb3be8e58 | 来源:发表于2019-01-08 16:23 被阅读3次

    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
    

    可能碰到错误:

    解决方法:
    通过错误信息发现是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/

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

    (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

    相关文章

      网友评论

        本文标题:【Ruby on Rails实战】3.7 邮件发送(SendCl

        本文链接:https://www.haomeiwen.com/subject/hlberqtx.html