文章

自建域名邮箱 - Mailcow

前言

自建域名邮箱可以让你拥有自己的邮箱域名,比如 @example.com,而不是使用 @gmail.com@outlook.com 等邮箱服务商提供的邮箱域名。自建域名邮箱的最大好处是可以自定义邮箱服务器,比如你可以使用自己的 VPS 服务器作为邮箱服务器,而不是使用邮箱服务商提供的邮箱服务器。你可以完全掌控自己的邮箱数据,而不用担心邮箱服务商会突然关闭你的邮箱账号。

之前一直白嫖用的 Microsoft 365 E5 订阅的自定义域名邮箱,可以添加多个域名,总共 25 个账户。这也是全功能的自定义域名邮箱,包括客户端设置 SMTP、POP3、IMAP、Exchange等,甚至也支持设置共享邮箱,可供一组人(如支持团队)使用,以便从同一电子邮件地址接收和发送电子邮件。此外,每个用户还可以使用 5T 的 OneDrive 云盘,Microsoft 365 E5 是真的香。但毕竟是开发者就可以免费使用的订阅,不知道什么时候会被关闭或者因为滥用而被封号,所以如果想要长期使用自定义域名邮箱,还是自建一个比较好。

本文将使用 Mailcow 搭建一个全功能的自定义域名邮箱,邮件得分可以到满分:

Mailcow

你也可以参考 Mailcow 的官方文档,但其 DNS 设置不够详细,本文将对整个安装和配置过程进行详细说明。

前期准备

服务器

选择服务器是自建域名邮箱的关键一步。邮件服务器需要开放的端口比较多,其中最重要的就是 25 端口,这是 SMTP 服务必需的。但很多VPS厂商由于垃圾邮件的发送和其他恶意活动,选择禁止或限制了 25 端口。因此,在选择VPS时,务必要确定所选的厂商是否开放了 25 端口。如果不确定,最好提前联系客服进行确认。

所以选择那些对邮件服务友好、已经默认开放 25 端口的 VPS 厂商会更为便捷。这里推荐的两家:

  • Contabo: Contabo 是一家德国的VPS厂商,它提供的 VPS 价格合理且性能稳定。最重要的是,它默认开放了 25 端口,为邮件服务提供了很好的支持。Contabo 以高配低价著称,由于 Mailcow 的容器化部署对内存要求较高,所以也非常推荐使用 Contabo 的 VPS 基本款。右上角切换成欧元更便宜,基础款 VPS 仅需 5.99 欧元/月,配置为 4 核 8G 内存 200G SSD 硬盘,流量 25TB,带宽 200Mbps,支持 25 端口。

  • RackNerd: RackNerd 是一家美国的VPS厂商,它的服务也非常受欢迎。和 Contabo 一样,RackNerd 也支持 25 端口,并提供了多种配置选择,以满足不同用户的需求。

对于其他云服务器厂商,例如 Oracle Cloud 等,可能需要自己申请开放 25 端口。

邮件服务还需要设置 rDNS (Reverse DNS) 记录,即反向 DNS 记录。rDNS 记录是将 IP 地址解析为域名的过程,而 DNS 记录则是将域名解析为 IP 地址的过程。邮件服务器发送邮件时,会将邮件服务器的 IP 地址放在邮件头中,而邮件头中的 IP 地址可以通过 rDNS 记录解析为域名。如果邮件服务器的 IP 地址没有设置 rDNS 记录,那么邮件可能会被对方的邮件服务器拒收,因为对方的邮件服务器会认为该邮件是垃圾邮件。因此,设置 rDNS 记录是非常重要的。而 Contabo 支持直接在服务器面板设置 rDNS,非常方便。

搭建方案选择

自建域名邮箱的方式有很多,比如使用 MailcowMail-in-a-BoxiRedMail 等。这些方式都需要自己购买 VPS 服务器,然后在服务器上安装相应的软件。Mail-in-a-Box 之前尝试过,其需要在服务器上搭建一个 DNS 服务器,较为麻烦,而且不支持 Docker 容器化部署。

