简介

docker-mailserver(简称 DMS)是一款生产级的全功能邮件服务器解决方案,支持 SMTP、IMAP、LDAP 等多种邮件服务协议。DMS 以其“保持简单和可版本化”为核心理念,采用纯文件配置,无需依赖 SQL 数据库,使得部署和管理变得更为简便。DMS 的设计旨在为中小企业或个人用户提供一个稳定、安全且易于维护的邮件服务环境。

参考资源

部署教程

1. 编写 docker-compose 文件

首先,下载必要的 docker-compose.yaml 和环境配置文件 mailserver.env

1
2
3
DMS_GITHUB_URL="https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master"
wget "${DMS_GITHUB_URL}/compose.yaml" -O docker-compose.yaml
wget "${DMS_GITHUB_URL}/mailserver.env"

假设域名为 example.com ,并且希望能够发送和接收该地址 test@example.com 的电子邮件。根据域名修改 docker-compose.yaml 中的 hostname 字段:

1
2
mailserver:
hostname: mail.example.com

2. 配置 DNS 解析

邮件服务器的正常运作依赖于正确的 DNS 设置,以确保邮件能够正常发送和接收。以下是基本的 DNS 记录配置步骤。

添加 MX 记录

  • 记录类型:MX
  • 主机名:@
  • 值:mail.example.com

注意,主机名和邮件服务器是分开的,可将不同域名映射到同一个 mail.example.com。而 mail.example.com 通过 A 记录指向具体的服务地址。

比如 example.com 的 MX 记录指向 mail.example.comexample.net 的 MX 记录也指向 mail.example.com。这一来,该邮件服务器支持了两类邮件名,比如 test@example.comtest@example.net

添加 A 记录

  • 记录类型:A
  • 主机名:mail
  • 值:服务器所在 IP

添加 PTR 记录

PTR 记录用于将 IP 地址反向解析到域名。

这一项需要根据服务器提供商进行设置,如果不设置,一些邮箱的反垃圾策略可能会拒收该邮件,影响发邮件但不影响接收邮件。

阿里云服务器这部分功能的开通可能需要收费:阿里云帮助文档 - PTR 记录

检查 DNS 解析

使用 dig 命令检查 DNS 设置是否正确:

1
2
3
4
5
❯ dig @1.1.1.1 +short MX example.com
10 mail.example.com
❯ dig @1.1.1.1 +short A mail.example.com
192.0.2.123
❯ dig @1.1.1.1 +short -x <IP>

3. 邮件安全配置

Ref:DMARC, DKIM, and SPF Security Measures

确保邮件系统的安全性非常重要,以下是设置 DMARC、DKIM 和 SPF 的基本步骤:

配置 SPF 记录

  • 记录类型:TXT
  • 主机名:@
  • 值:v=spf1 mx -all

配置 DMARC 和 DKIM

这些配置有助于增强发出邮件的认证,减少被标记为垃圾邮件的风险:

  • DMARC 记录类型:TXT
  • 主机名:_dmarc
  • 值:适当的 DMARC 策略

例如:

1
v=DMARC1; p=none; sp=none; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400;
  • DKIM 记录类型:TXT
  • 主机名:mail._domainkey
  • 值:DNS 记录值可以直接使用以下内容
1
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB

4. 配置 TLS 证书

更多细节可以参考:

修改 mailserver.env 文件,设置 SSL 类型:

1
SSL_TYPE=letsencrypt

将本地的 /etc/letsencrypt 目录挂载到容器中:

1
2
3
mailserver:
volumes:
- /etc/letsencrypt:/etc/letsencrypt

使用 certbotmail.example.com 配置证书:

1
sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d mail.example.com --nginx

也可以手动 DNS 验证:

1
sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d mail.example.com --manual --preferred-challenges=dns

5. 启动邮件服务器

现在,可以使用 docker-compose 启动邮件服务器:

1
docker-compose up -d

此外,邮件安全配置部分的 dkim 还需通过以下命令完成:

1
docker exec -it mailserver setup config dkim

重启容器后生效。

6. 开放端口

在防火墙和服务器安全组中,开发以下端口。这些端口用于发送和接收电子邮件,以下是每个端口的详细说明:

  1. 端口 25(SMTP)

    • 协议:SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)
    • 用途:用于发送电子邮件
    • 特点:这个端口通常用于服务器之间的邮件传输,不推荐用于客户端连接,因为它不支持加密。出于安全考虑,很多现代邮件服务商要求使用更安全的端口(如 465 或 587 )。
  2. 端口 465(ESMTP)

    • 协议:ESMTP(Extended Simple Mail Transfer Protocol,扩展简单邮件传输协议)
    • 用途:用于发送电子邮件
    • 特点:这个端口支持隐式 TLS(即连接始终加密),是一个较为安全的发送邮件选项。
  3. 端口 587(ESMTP)

    • 协议:与端口 465 相同,是 ESMTP。
    • 用途:也是用于发送电子邮件
    • 特点:支持显式 TLS,即连接开始时不加密,通过 STARTTLS 命令升级到 TLS 加密。现在被推荐为客户端发送电子邮件的标准端口。
  4. 端口 143(IMAP4)

    • 协议:IMAP4(Internet Message Access Protocol, Version 4,互联网消息访问协议第四版)
    • 用途:用于访问和管理邮件服务器上的邮件
    • 特点:支持在邮件服务器上直接操作邮件(如读取、删除等),客户端通过 STARTTLS 可以启用 TLS 加密。
  5. 端口 993(IMAP4)

    • 协议:与端口 143 相同,是 IMAP4。
    • 用途:用于安全地访问和管理邮件服务器上的邮件
    • 特点:支持隐式 TLS,即连接始终加密,提供了比端口143更高的安全性。

7. 管理用户

1
2
3
4
5
6
# 查看帮助
docker exec -ti mailserver setup help
# 添加用户
docker exec -ti mailserver setup email add user@example.com
# 更改密码
docker exec -ti mailserver setup email update user@example.com

8. 测试工具

推荐工具:https://www.emclient.com/

此外,也可以绑定到其他邮箱服务器。

前端 Web 邮箱

TODO:

轻量级 Web 页面

项目:https://github.com/afterlogic/webmail-lite-8
项目容器:
文档:https://afterlogic.com/docs/webmail-lite/configuring-webmail

https://blog.csdn.net/Coin_Collecter/article/details/129590620

先起容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: "3.3"

services:
web:
container_name: webmail-web
image: afterlogic/docker-webmail-lite
depends_on:
- db
ports:
- "1680:80"
# volumes:
# - ./data/:/var/www/html/data/

db:
container_name: webmail-db
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ohAxLo99xa
MYSQL_DATABASE: afterlogic
MYSQL_USER: afterlogic
MYSQL_PASSWORD: docker_Bundle
cap_add:
- SYS_NICE # CAP_SYS_NICE

拷贝文件:

1
2
docker cp webmail-web:/var/www/html/data ./
sudo chmod 777 data -R

再挂载目录。