整体流程
公司的业务需求是需要一个邮箱验证服务,用户注册后需要验证邮箱,才能继续使用服务。这个服务的基本流程如下:
- 用户注册时,填写邮箱地址作为用户名。
- 后端收到注册请求时,生成一个随机的验证码,发送到用户的邮箱。
- 用户收到邮件后,在注册页面输入邮件中的验证码,并继续注册。
- 后端接口验证验证码是否正确,以及是否与邮箱匹配。
- 验证成功后,注册该用户。
- 验证失败后,提示用户重新验证。
- 验证码的有效期为 24 小时。
- 验证码只能使用一次。
- 验证码错误次数超过 3 次,验证码失效。
- 验证码失效后,用户需要重新注册。
后端服务
后端服务使用 Strapi
+ @strapi/provider-email-nodemailer 这个插件。
配置插件
安装好上面的插件之后,在 Strapi 项目的 config/plugins.js
中配置邮箱服务的信息。
module.exports = ({ env }) => ({
email: {
config: {
provider: 'nodemailer',
providerOptions: {
host: env('SMTP_HOST', 'smtp.qiye.aliyun.com'),
port: env('SMTP_PORT', 465),
secure: true,
auth: {
user: env('**@**.com'),
pass: env('****'),
},
},
settings: {
defaultFrom: '**@**.com',
defaultReplyTo: 'hello@example.com',
},
},
},
})
以上配置在本地开发环境也是可以正常使用的,自己在 Chrome 中切换到了 Charles 代理模式,访问邮箱所属域名下的 URL,通过 Charles 的 Rewrite
功能把请求重写到了本地,这样就能在本地方便地测试邮件发送功能了。
这里有几点要注意:
- host 那里填写的是你的邮箱服务商的 SMTP 服务器地址,由于用的是阿里云的企业邮箱,所以参考这篇文档 阿里邮箱IMAP、POP、SMTP地址和端口信息 里的地址。
- port 那里要填写对应的端口号,阿里邮箱的 SMTP 端口是 465,同时
secure
要设置为true
。 - 在邮箱所属域名的 DNS 解析设置里,同样要把 SMTP 服务器地址填写进去,这样才能正常发送邮件。知道这一点,是因为在用阿里云企业邮箱给自己的 QQ 邮箱发邮件失败,QQ 邮箱给的错误信息里有相关文档:什么是SPF?如何设置SPF来防止我的邮件被拒收呢?,阿里云也搜到了相关文档:退信提示“spf check failed”,按照阿里云的设置搞定了。注意 DNS 解析修改后,要等待一段时间(10 分钟)才能生效。
- 再次发送测试邮件时,QQ 邮箱又返回了 550 Mail content denied 这个错误信息,原来是邮件内容涉嫌大量群发。看了一下,是代码自动生成的内容,修改了之后就可以了。