环境
- Rails: 6.0.3.2
- Ruby: 2.7.1
1. 去QQ邮箱那里开通SMTP(已开通的拿到授权码即可)
- 点击”设置“
- 进入设置后,再点击“账户”
- 然后往下滑,找到”账户安全“那一块的设置,先打开启用两个服务,然后点击“获取授权码”。记得将这个授权码保存下来,后面会用到。
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.erb
和 app/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
这里边有两点需要注意的:
- 上面定义的
welcome
是实例方法,而这里没有实例化就直接调用,这里的写法是正确的!Action Mailer::Base 里边定义了相应的method_missing?
方法,调用Mailer
里边未定义的方法时,如果存在相对应的实例方法,则会被拿去生成一个MessageDelivery
对象,感兴趣的同学自己去了解下。 -
调用
welcome_mailer
后,紧接着还要调用deliver_later
,我之前忘记调用这个,结果只拿到了个对象,并没有发送邮件。
写在最后
表示QQ邮箱的那几张截图是真的拉低格调,QQ邮箱这界面真的是...唉