Rails 6.0 配置 ActionMailer 通过QQ个人邮箱发送邮件

环境

  • Rails: 6.0.3.2
  • Ruby: 2.7.1

1. 去QQ邮箱那里开通SMTP(已开通的拿到授权码即可)

  1. 登录
    https://mail.qq.com

  1. 点击”设置“
    《Rails 6.0 配置 ActionMailer 通过QQ个人邮箱发送邮件》

  1. 进入设置后,再点击“账户”
    《Rails 6.0 配置 ActionMailer 通过QQ个人邮箱发送邮件》

  1. 然后往下滑,找到”账户安全“那一块的设置,先打开启用两个服务,然后点击“获取授权码”。记得将这个授权码保存下来,后面会用到。
    《Rails 6.0 配置 ActionMailer 通过QQ个人邮箱发送邮件》

2. 设置 Aciton Mailer

打开对应的环境配置文件,我这里以development环境为例

  • config/environments/development.rb:

# ... ... # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local ######### mailer setting ######## config.action_mailer.delivery_method = :smtp # 这个是新加的,必须 config.action_mailer.smtp_settings = { address: 'smtp.qq.com', # 照填 port: 465, # 465 或 587 domain: 'qq.com', # 这个照填 user_name: 'xxxx@qq.com', # 你自己的邮箱,开通了 smtp 的 password: 'xxxxxx', # 开通 smtp 拿到的授权码 authentication: 'plain', ssl: true, # 注意这个不要少 enable_starttls_auto: true # 还有这个也不要少 } # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = true # 默认为 false ,打开好调试 ############################### # ... ...

3. 创建邮件发送类

rails g mailer UserMailer

运行完毕后,将会生成 app/mailers/user_mailer.rb 文件

在该文件中添加welcome_email方法

class UserMailer < ApplicationMailer
  # 你自己的邮箱,开通了 smtp 的,这个跟配置文件那个要是一样的
  default from: 'xxxx@qq.com'

  # 一般会是`def welcome_email(user)` 这个样子,这样可以拿到 user 的邮箱
  def welcome_email
    @url = 'https://mini-geek.com'  # 这个是为了后面演示模板插值

    # to 后面跟着你要发送的目标用户的邮箱
    mail(to: 'to_somebody@gmail.com', subject: 'Welcome to mini-geek') 
  end
end

4. 创建邮件模板

Rails Guides 的建议,创建HTML格式的和text格式的各一份,实际上只会发送一封,如果支持HTML就发送HTML模板,否则text。不过好像QQ邮箱支持HTML格式的,但我这里还是创建两份模板。分别是:app/views/user_mailer/welcome_mail.html.erbapp/views/user_mailer/welcome.text.rb ,这两个文件的命名是约定好的,对应上面的邮件类。

  • app/views/user_mailer/welcome_mail.html.erb:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Welcome to <a href="<%= @url %>">mini geek</a></h1> </body> </html>

  • app/views/user_mailer/welcome_mail.text.erb
welcome to mini-geek,link: <%= @url %>

4. 在rails c里边测试

pry(main)> UserMailer.welcome_mailer.deliver_later

这里边有两点需要注意的:

  1. 上面定义的welcome是实例方法,而这里没有实例化就直接调用,这里的写法是正确的!Action Mailer::Base 里边定义了相应的 method_missing? 方法,调用Mailer里边未定义的方法时,如果存在相对应的实例方法,则会被拿去生成一个MessageDelivery对象,感兴趣的同学自己去了解下。

  2. 调用welcome_mailer后,紧接着还要调用deliver_later,我之前忘记调用这个,结果只拿到了个对象,并没有发送邮件。


写在最后

表示QQ邮箱的那几张截图是真的拉低格调,QQ邮箱这界面真的是...唉

点赞

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注