心血来潮想搭个自己的邮箱服务器,顺便记录一下.
本来试着用了 docker-mailserver 和其他的 mail 服务器,但是要么安装有问题,要么需要的性能太高,而鼠鼠的垃圾服务器只有 2C2G, 只好选 mailu 2.0 这个轻量级了

环境:
Linux 系统,必须带公网 IP, 内存 1G 及以上

推荐用干净的环境装
不过我的服务器裸机安装了 nginx 等套件占了 80 端口,就不得不做反向代理来避免端口占用了,下面会介绍

环境准备

主机设置

  1. 确保 25 端口以及其他端口开放 (防火墙端口和云服务器的端口), 可以用如下命令之一来测试
sh
1
2
3
4
# 腾讯qq邮箱
telnet smtp.qq.com 25
# 或者谷歌邮箱
telnet smtp.google.com 25

还要测试其他端口,主要涉及的如下

sh
1
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995'
  1. 设置主机名,推荐使用 mail.your-domain, 假设域名为 example.com
    可以用如下命令
plaintext
1
sudo hostnamectl set-hostname mail.example.com

DNS 设置

假设你的 IP 是 1.1.1.1, 域名 example.com 为例:
设置 A 记录,主机记录 mail.example.com , 值 1.1.1.1
设置 MX 记录,主机记录为 example.com, 值为 mail.example.com
设置 SPF 记录,也可以是 TXT 记录,主机记录 example.com, 值为 v=spf1 a mx ip4:<your-ip> ~all
设置 DMARC 的 TXT 记录,主机记录是_dmarc , 值为 v=DMARC1; p=none; pct=100; rua=mailto:admin@example.com
最后有个 dkim._domainkey 要安装好了配置,待会儿说

记得修改其中的 example.com 为自己的域名

docker 环境

推荐一键安装

sh
1
2
sudo curl -fsSL https://get.docker.com > get-docker.sh
sudo bash get-docker.sh -s docker --mirror Aliyun

之后可能要配置一下 docker 镜像源 (可以看我文章), 或者科学上网 (可以看我文章), 不多解释

下载 mailu

官网如下
https://setup.mailu.io

img

需要改一下自己的域名
然后 TLS 加密方式选择 letsencrypt (服务器干净时用,如果已经有其他环境了请如图选择 mail-le)

img

然后改网站名称和 URL
step2 的 client 最好选 snappy, 支持中文,另外的不支持中文

img

然后看情况勾上功能插件,性能好就多勾,性能差就不勾,都不影响的
step3 填自己公网 IP

img

然后最好 enable unbound, 不然自己配置会很麻烦
然后 hostname 填上面设置的主机名

提交即可,根据提示执行如下命令 (可能需要 root 或者 sudo, 自己加) 下载 docker-compose 文件

sh
1
2
3
4
mkdir /mailu
cd /mailu
wget 你的url
wget 你的url

安装 mailu

如果需要 nginx 反向代理

服务器干净的可以跳过这步,可以直接看后面的启动部分
如果服务器 80 和 443 已经被占,则需要使用其他端口来跑邮件服务,需要做反向代理
我们在 docker-compose.yml 中找到# Core services 部分
把原本的 80 和 443 改成其他的,比如

yml
1
2
3
ports:
- "x.x.x.x:8880:80"
- "x.x.x.x:8443:443"

修改 mailu.env 文件中的 REAL_IP_HEADER 和 REAL_IP_FROM 部分. x.x.x.x 替换为服务器真实 IPv4 地址,如下

yml
1
2
REAL_IP_HEADER=X-Real-IP
REAL_IP_FROM=x.x.x.x

然后在 nginx 配置文件里设置反向代理,可以参考如下写法

nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
listen 443 ssl http2;
server_name mail.example.com; # 自己的网址

# 如果是其他方式安装的证书, 比如宝塔面板, 则保留他自己的写法
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privatekey.pem;

location / {
proxy_pass http://<服务器公网IP地址或者127.0.0.1>:<你的mailu容器映射出来的http端口,也就是docker-compose中80:80,冒号前面的数字不是80, 看你自己的配置>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~ ^/(admin|sso|static|webdav|webmail)/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://<公网或者127.0.0.1>:<你的端口>;
}
}

启动

配置完成,启动!

sh
1
docker compose -p mailu up -d

如果很慢,则需要换镜像源或者科学上网 (教程见上)

正常启动后,添加管理员 admin@example.com 如下

sh
1
docker compose -p mailu exec admin flask mailu admin admin <example.com> PASSWORD

不出意外,就可以访问 mail.example.com 登录了

最后配置 DKIM 的 DNS, 在后台的域名管理这里,generate key, 然后按提示设置对应的记录即可

img

此外,可能需要配置一下域名反向解析 PTR 会让邮件更可信,需要在服务器提供商那里完成,流程自行百度

最后,可以测试一下自己的邮件是否配置完善 https://www.mail-tester.com/


参考文章

https://mailu.io/1.9/reverse.html#have-mailu-web-frontend-listen-locally

https://juejin.cn/post/7260875830201188408

https://www.bilibili.com/video/BV15Z4y1F7uD

https://www.ctmh.top/p/ 安装和配置电子邮件服务端软件 - mailu/

https://einverne.github.io/post/2021/07/email-server-mailu.html