让邮件获得自由
邮件服务是一个历史悠久、在互联网各个领域广泛使用的服务,然而他存在一些问题,我一直尝试通过一些自己定制的方案解决。
目标
下面我是设想的个人邮件解决方案,有的部分已经实现,有的部分待需要创造条件以后再实现。
- 自由的命名:通过自己的域名随心所欲地创建邮箱名。
- 安全的存储:发送到指定的邮箱,可以轻松切换,甚至存放到自己的设备中。
- 灵活的管理:可以对邮件内容按照预定规则进行过滤、分类、自动化等操作。
具体方法
域名邮箱
首先,我需要有自己的域名。
然后通过一些第三方或者自建的服务实现邮件的透明转发:
- Cloudflare Email:仅支持接收,不能发送邮件。
- AnonAddy / SimpleLogin:可以搭在自己的服务器上,也可以直接付费使用官方服务,支持接收和发送。
最简单的方法是免费使用 Cloudflare Email 转发,这也是我目前使用的方法。
邮箱接收
我选择了使用已有的第三方邮箱服务来接收和存储,比如 Outlook、Gmail。
你也可以自建 dovecot 服务来存储和处理邮件,这在我未来的计划中。
我们可以使用 fetchmail 或者 getmail 通过 IMAP 定时去第三方邮箱服务中获取新邮件并下载到自己的 dovecot 中。
但是这要求第三方邮箱服务允许通过用户名/密码登录 IMAP。而 Gmail 通过一系列的限制,让 IMAP 必须通过 OAuth2 登录,极大地提高了脚本接入门槛,几乎使自动化变成不可能,因此被我移出了常用邮箱的行列。
邮件过滤和预处理
以往邮件的过滤都是在邮箱服务端进行的,因此我们配置在一个邮箱的规则只能用于那一个邮箱,无法脱离特定邮箱成为一个统一的解决方案。
一个统一的方案应该是跨平台、可移植、可自动化的,且不依赖任何一个第三方服务。
这里有两个选择:
- 使用 imapfilter 脚本进行邮件处理,无需关心接入的是哪个服务商,因为 IMAP 协议是通用的。
- 在 dovecot 中使用 sieve 脚本。sieve 本身也是一个通用的邮件过滤方案,然而支持 sieve 的服务并不多,因此基本上相当于是一个和 dovecot 耦合的方案。
我选择的是前者,因为脚本 + crontab 在我看来非常灵活而且可控。
用户端接入
如果邮件全部下载到自己的 dovecot,那我们就不再需要使用客户端分别查询每个邮箱了。
这时我们可以使用 roundcube 提供 webmail 管理 dovecot 中的邮件,也可以直接使用 Thunderbird、K-9 Mail 等客户端工具接入。
值得一提的是 dovecot 是一个单用户的服务,不适合与好友一起用。
问题
为什么不自建服务?
自建服务最大的问题在于,邮件服务对服务器的要求比较高,他需要:
- 服务器开放 25 端口,很多服务商为了避免 Spam 直接屏蔽了
- 服务器 IP 不在被屏蔽的列表中,有些 ISP 会把居民的 IP 列入被屏蔽的列表
- 服务器 IP 不在 Spam 列表中,自己的 IP 直接发送邮件很容易被列入公开的 Spam 列表
因此,你可能需要找一个合适的服务器自建服务,或者去申请移出 Spam 列表,解除端口屏蔽,然而这些操作都不一定能成功。
此外,自建 服务更容易因为服务器异常、网络异常等意外导致收不到重要邮件,这是我希望避免的。
如何看待 E2EE 的邮件服务?
现在有诸如 Proton、Tutanota、Skiff 之类宣称 E2EE 的邮件服务商,提供收费的邮件服务,也有很小的免费额度。
在我看来这种 E2EE 其实很鸡肋,因为邮件发送始终是明文的,发送和接收的过程都是明文的,其他邮件服务商也是可以获取到完整的邮件内容的,这并不是真正的 E2EE。
而他们宣称的 E2EE 仅限于邮件存放在他们服务器上的部分,即用户查看邮件时是下载后到本地解密。因此这一层加密保护仅仅是针对他们的服务器被攻击时避免邮件内容泄漏。
那如果使用自己的 dovecot 存储,其实也可以较大程度避免这个问题。每次有新邮件我们就通过 IMAP 或者 POP 下载下来并删除服务器上的备份,那是否有 E2EE 就无关紧要了。当然你可以说服务器不一定会物理删除,但是这种问题对于 E2EE 的服务商同样存在,你如何确保他加密后并没有留存明文的备份呢?