简介:开源邮件服务器解决方案Mailcow的完整源码包,基于Docker容器化技术构建,面向需要自建邮件系统的运维工程师、中小企业IT管理员及邮件安全研究者。包体共2000个文件,涵盖1515个PHP业务脚本、78个Markdown文档、61个JSON配置、54个Shell部署脚本以及Dockerfile、YAML编排文件等,完整呈现Mailcow的代码结构、容器编排逻辑与二次开发接口,压缩包约10.98MB,便于快速下载与离线分析。已有197人学习下载。通过解压研读,读者可掌握Mailcow集成SMTP/IMAP/POP3/Webmail及反垃圾、反病毒、DKIM、DMARC、SPF等安全机制的实现方式,理解Docker Compose多容器协作的部署思路,并能基于源码进行功能定制与排错。资源中php文件对应各功能模块,yml与dockerfile描述容器编排,md文档提供安装运维说明,适合以此为基础搭建测试环境或深入源码学习,是研究现代开源邮件系统架构不可多得的参考资料。
1. 为什么自建邮件服务器,以及Mailcow凭什么能火
自建邮件服务器一直是个又爱又恨的话题。十年前折腾Postfix + Dovecot手动配置的日子,相信不少老运维都记忆犹新:改一个配置文件要重启一套服务,DKIM、SPF、DMARC这几个DNS记录但凡配错一条,发出的邮件就大概率躺在对方的垃圾箱里。后来我陆续接触过iRedMail、Modoboa这些方案,确实省事不少,但总有一些地方不够顺手——要么UI老旧、要么多域名管理麻烦、要么扩展性跟不上。
Mailcow是我用了两年多的解决方案,整体体验相当能打。它是一个基于Docker Compose编排的开源邮件服务器套件,把Postfix、Dovecot、Rspamd、ClamAV、SOGo、MySQL、Redis等组件打包成一个整体,通过一个Web界面统一管理。也就是说,你不需要再逐个安装、配置、调优这些底层软件,只需要一台干净的Linux服务器和一套Docker环境,就可以在半小时内拉起一个生产级邮件系统。
我推荐它的理由很直接:第一,功能覆盖完整,从收发信、Webmail到反垃圾、反病毒、别名、多域名管理、Push通知全都有;第二,升级方便,一条命令就能把整个邮件栈更新到新版本;第三,社区活跃,GitHub上有大量issue和讨论,踩过的坑几乎都能搜到解决方案。这篇文章适合谁看?如果你正在给公司搭建企业邮局,或者想自己掌控邮件数据、不想把隐私交给第三方邮箱服务,又或者只是对自建邮件技术栈感兴趣,那这篇文章可以直接拿来当操作手册用。
2. 部署前的准备:这些坑提前避掉能省两天时间
很多人一上来就急着clone代码、docker compose up,结果装到一半发现域名解析没配、端口被占、服务器内存不足,来回折腾两三天才跑起来。我吃过这些亏,所以先把部署前的准备工作讲透,这是整个部署过程中最不能省的时间。
2.1 服务器选型与系统要求
Mailcow对硬件的要求不算高,但也不能太寒酸。官方建议最低2核2G内存,但我实际用下来,2G内存跑全套组件(包括ClamAV病毒库)会有点紧张,内存吃到90%以上是常态。如果你预算允许,建议直接上4G内存的机器,体验会从“能跑”变成“跑得舒服”。磁盘方面,系统盘建议至少40G,因为邮件数据、日志、病毒库都会慢慢膨胀,别等磁盘满了才想起来清理。
系统上我推荐Debian 12或Ubuntu 22.04/24.04 LTS,这两个发行版对Docker的兼容性最好,内核版本也够新。CentOS虽然有文档支持,但Docker Compose v2的安装和使用在新版本上会有一些细微差异,新手容易卡在奇怪的地方,能不用就不用。这里多说一句,Mailcow目前官方推荐使用Docker Compose v2,传统docker-compose命令虽然也能跑,但遇到版本兼容问题会更难排查。
2.2 域名和DNS规划才是重头戏
邮件服务器的核心其实不在服务器本身,而在DNS。这个观点我说过很多次,但每次都有新人栽在DNS上。
你需要准备一个专门的域名(或者子域)。举个例子,如果你的主域名是example.com,邮箱业务建议使用mail.example.com作为邮件服务器主机名,邮件地址使用user@example.com。这样区分的好处是,服务器主机名和邮件域名解耦,以后换服务器或做高可用扩展时,只需要改DNS就可以了。
部署前你需要规划好在DNS管理后台配置这几条记录:
| 记录类型 | 主机名 | 值 | 作用 |
|---|---|---|---|
| A | 服务器公网IP | 指向Mailcow服务器 | |
| MX | @ | mail.example.com(优先级10) | 指定邮件接收服务器 |
| SPF | @ | v=spf1 mx ~all | 声明哪些服务器允许为你的域名发信 |
| DKIM | 部署后生成 | 部署后在Mailcow界面获取 | 邮件签名验证 |
| DMARC | _dmarc | v=DMARC1; p=quarantine; rua=mailto:admin@example.com | 告诉对方如何处理验证失败的邮件 |
其中SPF、DKIM、DMARC这三条是决定邮件能否进收件箱的关键,少一条都可能被对方邮件服务器判定为可疑邮件。MX和A记录是基础,没有它们邮件根本到不了你服务器。我建议在正式部署前先把A和MX记录配好,并确认能解析成功,再继续后面的步骤。
2.3 Docker环境准备
接下来需要在服务器上安装Docker和Docker Compose v2。各发行版的安装方式略有不同,但核心思路一致:配置软件源、安装docker-ce和docker-compose-plugin、启动服务并设置为开机自启。
安装完成后,验证Docker是否正常工作:
docker --version docker compose version如果两条命令都能输出版本号,说明环境OK。再确认一下Docker服务状态:
sudo systemctl status docker这里有一个我踩过很多次的坑:端口25的占用问题。很多云服务商的服务器默认会预装Postfix或Sendmail,它们会监听25端口。如果检测到25端口被占用,Mailcow的Postfix容器就起不来。建议提前卸载或停掉系统自带的邮件服务:
sudo systemctl stop postfix sudo systemctl disable postfix如果你用的是轻量应用服务器或云主机,还需要注意安全组/防火墙规则。简单来说,需要放行这些端口:25(SMTP)、465/587(SMTPS/提交)、143(IMAP)、993(IMAPS)、80/443(Web界面),以及可选的110/995(POP3)。其中25端口比较特殊,部分云服务商默认封禁出站25端口,用不了的话联系服务商解封,这一步不通后面邮件根本发不出去。
3. Mailcow部署实操:从零到能发信
准备工作做完,接下来的部署过程其实很机械,照着做就能跑通。我按照自己服务器上的实际操作记录来写,你跟着一步步执行即可。
3.1 下载与初始化配置
先安装Git,然后克隆Mailcow的dockerized版本代码:
sudo apt update sudo apt install -y git git clone https://github.com/mailcow/mailcow-dockerized cd mailcow-dockerized进入目录后运行配置生成脚本:
sudo ./generate_config.sh脚本运行过程中会问你几个问题。比较重要的是MAILCOW_HOSTNAME,也就是邮件服务器的主机名。这里建议填mail.example.com,与你的A记录保持一致。脚本还会自动生成一个随机的API密钥,并且让你选择时区,国内服务器选Asia/Shanghai。整个配置交互只需要几分钟。
生成完成后,目录下会出现一个mailcow.conf文件,这是Mailcow的主配置文件。可以打开看看,不需要改太多东西,但有几个参数值得关注:
MAILCOW_HOSTNAME=mail.example.com HTTP_PORT=8080 HTTPS_PORT=8443 TZ=Asia/Shanghai注意HTTP_PORT和HTTPS_PORT的默认值分别是8080和8443,这意味着Mailcow的Web界面默认跑在8443端口。如果你想直接用443端口访问(比如配了CDN或反向代理),可以在这里改成443,但需要确保端口没被其他服务占用。
Mailcow提供了几个可选的镜像组件,默认配置里Solr和Watchdog处于注释状态。Solr提供全文搜索功能,日志类文件很多时能明显提升搜索速度,但代价是额外吃1G左右内存。我的建议是:如果机器内存低于8G,就别开Solr了,普通搜索用数据库查询完全够用;内存充足的可以打开体验一下。Watchdog则是资源告警组件,可以在容器异常时自动重启服务,实用价值很高,建议开启。
3.2 首次启动与登录
配置完,直接启动整个栈:
sudo docker compose pull sudo docker compose up -d第一次启动需要拉取Postfix、Dovecot、Rspamd等十来个镜像,镜像总量大约在3-4G,取决于网络速度可能要花10-30分钟。拉取完成后,等待容器全部进入正常状态,可以这样检查:
sudo docker compose ps如果所有服务状态都是Up或Running,说明启动成功。第一次启动时MySQL和Redis等依赖服务需要初始化数据,可能要等一两分钟。浏览器访问https://mail.example.com:8443,如果DNS和防火墙都配置正确,你就能看到登录页面。默认账号是admin,默认密码是moohoo。
登录后第一件事就是修改管理员密码,这个没什么好说的,默认密码就跟“123456”一样危险。修改入口在左侧菜单的系统->用户管理里,找到admin用户编辑即可。另外建议顺手把默认的双因素认证(TOTP)开上,邮件系统里管理员账号一旦被攻破,整个邮件数据都会泄漏。
3.3 创建域与邮箱用户
登录管理面板后,在左侧菜单找到域,点击添加域。输入你的域名(比如example.com),返回路径填一个接收退信和投诉的邮箱地址,这样邮件发送失败时系统会生成退信通知。其他设置保持默认即可,保存后域名就创建成功了。
接下来创建邮箱用户。在邮箱菜单中选择添加邮箱,输入用户名(比如user)和密码,选择所属域,一个完整的邮件地址user@example.com就创建好了。同时需要设置邮箱容量限制,默认给10G。这里有个细节,你可以选择给用户启用或禁用IMAP/POP3/SMTP权限,如果只是给轻度办公用户使用,关闭POP3只保留IMAP会更安全,因为IMAP支持双向同步,删除操作会在服务器端生效,而POP3拉取后本地管理比较混乱。
创建完邮箱后,直接可以通过浏览器访问https://mail.example.com:8443点击右上角的SOGo Webmail登录,输入刚才创建的邮箱账号和密码,就能正常收发邮件了。
3.4 DNS记录配置:SPF、DKIM、DMARC
这是邮件服务器能否“正常送达收件箱”的临门一脚,很多人忽略这一步,结果邮件发出去就进垃圾箱甚至被拒收。我强烈建议按以下顺序把DNS记录配齐。
SPF记录:在DNS管理后台,给域名添加一条TXT记录,主机名留空或填@,值为:
v=spf1 mx ~all意思是“本域名只允许MX记录指向的服务器发送邮件”。注意这里用了~all,表示软拒绝,如果你后面加了第三方发信服务(比如邮件营销系统),可以在这个SPF记录里追加对应的IP地址。如果用-all硬拒绝,第三方发信服务可能直接被拒收,要谨慎。
DKIM记录:登录Mailcow管理面板,进入配置->ARC/DKIM密钥,找到你的域名,点击显示DKIM公钥。你会看到一条形如v=DKIM1;k=rsa;p=MIGfMA0GCS...的TXT记录值。在DNS后台添加一条TXT记录,主机名填dkim._domainkey(也可能显示成default._domainkey,以Mailcow界面显示为准),值填那串完整的DKIM公钥。保存并等待DNS生效。
DMARC记录:再添加一条TXT记录,主机名填_dmarc,值填:
v=DMARC1; p=quarantine; rua=mailto:admin@example.comp=quarantine表示SPF或DKIM验证失败的邮件进入垃圾箱而不是直接拒绝。rua后面填一个用于接收DMARC报告的邮箱。如果一开始不太确定配置是否正确,可以把p改成none,先观察报告再收紧策略。
配置完DNS后,可以用一些在线工具(我这里就不点名了)检测三个记录是否生效、格式是否正确。没问题的话,你从自己搭建的邮箱发一封测试邮件到任意大厂邮箱,应该都能顺利进入收件箱。
4. 核心功能拆解:为什么说它“功能丰富”
部署跑通只是开始,Mailcow真正的价值在于日常使用的功能完整度和管理便利性。这个章节我挑几个实用的功能展开讲讲,顺便分享一些我的使用习惯。
4.1 多域名管理与别名
Mailcow完全支持多域名,也就是说你有多个业务域名时,不需要再部署多套邮件系统,一个Mailcow实例就能管理所有域的邮箱账号。每个域都可以独立设置配额、用户数量限制和各项策略。对于做外包项目或管理多家公司邮箱的技术人,这个特性非常实用。
邮件的别名(alias)用的是收件人映射机制,你可以把sales@example.com映射到admin@example.com和partner@example.com两个真实邮箱,或者把整个域的邮件转发到另一个域。我实际项目里经常配置“所有用户都能收到某个部门公共邮箱的邮件”这种场景,Mailcow的别名功能一个页面就能搞定。支持加前缀匹配,比如给一个别名加+后缀就能自动分拣到不同文件夹,这个功能在Webmail的“自动筛选器”里配合规则使用相当灵活。
4.2 反垃圾/反病毒体系
反垃圾邮件是Mailcow最让我省心的地方之一。Rspamd内置了Bayes学习、Surbl黑名单、RBL查询等机制,默认策略就能拦截大多数垃圾邮件。管理面板里可以实时看到垃圾邮件评分,还能针对某个域名、某个用户单独调整评分阈值。
ClamAV负责病毒扫描,所有收发邮件都会经过病毒检查。值得提醒的是ClamAV病毒库会定时更新,大概每小时一次,需要服务器能正常访问更新源。如果你在的网络环境比较特殊,更新失败的概率会比较高,这属于实际运维中的常见问题。病毒库占用磁盘空间约200-300M,会随着定义数量变化,建议预留空间。
我在使用中还发现,Rspamd的评分日志是排查邮件问题的利器。如果一封正常邮件被误判为垃圾邮件,打开配置->Rspamd设置里的日志,能看到具体是因为命中哪个规则导致评分过高。常见的误判源是SPF失败、DKIM签名过期或发件人域名被RBL列黑。针对误判,可以在Rspamd的“设置”里为该发件人域名添加白名单规则。
4.3 SOGo Webmail:能当主力客户端用的网页邮箱
Mailcow内置了SOGo Webmail,支持ActiveSync,也就是说iOS和Android的邮件App可以直接通过Exchange协议同步行事历、联系人、邮件,而不只是收发邮件。这个功能在这类开源邮件方案里算比较稀有的。
SOGo的界面风格偏传统,但功能和稳定性都不错:日历、待办事项、联系人管理、邮件筛选、自动回复、提醒等功能都有。日常出差时直接用浏览器访问Webmail就能处理事务,不用依赖本地邮件客户端。如果公司有iPad端的使用需求,SOGo的ActiveSync体验和商业邮件系统没有明显差距。
4.4 备份与恢复
邮件数据是企业最重要的资产之一,不能等丢了才后悔。Mailcow的备份恢复机制依赖MySQL数据库和/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1这个数据卷。vmail文件夹里存放的是所有用户的邮件原始文件(Maildir格式),MySQL里存的是用户、域名、别名等对象关系数据。
我个人的备份方案是:每天凌晨用cron任务对vmail目录做增量同步(用rsync),每周做一次全量快照,数据库则用mysqldump备份。恢复时,只需要整目录还原加上数据库导入即可。这里提个醒:Mailcow官方不推荐直接从数据卷层面手动恢复,但如果你用了快照备份,且数据卷是完整拷贝的,实测大部分情况下是可以恢复的。正规做法还是建议在操作前查看一下官方“Backup and restore”文档,按Guide的流程来,这样能最大程度避免数据不一致。
5. 常见问题与实战排查
自建邮件服务器的过程中,肯定会遇到各种奇怪问题。这一节我分享几个高频问题的排查思路,都是我从实际使用中沉淀下来的。
5.1 邮件发不出去
这是新手最常见的问题。邮件提交到队列后发不出去,先看日志:
sudo docker compose logs --tail=100 postfix常见的几类情况:
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
connect to ... No route to host | 出站25端口被网络服务商封禁 | 联系服务商解封 |
hostname does not resolve | DNS解析问题 | 检查服务器自身DNS,确认A和MX记录 |
relay access denied | 客户端认证失败 | 检查SMTP客户端是否开启了SSL/TLS并配置了正确的用户名密码 |
TLS connection failed | 对方服务器TLS策略问题 | 查看Postfix日志,确认是对端要求高强度TLS而本地证书不匹配 |
还有一类情况是邮件从Mailcow服务器发出去了,但对方一直收不到。这种问题往往不是Mailcow的问题,而是你的IP信誉度不够好。自建邮件服务器很容易遇到这种情况:新IP发信量大、无历史信誉,对方大厂的防垃圾系统直接拒收。解决办法没有捷径:慢慢积累,发信前确保SPF/DKIM/DMARC配置正确,减少无关的营销邮件,使用一段时间后IP信誉会逐渐建立起来。
5.2 收信延迟大或直接收不到
收信延迟,先从DNS排查。打开日志:
sudo docker compose logs --tail=100 postfix | grep "No MX"如果对方域名没有MX记录,或者你的DNS解析不到对方的MX,邮件就会一直滞留队列。过段时间重新尝试投递,直到超出retry时间后返回退信。这个问题的根源通常是DNS配置抽风或者对方网络问题。
如果是自己服务器收不到外部邮件,优先检查三件事:第一,A记录指向的IP是否真的是Mailcow服务器所在IP;第二,服务器防火墙25端口是否开放;第三,安全组规则是否允许外部访问25端口。我曾经遇到过一台服务器安全组策略放行了HTTP/HTTPS但漏了25端口,结果Web界面能打开却收发不了邮件,排查半天才找到原因。
5.3 骚扰排查:容器频繁重启
如果你开了Watchdog,可能会看到某个容器处于“restarting”状态。通常原因是资源不足,尤其是内存耗尽。Docker Compose的OOM Killer会杀掉进程,Watchdog检测到服务不健康后自动重启,于是陷入“启动-被杀-再启动”的死循环。
排查方法:
sudo dmesg | grep -i "oom\|killed process"看是否有OOM(Out Of Memory)记录。如果频繁出现,最直接的办法是增加服务器内存,或者减小ClamAV的线程数、取消Solr组件以降低内存占用。有段时间我在2G内存的服务器上跑Mailcow,高峰时段ClamAV更新病毒库时偶尔会触发OOM,后来把ClamAV的线程数从4降到2、关闭Solr后才稳定下来。
5.4 邮件被误判为垃圾邮件的自救技巧
就算SPF/DKIM/DMARC全部配置正确,邮件偶尔还是会进垃圾箱。这种时候可以从几个方向优化:第一,控制发信频率,集中大批量发信很容易触发对方风控;第二,确保退信地址真实有效,对方服务器会检查这个地址是否可用;第三,观察DMARC报告,看看是否有未经授权的发信行为;第四,在Rspamd的Bayes训练里把正常邮件标记为“非垃圾邮件”,让系统逐步学习你的邮件特征。
Mailcow会为每个域名提供垃圾邮件报告,管理员可以在面板里定期查看被Rspamd拦截的邮件,手动标记误判。这样不仅能逐步降低误判率,还能让你对系统判定逻辑更有掌控感。
6. 最后的经验总结和一点扩展建议
两年多使用下来,我整体的评价是:Mailcow是目前开源邮件服务器方案里综合体验最好的一个,尤其是在“部署难度”和“功能完整性”之间取得了很好的平衡。它可能不像大型企业用Exchange那样什么都有,但对于中小型团队、创业公司或者个人自建邮局来说,已经绰绰有余。
最后分享一个我最近在做的扩展项目:使用Mailcow的API把整个用户管理流程接入了公司内部的人员系统,新员工入职时自动创建邮箱,离职时自动禁用账号,省去了手动操作的麻烦。Mailcow暴露了标准的RESTful API,支持基于API密钥的认证,你完全可以在自己写的代码里调用它来管理域名、用户和别名。如果你准备长期使用Mailcow,建议花点时间看看它的API文档,自动化运维能力会是一个不小的加分项。
本文还有配套的精品资源,点击获取