这里我选择使用 Mailcow,因为它的安装方式比较简单,而且支持 Docker 容器化部署,可以在服务器上快速部署,但其内存占用较大,因此也十分推荐 Contabo。此外,Mailcow 也提供了 Web 界面,可以方便地管理邮箱账号,而 Web 也可以设置反向代理,不占用 80 或 443 端口,方便与其他服务共存。

服务搭建

准备

本文使用的系统为 Ubuntu 22.04。首先需要安装 Docker 和 Docker Compose,可以参考 Docker 官方文档。建议使用安装脚本安装,安装脚本会自动安装 Docker 和 Docker Compose,并设置 Docker 服务开机自启动。

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

邮件服务会使用若干端口(25|80|110|143|443|465|587|993|995|4190),需要在服务器开放这些端口。建议使用 ufw 防火墙,在 Ubuntu 系统下已默认安装。ufw 只需开放 22 端口(SSH 端口)。如果你想要反向代理 Web Dashboard,例如使用 Nginx 或者 Caddy 等,ufw 则还需要开启 80 和 443 端口。至于邮件服务用到的其他端口,由于 Docker 会修改 iptables 规则,因此不需要使用 ufw 手动开放。

1
2
3
4
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable

接下来我们需要一个域名,本文将以 example.com 为例,并以 Cloudflare 为例,介绍如何配置域名解析,建议将域名托管到 Cloudflare。

配置 Mailcow

请以 root 用户安装 Mailcow,否则可能会出现权限问题。

克隆 Mailcow 项目到本地:

1
2
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

下面初始化 Mailcow:

1
./generate_config.sh

输入 FQDN 作为 hostname,例如 mail.example.com

反代 Web Dashboard(可选)

如果你想采用反向代理来访问 Web Dashboard,那么需要编辑 mailcow.conf,修改以下内容:

1
2
3
4
5
HTTP_PORT=18080
HTTP_BIND=127.0.0.1

HTTPS_PORT=18443
HTTPS_BIND=127.0.0.1

其中,端口 18080 和 18443 可以自定义,使用反向代理的话一般只需要用到 HTTP_PORT。HTTP_BIND 和 HTTPS_BIND 一般需要设置为 127.0.0.1,这样 Docker 就不会将这两个端口暴露到公网(即无法通过 IP 地址 + 端口号的形式来访问),而只会映射到本地,否则也就失去了反向代理的意义。

例如使用 Caddy 作为反代服务器,你 CaddyFile 中只需要输入以下内容即可:

1
2
3
https://mail.example.com {
    reverse_proxy 127.0.0.1:18080
}

Caddy 会帮你自动完成 HTTPS 证书的申请和续签,非常方便。

注意,如果想要 Caddy 能够自动完成 HTTPS 证书的申请和续签,需要首先对域名进行解析,即在 Cloudflare 中添加 A 记录解析,即将 mail.example.com 解析到服务器 IP 地址。

启动 Mailcow

在当前目录下,安装并启动 Mailcow:

1
2
docker compose pull
docker compose up -d

现在可以访问 Web Dashboard 了,地址为 https://mail.example.com,用户名为 admin,密码为 moohoo

首先修改管理员密码,点击右侧上方的 System - 配置 - 权限管理 - 编辑管理员,然后输入新的密码。

Mailcow DNS 配置

一个邮件服务器需要配置 SPF、DKIM、DMARC 等,这些有助于提高邮件的送达率,而不会被判定为垃圾邮件或者被拒收。这些配置都对应到相应的 DNS 记录。下面我们将一一进行配置。

