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

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

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

环境准备

主机设置

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

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

1
netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995'
  1. 设置主机名, 推荐使用mail.your-domain, 假设域名为example.com
    可以用如下命令
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环境

推荐一键安装

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文件

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

安装mailu

如果需要nginx反向代理

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

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地址, 如下

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

然后在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>:<你的端口>;
}
}

启动

配置完成, 启动!

1
docker compose -p mailu up -d

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

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

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