这个邮件服务是用docker部署的, 很多步骤都直接在配置文件中完成了, 非常省事. 而且它只提供邮件服务, 没有webmail, 因此也不占用80/443端口, 这意味着你的服务器还可以用来做其他的事. 我自己在部署的时候发现官方的介绍给的对小白不是很友好, 按照官方的简单部署流程跟着做发现会报错. 而很多能找到的几年前的文章里给的方法大多现在也有改动, 完全照做可能是不行了, 因此这里简单记录下自己摸索的部署过程.

提前准备

首先要有一个绑定了服务器的域名, 要解析DNS, 我这里以cloudflare为例. 这里假设服务器的域名是domain.com, 服务器ip是1.2.3.4, 实际使用时把这个改成自己的就好.

TypeNameContent
Amail1.2.3.4
MXdomain.commail.domain.com
TXTdomain.comv=spf1 mx ~all
TXT_dmarcv=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相关的页面, 我这里以搬瓦工的为例子.

1

然后申请一个证书, 因为希望走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内容的记录. 特别注意的, 字符串太长会有换行情况, 记得把换行的部分给拼接起来, 像下面这样.

2.png

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

3.png

然后就可以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了.

4

由于docker-mailserver没有webmail, 所以我们要通过客户端使用. 这里以Mac的mail应用为例.

5 6

然后发送邮件试试看~

7.png

一些后话 (坑)

可以到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了.

8

Reference

https://github.com/docker-mailserver/docker-mailserver

https://www.treesir.pub/post/docker-deploy-mailserver/

https://lala.im/4224.html

Tags: none

2 Comments

  1. 独特的构思和新颖的观点,让这篇文章在众多作品中脱颖而出。

  2. 每个标点都承载着思考的重量。

Leave a comment...