文章目录
  1. 1. 需求
  2. 2. 流程介绍
  3. 3. 具体实现
    1. 3.1. Porkbun Email Hosting
    2. 3.2. Flask Mail
    3. 3.3. Mailgun
      1. 3.3.1. Flask APP 发送邮件
      2. 3.3.2. 转发邮件到 Gmail
      3. 3.3.3. Gmail 发送邮件
    4. 3.4. Cloudflare
      1. 3.4.1. DNS 设置
      2. 3.4.2. Email Routing

这篇博客讲一讲 PI Review 邮件服务是怎么搭的。这篇博客更多的是学习笔记,而不是技术教程。所以有些地方可能说不清楚,也不够细节,请见谅。

需求

PI Review 网站目前对外使用的邮箱地址有三个,有以下三种情况分别使用三个邮箱:

  1. 自动发送邮件 ([email protected])。在用户注册账号的时候,程序自动发送邮件,验证其注册邮箱。在用户忘记密码的时候,程序自动发送邮件,重置密码。

  2. 接收用户邮件 ( [email protected] )。用户联系我们,如添加大学、无法激活账号、建议等

  3. 管理员回复用户邮件 ([email protected] )

流程介绍

我做了一张图来总结 PI Review 目前的 Email Service

用户发送邮件到 PI Review (红线)

用户注册账号/找回密码(蓝线)

  • 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步(激活账号的功能非常类似)

  1. 用户发送重置密码的请求
  2. Flask APP 生成 Password Reset Tokens
  3. Flask APP 发送重置密码的邮件 (带有token的链接)
  4. 用户点击邮件里的链接,重置密码

我在开发 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

  1. Add domain, i.e. mail.pi-review.com

  2. Follow these steps to veify your domain (go to cloudflare and add DNS records)

  3. Add new SMTP user [email protected] and [email protected]

  4. Add SMTP settings information on PI-Review server (config.json)

以上步骤完成后,Mailgun 可以取代 Flask Mail 环节里的 Gmail Email Server 来自动给用户发邮件(验证邮箱、重置密码等)。

转发邮件到 Gmail

想要把 [email protected] 收到的邮件转发到管理员的私人 gmail 邮箱,需要在 Mailgun 里设置

  1. Enter Receiving page
  2. Create route: Match Recipient
  3. Recipient: [email protected]
  4. Forward: [email protected]
  5. Save route

这样就解决了最初使用 Porkbun 时查看邮件不方便的问题。管理员只需要每天查看自己的 gmail 邮箱,就能看到有没有人给 PI Review 发邮件。

Gmail 发送邮件

管理员的 Gmail 不仅要能收邮件,最好还能以 PI Review 的身份回邮件(而不是显示私人邮箱地址)。因此,需要在 Gmail 账号了设置。

  1. Gmail: see all settings
  2. Accounts and Import
  3. Send mail as: Add another email address
  4. Add SMTP credentials (在 Flask APP 发送邮件那一部分有)

做完以上操作,管理员就可以用自己的 gmail 回PI Review 邮件的时候,就可以选择用 [email protected] 回邮件了。

Cloudflare

DNS 设置

以下是把 DNS server 从 porkbun 迁移到 Cloudflare 的步骤。

  1. Cloudflare: Add a site -> choose Free plan -> delete default records
  2. Porkbun: change authoritative nameservers
  3. Cloudflare: DNS setting add A record
  4. mailgun: add domain: mail.pi-review.com (参见 Mailgun 那一部分)
  5. 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

  1. 点击 Emai
  2. 设置 Email Routing
  3. create address: [email protected] send to [email protected]
文章目录
  1. 1. 需求
  2. 2. 流程介绍
  3. 3. 具体实现
    1. 3.1. Porkbun Email Hosting
    2. 3.2. Flask Mail
    3. 3.3. Mailgun
      1. 3.3.1. Flask APP 发送邮件
      2. 3.3.2. 转发邮件到 Gmail
      3. 3.3.3. Gmail 发送邮件
    4. 3.4. Cloudflare
      1. 3.4.1. DNS 设置
      2. 3.4.2. Email Routing