使用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
独特的构思和新颖的观点,让这篇文章在众多作品中脱颖而出。
每个标点都承载着思考的重量。