首先在 Mail Web Dashboard 中,点击右侧上方的 E-Mail - 配置 - 添加域名,输入 example.com,然后点击 添加域名并重启。然后在 操作 栏点击 DNS,等待一会,查看系统检测到的目前的 DNS 记录。当前状态下只有 A 记录,即将 mail.example.com 解析到服务器 IP 地址。

  • IPV6 记录

    如果你的服务器支持 IPV6,那么需要添加 IPv6 记录。在 Cloudflare 中,点击 添加记录,选择 AAAA 类型,输入 mail,然后输入服务器 IPV6 地址。

  • rDNS

    在 Contabo control panel 中,点击 Reverse DNS Management,然后为 IPv4 和 IPv6 地址分别设置 rDNS 记录,即将 IP 地址解析为 mail.example.com

    其他 VPS 厂商可能需要申请客服来添加 rDNS 记录,请咨询客服。

  • TLSA

    在 Cloudflare 中,点击 添加记录,选择 TLSA 类型,输入 _25._tcp.mail,然后 Usage (required)、Selector (required)、Matching type (required) 分别选择 311,最后根据 Web Dashboard 中提供的正确数据,输入正确的 Certificate (hexadecimal) (required)。

    如果 Web Dashboard 中没有提供 TLSA 的数据,例如显示 110: Operation timed out,那么说明服务器没有开放 25 端口,需要检查并开放 25 端口,例如 UFW 使用 ufw allow 25 命令开放 25 端口。

  • MX 记录

    在 Cloudflare 中,点击 添加记录,选择 MX 类型,输入 @,内容输入 mail.example.com,优先级为 10

  • CNAME 记录

    在 Cloudflare 中,点击 添加记录,选择 CNAME 类型,输入 autodiscover,然后输入 mail.example.com

    继续添加 CNAME 记录,输入 autoconfig,然后输入 mail.example.com

  • SRV 记录

    SRV 较为复杂,具体配置如图所示:

    SRV 记录

  • SPF 配置

    在 Cloudflare 中,点击 添加记录,选择 TXT 类型,输入 @,内容输入 v=spf1 mx a -all

  • DMARC 配置

    在 Cloudflare 中,点击 添加记录,选择 TXT 类型,输入 _dmarc,内容输入 V=DMARC1;p=reject;rua=mailto:root@example.com

    注意,这里的 root@example.com 需要是一个真实的地址。 这个地址的主要作用是接收 DMARC 聚合报告。这些报告为域名拥有者提供关于其域名电子邮件使用情况的反馈,特别是哪些邮件是合法的,哪些可能是仿冒的。它们提供了关于邮件的详细信息,如发件人、接收时间、发件的IP地址等。等 DNS 全部设置完毕后,需要创建这个邮箱账号。

  • DKIM 配置

    在 Cloudflare 中,点击 添加记录,选择 TXT 类型,输入 dkim._domainkey,然后内容请输入 Web Dashboard 中提供的正确数据。

全部 DNS 记录配置完毕后,可以点击 Web Dashboard 中域名页面的 DNS 按钮,查看是否配置正确。

邮箱使用

创建账号

在 Web Dashboard 中,点击右侧上方的 E-Mail - 配置 - 邮箱 - 添加邮箱。输入用户名和密码。

Webmail

在 Web Dashboard 中,点击右侧上方的 应用 - Webmail,即可进入 Webmail。

输入用户名和密码,即可登录 Webmail。

Webmail

客户端设置

例如在 Apple Mail.app 中,添加账户,然后输入用户名和密码,配置 STMP 和 IMAP 服务器地址,都为 mail.example.com,都需要输入用户名和密码,其余默认即可。

效果

当上述 DNS 配置都设置好后,可以使用 Mail Tester 来测试邮件的送达率。输入邮件内容,建议内容多一点,不然太像垃圾邮件。一般情况下,邮件得分可以到满分:

Test Email

发送一封邮件到 Gmail,也会被判定为一封重要邮件:

Gmail

查看原始邮件,也可以看到 SPF、DKIM、DMARC 都已经通过验证:

Original EMail

本文由作者按照 CC BY 4.0 进行授权