1. 项目概述一个开箱即用的邮件服务器解决方案如果你曾经尝试过自己搭建一个邮件服务器无论是为了个人学习、小型团队协作还是为某个应用提供邮件发送服务你大概率会立刻被劝退。这绝不是危言耸听。邮件服务涉及到的协议之复杂SMTP、IMAP、POP3、配置之繁琐SPF、DKIM、DMARC、以及维护之困难反垃圾、安全性足以让绝大多数开发者望而却步。传统的 Postfix Dovecot 组合虽然强大但其配置文件的复杂程度堪称“天书”一个标点符号的错误就可能导致服务无法启动更别提后续的运维了。正是在这种背景下docker-mailserver/docker-mailserver项目横空出世成为了无数开发者和运维人员的“救星”。这个项目本质上是一个预配置好的 Docker 镜像它将一个功能完整、安全可靠的邮件服务器所需的所有组件Postfix、Dovecot、SpamAssassin、ClamAV、OpenDKIM 等打包在一起并通过精心设计的配置和环境变量将复杂的配置过程简化到了极致。你不再需要手动编辑几十个配置文件不再需要为 SSL 证书的部署和续期而头疼也不再需要为如何配置反垃圾邮件规则而绞尽脑汁。通过这个项目你可以在几分钟内用几条 Docker 命令就获得一个可以投入生产环境使用的邮件服务器。它非常适合以下几类人群个人开发者希望拥有一个属于自己的、稳定的邮件服务用于项目通知或个人邮箱初创公司或小型团队需要一个内部协作邮箱但又不想依赖第三方付费服务或承担自建的高昂维护成本应用开发者需要为你的 SaaS 应用提供一个可靠的后端邮件发送服务Transactional Email。当然它也适合任何对邮件服务器技术感兴趣想通过一个“成品”来学习和理解其内部工作原理的技术爱好者。2. 核心架构与组件深度解析2.1 容器化设计哲学为什么是 Dockerdocker-mailserver选择 Docker 作为载体绝非偶然而是深刻契合了邮件服务器部署与运维的核心痛点。邮件服务是一个典型的“状态服务”混合体。它既有需要持久化存储的数据用户邮件、配置、密钥又由多个相互依赖的守护进程组成。传统部署方式下这些进程的安装、配置、升级和故障排查是耦合在一起的牵一发而动全身。Docker 的容器化理念完美地解决了这个问题。项目将整个邮件服务器栈封装在一个镜像中但通过 Volume数据卷将“状态”与“服务”分离。具体来说所有可变的数据如邮件数据/var/mail、用户数据库/tmp/docker-mailserver下的配置文件、SSL 证书、DKIM 密钥等都通过 Docker Volume 挂载到宿主机。而容器本身只包含纯净的、可复现的软件和基础配置。这样做带来了几个革命性的优势一键部署与复制你可以在任何安装了 Docker 的机器上通过拉取同一个镜像快速复制出一个完全相同的邮件服务器环境。这对于搭建测试环境、进行灾难恢复或横向扩展至关重要。隔离与安全所有邮件服务进程运行在一个独立的容器网络和命名空间中与宿主机和其他服务隔离。即使邮件服务出现安全漏洞其影响范围也被限制在容器内极大地提升了宿主机的安全性。版本管理与回滚每个 Docker 镜像标签对应一个确定的软件版本。如果你升级后发现问题可以瞬间回滚到之前的镜像版本而不会对邮件数据造成任何影响。这是传统方式难以实现的。声明式配置项目的核心配置不再是通过直接修改容器内的文件而是通过环境变量和外部挂载的配置文件来驱动。这使得配置可以被版本控制系统如 Git管理实现了基础设施即代码IaC。2.2 核心组件协同工作流这个镜像不是一个简单的软件堆砌而是一个精心编排的生态系统。让我们拆解一下当你发送和接收一封邮件时内部组件是如何协同工作的接收邮件入站流程外部邮件服务器通过 SMTP 协议端口 25连接到你的服务器。Postfix作为 MTA邮件传输代理首先接手。它会进行基础的发件人策略检查。邮件被传递给Amavis内容过滤器。Amavis 作为一个调度中心将邮件依次传递给ClamAV进行病毒扫描检测邮件附件中的恶意软件。SpamAssassin进行垃圾邮件评分。它会基于规则库、RBL实时黑洞列表检查、内容分析等多种手段给邮件打分。Amavis 根据扫描结果决定邮件的命运放行、标记为垃圾邮件修改邮件头或直接拒绝。处理后的邮件返回给 Postfix。Postfix 将邮件投递到本地邮箱通过 Dovecot 的 LDA或者如果收件人是别名则进行转发。Dovecot作为 LDA本地投递代理将邮件存入对应的用户邮箱目录/var/mail/domain.com/user。用户通过IMAP端口 143/993或POP3端口 110/995协议使用邮件客户端如 Outlook, Thunderbird或 Webmail如 Roundcube连接到 Dovecot读取这封邮件。发送邮件出站流程用户通过邮件客户端使用 SMTP 提交Submission端口 587认证发送邮件。Postfix 接收到邮件后会通过OpenDKIM对邮件进行签名。DKIM 签名相当于一个“邮戳”向接收方证明这封邮件确实来自你的域名且未被篡改。同时Postfix 会查询配置好的SPF记录这是一个 DNS 记录但这主要是在接收方检查我们时使用。对于外发SPF 策略由接收方实施。签名的邮件被放入队列Postfix 根据 MX 记录查找目标邮件服务器并通过 SMTP端口 25将邮件发送出去。整个流程中Fail2ban作为一个安全组件在后台默默工作。它监控 Postfix 和 Dovecot 的日志如果发现某个 IP 在短时间内多次认证失败或尝试发送垃圾邮件会自动将其 IP 地址加入防火墙iptables的黑名单一段时间从而抵御暴力破解和垃圾邮件攻击。注意很多人会混淆端口 25 和 587。简单来说25 端口是 MTA 对 MTA 的通信端口用于服务器之间转发邮件通常需要开放但可能被云服务商限制。587 端口是 MSA邮件提交代理端口专门用于经过认证的邮件客户端提交邮件到服务器是出站邮件的主要端口必须配合 TLS 加密使用。2.3 安全性设计不只是“能用”更要“安全地用”邮件服务器是网络攻击的重灾区docker-mailserver在安全方面做了大量默认优化强制 TLS 加密对于 SMTP 提交587、IMAP993、POP3995端口默认强制使用 STARTTLS 或 SSL/TLS 加密防止通信被窃听。它甚至提供了自动从 Let‘s Encrypt 获取和续期 SSL 证书的脚本与 Certbot 无缝集成。默认关闭不安全的认证方式像 PLAIN 认证在不加密的连接上是默认关闭的防止密码明文传输。完善的垃圾邮件和病毒防护SpamAssassin 和 ClamAV 不是摆设它们有自动更新的规则库。项目还预配置了合理的默认评分阈值并允许你通过自定义规则进行微调。Fail2ban 主动防御如前所述这是抵御自动化攻击的利器。用户密码安全存储用户密码不是明文存储而是使用 Dovecot 支持的多种加密散列格式如 SHA512-CRYPT存储安全性远高于明文或 MD5。网络隔离鼓励用户将邮件服务器容器部署在独立的 Docker 网络中仅将必要的端口25 587 993 995等映射到宿主机或反向代理最小化攻击面。3. 从零开始部署与配置实战3.1 前期准备与域名配置在运行任何 Docker 命令之前最关键的准备工作在域名 DNS 层面。这直接决定了你的邮件能否被外部服务器正常收发。1. 域名与解析记录假设你的域名是example.com你希望邮件地址是userexample.com。A/AAAA 记录确保mail.example.com或你用来访问 Webmail 或作为服务器标识的主机名指向你的服务器公网 IP 地址。MX 记录这是邮件交换记录告诉全世界“发送给example.com的邮件应该送到哪台服务器”。通常设置为example.com. IN MX 10 mail.example.com.。优先级10可以调整数值越小优先级越高。2. 关键的反垃圾邮件与认证记录必须设置SPF 记录声明允许哪些服务器代表你的域名发送邮件。这是一个 TXT 记录。对于docker-mailserver如果你的服务器 IP 是203.0.113.1基础记录可以是example.com. IN TXT vspf1 ip4:203.0.113.1 -allvspf1是版本标识ip4:203.0.113.1声明允许该 IP-all表示严格策略其他所有来源都拒绝。如果你还使用第三方邮件服务如 SendGrid需要将其包含进来例如include:sendgrid.net。DKIM 记录这是出站邮件签名的公钥记录。密钥对会在容器首次运行时生成或由你提供。你需要从生成的public key中提取内容创建一条选择器默认为mail的子域名 TXT 记录。记录名类似mail._domainkey.example.com.值是包含p公钥的一长串字符串。项目提供的setup.sh脚本可以方便地生成需要添加到 DNS 的记录。DMARC 记录这是一个策略记录告诉接收方当 SPF 或 DKIM 检查失败时该如何处理。它也是一个 TXT 记录名称为_dmarc.example.com.。一个基础的监控策略可以是_dmarc.example.com. IN TXT vDMARC1; pnone; ruamailto:adminexample.compnone表示只监控不采取行动rua指定聚合报告发送的邮箱。在生产环境可以逐步调整为pquarantine隔离或preject拒绝。实操心得DNS 记录的生效需要时间TTL通常几分钟到几小时不等。在部署前后务必使用dig或nslookup命令反复检查这些记录是否已正确生效。很多“发不出信”或“收不到信”的问题根源都在 DNS。3. 服务器环境准备一台拥有公网 IP 的 VPS 或云服务器如 AWS EC2, DigitalOcean Droplet, Linode 等。家庭宽带通常没有固定公网 IP 且运营商封锁了 25 端口绝对不适合搭建邮件服务器。安装最新版的 Docker 和 Docker Compose。这是项目运行的基础。确保服务器防火墙如ufw或云服务商安全组开放了以下端口25 (SMTP),587 (SMTP Submission),465 (SMTPS 可选),143 (IMAP),993 (IMAPS),110 (POP3),995 (POP3S)。端口 25 在某些云平台可能需要申请解封。3.2 使用 Docker Compose 一键部署这是最推荐的方式通过一个docker-compose.yml文件定义所有服务、配置和依赖。步骤 1创建项目目录并编写 Compose 文件mkdir mailserver cd mailserver创建docker-compose.ymlversion: 3.8 services: mailserver: image: docker.io/mailserver/docker-mailserver:latest container_name: mailserver # 设置主机名非常重要需与你的域名配置一致 hostname: mail domainname: example.com # 端口映射宿主机端口:容器端口 ports: - 25:25 # SMTP - 587:587 # SMTP Submission (Auth) - 465:465 # SMTPS (Legacy, 可选) - 993:993 # IMAPS - 995:995 # POP3S - 143:143 # IMAP (可选建议仅限本地网络) # 环境变量是配置的核心 environment: - ENABLE_SPAMASSASSIN1 - ENABLE_CLAMAV1 - ENABLE_FAIL2BAN1 - ENABLE_POSTGREY1 # 灰名单防垃圾邮件 - ONE_DIR1 # 将所有数据合并到一个目录下便于管理 - SSL_TYPEletsencrypt # 使用 Let‘s Encrypt 证书 - PERMIT_DOCKERhost # 如果容器能访问宿主网络可设为host。更安全的是设置特定网络。 - DMS_DEBUG0 # 生产环境设为0调试时可设为1 # 数据卷映射实现数据持久化 volumes: - ./mail-data:/var/mail # 邮件存储 - ./mail-state:/var/mail-state # 服务状态如ClamAV病毒库 - ./mail-logs:/var/log/mail # 日志 - ./config/:/tmp/docker-mailserver/ # 关键用户、别名等配置目录 - /etc/letsencrypt:/etc/letsencrypt:ro # 只读挂载宿主机Let‘s Encrypt证书 # 挂载SSL证书和DKIM密钥的特定路径 - ./config/ssl:/etc/ssl:ro - ./config/dkim:/etc/opendkim/keys:ro cap_add: - NET_ADMIN # Fail2ban需要 - SYS_PTRACE restart: always # 可选添加一个Webmail服务如Roundcube webmail: image: roundcube/roundcubemail:latest container_name: webmail links: - mailserver environment: - ROUNDCUBEMAIL_DEFAULT_HOSTmailserver - ROUNDCUBEMAIL_SMTP_SERVERmailserver - ROUNDCUBEMAIL_DB_TYPEsqlite volumes: - ./webmail-data:/var/roundcube/data ports: - 8080:80 restart: always步骤 2创建配置目录并初始化mkdir -p ./config ./mail-data ./mail-state ./mail-logs ./config/ssl ./config/dkim步骤 3启动容器docker-compose up -d mailserver首次启动会下载镜像并运行。使用docker-compose logs -f mailserver查看日志确保没有报错。3.3 核心配置详解用户、别名与SSL证书容器运行起来了但还没有用户。项目通过外部挂载的./config/目录下的文件来管理配置。1. 添加邮件用户用户信息存储在./config/postfix-accounts.cf文件中。格式是userdomain.com|加密后的密码。我们使用项目提供的工具来安全地添加用户。# 进入项目目录 cd mailserver # 使用辅助脚本添加用户它会自动为你加密密码 docker run --rm -it \ -v $(pwd)/config:/tmp/docker-mailserver \ -v $(pwd)/mail-data:/var/mail \ mailserver/docker-mailserver:latest \ setup email add userexample.com执行命令后会提示你输入密码。脚本会自动更新postfix-accounts.cf文件。你也可以手动编辑该文件但密码必须使用 Dovecot 支持的加密格式可以使用doveadm pw -s SHA512-CRYPT命令生成。2. 设置邮件别名别名允许将一个地址的邮件转发到另一个或多个地址。编辑./config/postfix-virtual.cf文件。# 格式原始地址 目标地址1, 目标地址2, ... adminexample.com user1example.com supportexample.com user1example.com, user2example.com # 捕获域下所有未定义用户的邮件 example.com catchallotherdomain.com3. 配置 SSL/TLS 证书安全性至关重要。推荐使用 Let‘s Encrypt 免费证书。方法A推荐使用宿主机已有的 Certbot 证书。如 Compose 文件所示将/etc/letsencrypt只读挂载到容器。你需要确保证书包含你的邮件域名如mail.example.com。然后在环境变量中设置SSL_TYPEletsencrypt容器会自动在挂载的路径下寻找证书。方法B使用自签名证书。设置SSL_TYPEself-signed容器启动时会自动生成。但自签名证书会被邮件客户端警告不适合生产环境。方法C使用已有证书文件。将你的fullchain.pem证书链和privkey.pem私钥文件放入./config/ssl/目录并设置SSL_TYPEmanual。4. 生成 DKIM 密钥DKIM 签名是邮件可信度的关键。使用项目脚本生成密钥docker run --rm -it \ -v $(pwd)/config:/tmp/docker-mailserver \ mailserver/docker-mailserver:latest \ setup config dkim这会在./config/opendkim/keys/example.com/目录下生成密钥对mail.private和mail.txt。mail.txt文件的内容就是你需要添加到 DNS 的 DKIM 记录。务必在启动服务前配置好 DNS DKIM 记录否则外发邮件可能被标记为垃圾邮件。完成以上配置后重启容器使配置生效docker-compose restart mailserver4. 日常运维、监控与故障排查4.1 常用管理操作与脚本项目提供了极其强大的setup.sh脚本封装在镜像内几乎可以完成所有管理任务。我们通常通过docker exec或运行一个临时容器来调用它。查看所有可用命令docker run --rm -it mailserver/docker-mailserver:latest setup help添加/删除/列出用户# 添加用户 (交互式设置密码) docker run --rm -it -v $(pwd)/config:/tmp/docker-mailserver mailserver/docker-mailserver:latest setup email add userexample.com # 删除用户 docker run --rm -it -v $(pwd)/config:/tmp/docker-mailserver mailserver/docker-mailserver:latest setup email del userexample.com # 列出所有用户 docker run --rm -it -v $(pwd)/config:/tmp/docker-mailserver mailserver/docker-mailserver:latest setup email list更新密码docker run --rm -it -v $(pwd)/config:/tmp/docker-mailserver mailserver/docker-mailserver:latest setup email update userexample.com查看服务器配置摘要docker exec mailserver setup config手动触发垃圾邮件学习Sa-learn# 将收件箱邮件标记为正常邮件Ham docker exec mailserver sa-learn --ham /var/mail/example.com/user/cur/* # 将垃圾邮件文件夹邮件标记为垃圾邮件Spam docker exec mailserver sa-learn --spam /var/mail/example.com/user/.Spam/cur/*4.2 日志分析与监控日志是排查问题的生命线。所有日志都挂载在./mail-logs/目录下你也可以通过docker-compose logs查看。关键日志文件/var/log/mail/mail.logPostfix 和 Dovecot 的主日志查看邮件收发、认证、投递状态。/var/log/mail/fail2ban.logFail2ban 的封禁记录。/var/log/mail/clamav.logClamAV 病毒扫描日志。/var/log/mail/spamassassin.logSpamAssassin 处理日志。常用日志分析命令# 实时跟踪邮件日志 docker-compose logs -f mailserver | grep postfix # 查看最近失败的SMTP连接 docker exec mailserver grep \authentication failed\ /var/log/mail/mail.log # 查看被Fail2ban封禁的IP docker exec mailserver fail2ban-client status postfix监控建议可以将关键日志文件通过tail和grep接入到你的集中式日志系统如 ELK Stack, Grafana Loki。监控指标可以包括每分钟邮件收发量、认证失败次数、垃圾邮件命中率、病毒检出数、Fail2ban 封禁数等。4.3 常见问题与排查技巧实录即使配置得当运行中也可能遇到问题。以下是我在实践中总结的常见问题及排查思路。问题 1邮件能发不能收或者能收不能发。这是最常见的问题99% 的原因在于网络或 DNS。排查思路检查端口使用telnet your-server-ip 25或nc -zv your-server-ip 25从外部网络测试端口是否真正开放。云服务商的安全组和宿主机的防火墙ufw status都要检查。检查 DNS 记录使用dig mx example.com和dig txt example.com从公共 DNS如8.8.8.8查询你的 MX 和 SPF 记录是否生效且正确。查看邮件日志在mail.log中搜索邮件 ID通常形如ABCDEF12345。对于发送失败看 Postfix 的statusdeferred或statusbounced后面的错误信息。对于接收失败看对方服务器的连接和响应。常见错误Connection timed out端口未开放或网络不通。Host or domain name not found对方服务器域名解析失败。550 5.7.1 Relaying denied你的服务器被对方认为是开放转发Open Relay检查你的发信认证和网络设置。550 5.7.1 Message rejected due to SPF failure你的 SPF 记录未配置或配置错误对方服务器根据 SPF 策略拒绝了你的邮件。问题 2发出的邮件被收件方标记为垃圾邮件。这通常与发件人信誉和认证配置有关。排查思路检查 DKIM 签名用 Gmail 等客户端接收一封你发出的邮件查看邮件原始信息检查DKIM-Signature头是否存在且有效。可以使用在线 DKIM 验证工具。检查 SPF 记录确保 SPF 记录包含你服务器的出站 IP 地址。检查反向 DNSrDNS/PTR很多大型邮件服务商如 Gmail, Outlook会检查你的服务器 IP 的反向 DNS 记录是否指向你的邮件域名。联系你的 VPS 提供商设置 rDNS将你的 IP 反向解析到mail.example.com。检查 IP 信誉你的服务器 IP 是否曾被用于发送垃圾邮件可以使用如SenderScore等工具查询。新 IP 需要一段时间建立信誉初期少量发送。邮件内容避免使用过于营销化的标题和正文避免过多的链接和图片保持内容简洁。问题 3用户无法通过客户端如 Outlook登录。排查思路确认协议和端口确保客户端设置正确。IMAP 服务器mail.example.com端口 993SSL/TLS。SMTP 服务器mail.example.com端口 587STARTTLS。不要使用端口 25 进行客户端发信。检查认证日志在mail.log中搜索authentication failed和用户的 IP查看具体错误。可能是密码错误或者 Dovecot 的认证配置有问题。检查密码加密格式如果你手动编辑了postfix-accounts.cf确保密码是使用doveadm pw生成的正确加密格式。检查防火墙确保客户端 IP 没有被 Fail2ban 误封。可以用docker exec mailserver fail2ban-client status查看。问题 4容器启动失败或不断重启。排查思路查看启动日志docker-compose logs --tail50 mailserver。检查 Volume 权限确保宿主机上挂载的目录如./mail-data,./config对容器内的用户通常是1000:1000或5000:5000有读写权限。这是最常见的启动失败原因。可以尝试sudo chown -R 1000:1000 ./mail-data ./config。检查端口冲突宿主机上是否已经有其他程序占用了 25、587、993 等端口使用sudo netstat -tulpn | grep :25检查。检查环境变量确保docker-compose.yml中的环境变量书写正确没有拼写错误。独家避坑技巧在正式投入使用前务必使用像mail-tester.com这样的在线服务。从你的服务器发送一封测试邮件到它提供的地址它会给你一份详细的评分报告涵盖 SPF、DKIM、DMARC、反向 DNS、邮件内容、黑名单等几乎所有方面能帮你快速定位配置短板。这是新邮件服务器上线前最有效的“体检”工具。5. 性能调优、备份与高可用考量5.1 性能优化建议对于有一定负载的邮件服务器适当的调优可以提升响应速度和稳定性。资源限制在docker-compose.yml中为mailserver服务添加资源限制防止其占用过多宿主资源影响其他服务。deploy: resources: limits: memory: 2G cpus: 1.0 reservations: memory: 512M cpus: 0.5调整 Postfix 进程数根据服务器 CPU 核心数和内存调整 Postfix 的并发进程数。可以通过环境变量设置environment: - POSTFIX_PROCESS_COUNT5优化 SpamAssassinSpamAssassin 的规则检查是 CPU 密集型操作。可以禁用一些不常用或性能开销大的规则。在./config/spamassassin-rules.cf文件中添加score RULE_NAME 0.0来将特定规则权重设为0。也可以考虑使用 Redis 来缓存 Bayes 学习数据提升学习效率。邮件存储优化Dovecot 默认使用maildir格式。确保挂载的./mail-data目录位于高性能的存储上如 SSD。对于超大邮箱可以考虑启用 Dovecot 的索引优化和压缩功能。5.2 数据备份策略邮件数据无价必须定期备份。备份什么邮件数据./mail-data整个目录。配置数据./config整个目录特别是postfix-accounts.cf,postfix-virtual.cf,dkim keys。SSL 证书如果使用 Let‘s Encrypt备份/etc/letsencrypt或你存储证书的目录。数据库如果你使用了额外的数据库如用于 Roundcube 的 MySQL也需要备份。如何备份简单全量备份使用tar或rsync定期将上述目录打包压缩传输到远程存储或对象存储如 AWS S3, Backblaze B2。# 示例备份脚本 BACKUP_DIR/backup/mailserver-$(date %Y%m%d) mkdir -p $BACKUP_DIR cp -r /path/to/mailserver/config $BACKUP_DIR/ cp -r /path/to/mailserver/mail-data $BACKUP_DIR/ tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR # 然后使用 rclone/scp 等工具上传到云端使用 Docker 卷备份工具如borgbackup或restic它们支持增量备份和去重更节省空间。恢复测试定期在测试环境中演练恢复流程确保备份是有效的。恢复时停止服务用备份文件覆盖对应目录然后启动服务即可。5.3 向高可用架构演进对于关键业务单点故障是不可接受的。虽然docker-mailserver本身是单容器设计但我们可以通过一些架构手段提升可用性。无状态服务高可用Postfix 和 Dovecot 本身可以配置为多实例。一种思路是使用多个docker-mailserver容器前端通过负载均衡器如 HAProxy分发 SMTP/IMAP 连接。挑战在于用户状态如 IMAP 会话和邮件队列需要共享。邮件队列可以通过配置 Postfix 使用外部数据库如 MySQL来解决。用户状态则较难共享通常采用“粘性会话”或将用户固定到某台后端服务器。共享存储所有容器的./mail-data必须指向一个共享存储如 NFS、GlusterFS 或云存储服务AWS EFS, Azure Files。这确保了无论用户连接到哪个容器实例看到的都是同一份邮箱数据。数据库外置将用户认证信息postfix-accounts.cf迁移到外部数据库如 LDAP, MySQL这样所有实例可以读取统一的用户数据。队列外置配置 Postfix 使用proxy:mysql查找表或类似的机制将邮件队列存储在外部数据库中实现队列共享。完整的方案一个典型的高可用架构可能包括负载均衡器 - 多个docker-mailserver容器共享存储和外部数据库 - 外部数据库和存储服务。这种架构的复杂性和维护成本会显著增加需要根据业务重要性进行权衡。对于大多数中小型应用一个配置良好、定期备份的单一docker-mailserver实例配合监控告警已经能提供非常可靠的服务。这个项目最大的价值就在于它把邮件服务器这个“怪兽”关进了一个易于管理和维护的“容器笼子”里让我们能专注于业务本身而不是无穷无尽的配置和排错。从我个人的使用经验来看它极大地降低了邮件服务的门槛和运维负担是自建邮件服务领域当之无愧的“瑞士军刀”。