PI Review Email Service 邮件服务
这篇博客讲一讲 PI Review 邮件服务是怎么搭的。这篇博客更多的是学习笔记,而不是技术教程。所以有些地方可能说不清楚,也不够细节,请见谅。
需求
PI Review 网站目前对外使用的邮箱地址有三个,有以下三种情况分别使用三个邮箱:
自动发送邮件 (
[email protected]
)。在用户注册账号的时候,程序自动发送邮件,验证其注册邮箱。在用户忘记密码的时候,程序自动发送邮件,重置密码。接收用户邮件 (
[email protected]
)。用户联系我们,如添加大学、无法激活账号、建议等管理员回复用户邮件 (
[email protected]
)
流程介绍
我做了一张图来总结 PI Review 目前的 Email Service
用户发送邮件到 PI Review (红线)
- Step 1. User sends an email to
[email protected]
- Step 2. Cloudflare routes this email to
[email protected]
- Step 3. Mailgun forwards this email to admin’s personal gmail
[email protected]
用户注册账号/找回密码(蓝线)
- Step 1. User signs up an account
- Step 2. Flask app generates email content with token
- Step 3. mailgun sends the email to the user using
[email protected]
管理员回复用户邮件(绿线)
- Step 1. Admin uses her personal gmail account to reply user’s email
- Step 2. Mailgun sends the email to user using
[email protected]
具体实现
Porkbun Email Hosting
先从最简单的开始说。一开始我们使用的是域名网站 porkbun.com 自带的邮件服务 (Email Hosting),可以接收邮件和人工发送邮件。就像 gmail 一样,它有一个网页端界面 webmail.porkbun.com,两个管理员可以共用一个账号和密码登录。价格是每年 $24,如下图。
如上图所示,Porkbun 还提供免费的 Email Forwarding 服务,它可以把发送到 [email protected]
的邮件转发到你指定的邮箱,但没办法用 [email protected]
发送邮件,略显不专业。
今年5月份开始,我们不再使用 Porkbun Email Hosting。原因是感觉需要登录 porkbun webmail 网页查看邮件不太方便,我们做不到每天都上去查一下邮件,于是有些邮件就得不到及时回复。因此,今年5月份之后我们就不再用 Porkbun 自带的 email hosting service 了(具体看 Cloudflare 部分内容)。
Flask Mail
关于 Flask App 如何自动给用户发送邮件,参考这篇博客,我去年是跟着这个教程实现的。
The Flask Mega-Tutorial Part X: Email Support
这篇博客讲了如何实现重置密码的功能,具体来说有4步(激活账号的功能非常类似)
- 用户发送重置密码的请求
- Flask APP 生成 Password Reset Tokens
- Flask APP 发送重置密码的邮件 (带有token的链接)
- 用户点击邮件里的链接,重置密码
我在开发 Flask 后端逻辑的时候,我测试用的是 Gmail 的 Email Server。等我实现完这部分的功能后,才切换成 [email protected]
的邮箱(具体看 mailgun 部分)。我可能还参考了另一篇博客
The Flask Mega-Tutorial Part VII: Error Handling
Mailgun
目前两个@mail.pi-review.com
的邮箱都是 mailgun 负责。
Flask APP 发送邮件
用 Mailgun 发送邮件的配置,具体操作步骤如下,先登录mailgun
Add domain, i.e.
mail.pi-review.com
Follow these steps to veify your domain (go to cloudflare and add DNS records)
Add new SMTP user
[email protected]
and[email protected]
Add SMTP settings information on PI-Review server (config.json)
以上步骤完成后,Mailgun 可以取代 Flask Mail 环节里的 Gmail Email Server 来自动给用户发邮件(验证邮箱、重置密码等)。
转发邮件到 Gmail
想要把 [email protected]
收到的邮件转发到管理员的私人 gmail 邮箱,需要在 Mailgun 里设置
- Enter Receiving page
- Create route: Match Recipient
- Recipient:
[email protected]
- Forward:
[email protected]
- Save route
这样就解决了最初使用 Porkbun 时查看邮件不方便的问题。管理员只需要每天查看自己的 gmail 邮箱,就能看到有没有人给 PI Review 发邮件。
Gmail 发送邮件
管理员的 Gmail 不仅要能收邮件,最好还能以 PI Review 的身份回邮件(而不是显示私人邮箱地址)。因此,需要在 Gmail 账号了设置。
- Gmail: see all settings
- Accounts and Import
- Send mail as: Add another email address
- Add SMTP credentials (在 Flask APP 发送邮件那一部分有)
做完以上操作,管理员就可以用自己的 gmail 回PI Review 邮件的时候,就可以选择用 [email protected]
回邮件了。
Cloudflare
DNS 设置
以下是把 DNS server 从 porkbun 迁移到 Cloudflare 的步骤。
- Cloudflare: Add a site -> choose Free plan -> delete default records
- Porkbun: change authoritative nameservers
- Cloudflare: DNS setting add A record
- mailgun: add domain: mail.pi-review.com (参见 Mailgun 那一部分)
- Cloudflare: DNS setting add more records
Email Routing
最后这一步,是要把用户发到 [email protected]
的邮件转发到 [email protected]
。为什么会需要这一步?因为一开始我们用的是 Porkbun Email Hosting 来收发邮件,用的是 [email protected]
。而 porkbun 没办法自动发邮件,所以当时我们用 Mailgun 的时候,就用了 [email protected]
,而不是 [email protected]
,因为 pi-review.com
被 porkbun 占用了。所以这个相当于是历史遗留问题,现在我们不用 porkbun email hosting了,但我们还希望继续让用户发送邮件到 [email protected]
邮箱。
具体步骤是在 Cloudflare
- 点击 Emai
- 设置 Email Routing
- create address:
[email protected]
send to[email protected]