使用docker-mailserver部署自己的email服务
这个邮件服务是用docker部署的, 很多步骤都直接在配置文件中完成了, 非常省事. 而且它只提供邮件服务, 没有webmail, 因此也不占用80/443端口, 这意味着你的服务器还可以用来做其他的事. 我自己在部署的时候发现官方的介绍给的对小白不是很友好, 按照官方的简单部署流程跟着做发现会报错. 而很多能找到的几年前的文章里给的方法大多现在也有改动, 完全照做可能是不行了, 因此这里简单记录下自己摸索的部署过程.
提前准备
首先要有一个绑定了服务器的域名, 要解析DNS, 我这里以cloudflare为例. 这里假设服务器的域名是domain.com, 服务器ip是1.2.3.4, 实际使用时把这个改成自己的就好.
| Type | Name | Content |
|---|---|---|
| A | 1.2.3.4 | |
| MX | domain.com | mail.domain.com |
| TXT | domain.com | v=spf1 mx ~all |
| TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; sp=quarantine |
然后为自己的的VPS添加RDNS记录, 这个不设置的话邮件很容易进Junk. 申请的方法一般是在服务器后台的Network或者IP相关的页面, 我这里以搬瓦工的为例子.
然后申请一个证书, 因为希望走TLS协议, 申请证书的方法在这里和这里详细地介绍过了, 就不赘述了.
配置docker compose
安装docker和docker compose
# 安装docker
curl -sSL https://get.docker.com/ | sh
systemctl enable --now docker
# 安装docker compose
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose下载所需管理和配置文件.
mkdir ~/mailserver && cd ~/mailserver
DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/docker-compose.yml"
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh然后编辑docker-compose.yml文件. 特别注意一下hostname+domainname等于你的邮件域名, 比如下面的填法结果是mail.domain.com. 然后volumes那一项中写好自己的证书地址, 我就以证书存放在/tmp/ssl/为例设置了.
version: '3.8'
services:
mailserver:
image: docker.io/mailserver/docker-mailserver:latest
container_name: mailserver
# If the FQDN for your mail-server is only two labels (eg: example.com),
# you can assign this entirely to `hostname` and remove `domainname`.
hostname: mail
domainname: domain.com
env_file: mailserver.env
# More information about the mail-server ports:
# https://docker-mailserver.github.io/docker-mailserver/edge/config/security/understanding-the-ports/
# To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
ports:
- "25:25" # SMTP (explicit TLS => STARTTLS)
- "143:143" # IMAP4 (explicit TLS => STARTTLS)
- "465:465" # ESMTP (implicit TLS)
- "587:587" # ESMTP (explicit TLS => STARTTLS)
- "993:993" # IMAP4 (implicit TLS)
- "110:110"
- "995:995"
volumes:
- ./docker-data/dms/mail-data/:/var/mail/
- ./docker-data/dms/mail-state/:/var/mail-state/
- ./docker-data/dms/mail-logs/:/var/log/mail/
- ./docker-data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
- /tmp/ssl/:/tmp/ssl:ro
restart: always
stop_grace_period: 1m
cap_add:
- NET_ADMIN
healthcheck:
test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
timeout: 3s
retries: 0填写完毕后配置mailserver.env文件. 由于内容太多, 我只给几个需要修改的地方, 如果有定制化需求可以参考官方说明.
[email protected]
PERMIT_DOCKER=network
SSL_TYPE=manual
SSL_CERT_PATH=/tmp/ssl/server.crt
SSL_KEY_PATH=/tmp/ssl/server.key然后添加邮箱信息.
./setup.sh email add [email protected] your_password生成DKIM 签名记录.
./setup.sh config dkim上面这条指令会在当前目录的./docker-data/dms/config/opendkim/keys/domain.com/目录生成一个mail.txt文件, 根据里面的信息在DNS解析中添加一条Type为TXT, Name为mail._domainkey, Content为DKIM内容的记录. 特别注意的, 字符串太长会有换行情况, 记得把换行的部分给拼接起来, 像下面这样.

填写出来大概是这样子的.

然后就可以up了.
docker-compose up -d mailserver记得开放所需要的端口.
ufw allow 25
ufw allow 110
ufw allow 143
ufw allow 465
ufw allow 587
ufw allow 993
ufw allow 995测试和评分
如果有失败的, 可以看下后面的踩坑记录, 可能会有帮助.
首先测试一下tls有没有生效. 这个网址中输入自己的邮箱域名就可以查看是否支持tls了.
由于docker-mailserver没有webmail, 所以我们要通过客户端使用. 这里以Mac的mail应用为例.
然后发送邮件试试看~

一些后话 (坑)
可以到mail-tester试一下自己邮件服务的评分能达到多少. 我是8.9, 因为这个主机厂商的后台有问题, 我RDNS设置的是邮件域名, 但是莫名其妙解析到了一个奇怪的域名, 只能联系客服解决😅. 解析域名可以用nslookup指令来查看.
然后如果始终发不出邮件, 可以用docker-compose logs -f查看日志, 如果是因为timeout的话, 很大概率是因为服务商把25端口给ban了, 防止垃圾邮件服务部署. 这个的话一般是要联系客服才能开放. 是不是25号端口被ban可以在防火墙查看, 也可以通过telnet smtp.google.com 25测试. 如果结果一直是trying ip...的话那就是没开放, 如果是输出了三行那就是可以正常连接.
更新
在正确的rnds解析生效后, mail-tester分数有10/10了.
Reference
https://github.com/docker-mailserver/docker-mailserver
独特的构思和新颖的观点,让这篇文章在众多作品中脱颖而出。
每个标点都承载着思考的重量。
新车即将上线 真正的项目,期待你的参与
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com