搭建自己的邮件服务器 - mailcow
mailcow 是一个使用 Docker 容器化部署的邮件服务器。
1. 环境要求
1.1 设备
不能在群晖/威联通等NAS设备上安装,也不能在 OpenVZ、LXC或其他容器平台上安装。
可以在 KVM, PVE, ESX, Hyper-V 或其他完全虚拟化的平台中安装。
最低的硬件配置:
资源 | mailcow: dockerized |
---|---|
CPU | 1 GHz |
内存 | 最小 6 GB + 1 GB 交换区 |
硬盘 | 20GB(不包含邮件) |
系统 | x86_64 |
ClamAV(反病毒)
和 Solr(全局搜索)
会使用较多的内存 ,可以在配置文件 mailcow.conf
中通过 SKIP_CLAMD=y
和 SKIP_SOLR=y
来关闭它们。
1.2 内存
官方描述
单个 SOGo(mailcow 使用的 webmail)会使用大概350MB的内存,使用过后会被清除,并释放这些内存。同一时间活动的连接越多,就需要越大的内存。
50个 IMAP 连接需要 16 GB 内存。
5 - 10 用户需要 8GB 内存。
实际使用
实际部署测试时,在 4G 内存电脑上也可以部署成功,部署完成后总共使用了 3G 内存,每登录一个 邮件客户端,内存就多占用 100M。
如果预计给500个用户使用,在一个人只登录一个客户端的情况下,64G 的内存应该是够的。
1.3 系统
系统 | 兼容性 |
---|---|
Alpine 3.17+ and older | 部分兼容(需手动调整) |
Centos 7 | 完全兼容 |
Debian 10, 11 | 完全兼容 |
Ubuntu 18.04, 20.04, 22.04 | 完全兼容 |
Alma Linux 8 | 完全兼容 |
Rocky Linux 9 | 完全兼容 |
其他没有经过官方测试的系统也可能能够正常使用。
1.4 端口
部署前需要检查 mailcow 的端口是否被占用
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
# or:
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
如果你的服务器有防火墙,需要打开以下端口来确保邮件服务能够正常使用。 如果使用家庭网络,需要配置好端口映射。
服务 | 协议 | 端口 | 容器 | 对应配置文件中的变量 |
---|---|---|---|---|
Postfix SMTP | TCP | 25 | postfix-mailcow | ${SMTP_PORT} |
Postfix SMTPS | TCP | 465 | postfix-mailcow | ${SMTPS_PORT} |
Postfix Submission | TCP | 587 | postfix-mailcow | ${SUBMISSION_PORT} |
Dovecot IMAP | TCP | 143 | dovecot-mailcow | ${IMAP_PORT} |
Dovecot IMAPS | TCP | 993 | dovecot-mailcow | ${IMAPS_PORT} |
Dovecot POP3 | TCP | 110 | dovecot-mailcow | ${POP_PORT} |
Dovecot POP3S | TCP | 995 | dovecot-mailcow | ${POPS_PORT} |
Dovecot ManageSieve | TCP | 4190 | dovecot-mailcow | ${SIEVE_PORT} |
HTTP(S) | TCP | 80/443 | nginx-mailcow | ${HTTP_PORT} / ${HTTPS_PORT} |
2. 安装
需要已经安装 Docker >= 20.10.2 和 Docker Compose > =2.0 。
切换到 root,并查看 umask 必须为 0022.
# su
# umask
0022
切换到 /opt
目录,将 docker-compose 文件克隆到本地,然后切换到 mailcow-dockerized
目录
# cd /opt
# git clone https://github.com/mailcow/mailcow-dockerized
# cd mailcow-dockerized
初始化 mailcow,有三个地方需要手动确认:
hostname:
用于访问网页邮箱的域名,如 mail.leftblue.topTimezone [Asia/Shanghai]:
服务器所在时区,如: Asia/ShanghaiChoose the Branch with it´s number [1/2]:
安装的分支,选 1
初始化完成后会生成一个 mailcow.conf
配置文件
如果你想使用反向代理,可以在mailcow.conf
中修改如下配置
HTTP_BIND=127.0.0.1
HTTPS_BIND=127.0.0.1
启动 mailcow
docker-compose pull
docker-compose up -d
此时你可以通过网页访问 mailcow,默认用户 admin
密码 moohoo
这时已经可以通过网页邮箱发送邮件了,继续配置 DNS,完成后将可以接收邮件。
3. DNS设置
以域名 leftblue.top
为例
3.1 最小设置
mail.leftblue.top
为邮件服务器 IP 对应的域名,将 1.2.3.4 改为你的服务器IP地址
主机记录 | 记录类型 | 记录值 |
---|---|---|
A | 1.2.3.4 | |
autodiscover | CNAME | mail.leftblue.top |
autoconfig | CNAME | mail.leftblue.top |
@ | MX | mail.leftblue.top |
3.2 SPF, DKIM, DMARC 和 PTR
- SPF(Sender Policy Framework)
发件人策略框架是一种反垃圾邮件方案,以下记录表示只允许MX记录指向的服务器发送邮件:
主机记录 | 记录类型 | 记录值 |
---|---|---|
@ | TXT | v=spf1 mx a -all |
- DKIM(DomainKeys Identified Mail)
域名密钥识别用于邮件域名验证,存储了电子邮件签名的公钥。其可以在 System > 配置 > 选项 > ARC/DKIM 密钥
中查看
主机记录 | 记录类型 | 记录值 |
---|---|---|
dkim._domainkey | TXT | v=DKIM1; k=rsa; t=s; s=email; p=... |
- DMARC(Domain-based Message Authentication, Reporting & Conformance)
基于域的消息身份验证、报告和一致性用于防止他人伪造域名,以下例子使用 DMARC Assistant 生成。将 admin@leftblue.top
改为你的邮件服务器中的邮件地址即可。
主机记录 | 记录类型 | 记录值 |
---|---|---|
_dmarc | TXT | v=DMARC1; p=reject; rua=mailto:admin@leftblue.top |
- PTR(Pointer Record)/ RDNS
域名反向解析可以使用IP地址解析为域名,用于提升服务器 IP 及域名的信誉度,可以减少被识别为垃圾邮件的概率。
腾讯云太坑了,PTR 服务还要单独购买,这里就不设置了。
3.3 高级设置
以下与各服务默认的端口相同,可以不设置。
SRV记录可以为域名中的特定协议指定服务器。如果要显式说明没有提供某个服务,使用 "." 保存为记录值。
SRV 记录格式: 优先级+空格+权重+空格+端口+空格+主机名,如 5 0 5269 xmpp-server.l.google.com
主机记录 | 记录类型 | 记录值 |
---|---|---|
_autodiscover._tcp | SRV | 0 1 443 mail.example.com |
_caldavs._tcp | SRV | 0 1 443 mail.example.com |
_caldavs._tcp | TXT | path=/SOGo/dav/ |
_carddavs._tcp | SRV | 0 1 443 mail.example.com |
_carddavs._tcp | TXT | path=/SOGo/dav/ |
_imap._tcp | SRV | 0 1 143 mail.example.com |
_imaps._tcp | SRV | 0 1 993 mail.example.com |
_pop3._tcp | SRV | 0 1 110 mail.example.com |
_pop3s._tcp | SRV | 0 1 995 mail.example.com |
_sieve._tcp | SRV | 0 1 4190 mail.example.com |
_sieve._tcp | SRV | 0 1 465 mail.example.com |
_submission._tcp | SRV | 0 1 587 mail.example.com |
4. 测试评分
部署好邮件服务器后,邮件测试是不可少的,如果评分过低,发送的邮件会被认为是垃圾邮件。
打开 https://www.mail-tester.com/ ,使用自己的邮箱发送一封邮件到给出的邮箱,就能查看得分了。
可以看到除了没有设置域名反向解析扣了 1.1 分,其他都通过了,得了 8.9 分。
到这里就全部完成了,可以使用我们自己域名的邮箱了。
5. SSL 配置
如果 ssl 配置不正确,将无法通过 https、smtps、pop3s 和 imaps 协议访问邮箱。
mailcow 使用 Let's Encrypt
的 HTTP-01
验证方式获取 ssl 证书,这种方式要求服务必须在 80 端口上提供 http 服务来完成验证。
mailcow 还有自己的校验,申请证书时,mailcow 会校验 mail.leftblue.top
、autoconfig.leftblue.top
、 autodiscover.leftblue.top
这三个域名的 IP 是否和邮件服务器的 IP 相同,然后校验这三个域名的 80 端口是否可以访问 mailcow 的网页。
5.1 云服务器 ssl 配置
如果云服务器配置高,可以在云服务器直接部署 mailcow,只要可以使用 80 端口访问网页邮箱,mailcow 会自动帮我们进行证书的申请。
5.2 家庭网络 ssl 配置
由于家庭网络通常屏蔽了 80 和 443 端口,mailcow 无法自动申请证书。
5.2.1 有云服务器:使用内网穿透
云服务器性能拉跨,邮件服务器部署在家庭网络,使用内网穿透完成 Let's Encrypt
的验证。
- 在
mailcow.conf
中修改SKIP_IP_CHECK=y
和SKIP_IP_CHECK=y
跳过 mailcow 的 IP 校验和 HTTP 服务校验。 mail.leftblue.top
、autoconfig.leftblue.top
、autodiscover.leftblue.top
指向云服务器地址,将 MX 记录指向家庭公网 IP,其他三个记录指向云服务器的 IP。
主机记录 | 记录类型 | 记录值 |
---|---|---|
A | 5.6.7.8(云服务器IP) | |
autodiscover | CNAME | mail.leftblue.top |
autoconfig | CNAME | mail.leftblue.top |
@ | MX | 1.2.3.4(家庭公网 IP) |
- 重启
docker compose up -d
5.2.2 没有云服务器:手动设置 ssl 证书
如果使用自己的证书,到期需要手动更换。
前往云服务商申请证书,华为云、阿里云、腾讯云等都提供免费的证书,期限1年。
申请好之后,下载 nginx 的证书,将 .crt
文件命名为 cert.pem
,.key
文件命名为 key.pem
,上传这两个文件到 mailcow 目录的 data/assets/ssl
替换原文件。
在 mailcown.conf
中修改 SKIP_LETS_ENCRYPT=y
重启服务:
docker restart $(docker ps -qaf name=postfix-mailcow)
docker restart $(docker ps -qaf name=nginx-mailcow)
docker restart $(docker ps -qaf name=dovecot-mailcow)
5.3 验证ssl
在 shell 执行以下命令,能够连接上则表示证书正常
# Connect via SMTP STARTTLS (587)
openssl s_client -starttls smtp -connect mail.leftblue.top:587 | openssl x509 -noout -text
# Connect via SMTP (465)
openssl s_client -connect mail.leftblue.top:465 | openssl x509 -noout -text
# Connect via IMAP STARTTLS (143)
openssl s_client -starttls imap -connect mail.leftblue.top:143 | openssl x509 -noout -text
# Connect via IMAP (993)
openssl s_client -connect mail.leftblue.top:993 | openssl x509 -noout -text
# Connect via HTTPS (443)
openssl s_client -connect mail.leftblue.top:443 | openssl x509 -noout -text
6. 使用
修改管理员密码
在 System > 配置 > 权限管理 > 管理员
中找到需要修改密码的记录,点击编辑即可修改
添加邮件域名
右上角点击 E-Mail > 配置
在标签页找到 域名 > 域名 > 添加域名
页面自定义
右上角点击 System > 配置
在标签页找到 选项 > 页面自定义
7. 遇到的问题
7.1 Cannot match your IP x.x.x.x against hostname autodiscover.leftblue.top (DNS returned y.y.y.y)
邮件服务器的 IP 与域名指向的 IP 不一样,可以修改配置文件 SKIP_IP_CHECK=y
来忽略校验
7.2 Confirmed A record with IP x.x.x.x, but HTTP validation failed
邮件服务器的 IP 校验通过了,但无法通过80端口访问到 http 服务,可以修改配置文件 SKIP_IP_CHECK=y
来忽略
7.3 ValueError: Error getting directory: Url: https://acme-v02.api.letsencrypt.org/directory
网络不稳定造成的,重启 acme 所在的容器再次尝试