在早期的文章中xiaoz分享过《使用Docker搭建poste,自建邮件服务器》,poste这个邮局比较轻量,部署相对简单,适合个人轻度使用。但是从客户的使用反馈来看(xiaoz之前有给客户部署过),大量发件的时候poste不太稳定,很容易出问题。且poste将所有相关依赖服务全部放到一个容器中,并没有使用docker-composer编排多个容器,从而导致稳定性大打折扣。
今天再分享另一个开源的自建邮局服务mailcow,mailcow功能上比poste更加丰富,官方提供docker-composer部署方式,下面和xiaoz一起来安装下mailcow邮件服务吧。
注意:此教程需要掌握一定Linux基础和Docker基础的人士阅读
先决条件
- 一台VPS,有独立IP,最低配置1C2G,建议2C4G以上,支持发件服务(未屏蔽邮件端口, 请咨询你的服务商),支持PTR反向解析(咨询你的服务商)
- 操作系统:CentOS、Debian、Ubuntu均可
- 安装了Docker和docker-composer
- 一个域名,注册时间越长越好,建议使用主流后缀,如:
.com/.net/.org
注意:请务必和你的服务商确认是否支持PTR反向解析,如果不支持的话邮件是很容易进垃圾箱的,就目前xiaoz所了解UltraVPS(EU)是支持PTR解析的,并且自己在后台就可以操作。
如果您还没有安装Docker可以参考:Linux安装Docker与Docker常用命令
如果您还没有安装docker-composer,可以使用下面的命令安装:
#下载docker-composer
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#添加执行权限
chmod +x /usr/local/bin/docker-compose
#建立软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
部分CentOS 7系统可能内置了postfix服务,会和mailcow端口冲突,可以先尝试执行下面的命令卸载postfix
#CentOS卸载postfix
yum -y remove postfix
#Debian或者Ubuntu卸载postfix
apt-get remove postfix
设置Linux主机名
假设您的顶级域名为domain.com
,那么您的主机名需要设置为mail.domain.com
或mx.domain.com
,前缀自己取,反正是需要二级域名。
设置主机名的命令为:
hostnamectl set-hostname mail.domain.com
然后修改/etc/hosts
,添加一行hosts解析,就是将mail.domain.com
指向到您当前服务器的公网IP,命令如下:
echo '173.0.xx.xxx mail.domain.com' >> /etc/hosts
部署mailcow
先克隆mailcow代码和脚本:
#CentOS安装Git
yum -y install git
#Debian安装Git
apt-get install git
#克隆mailcow代码
git clone https://github.com/mailcow/mailcow-dockerized
进入代码目录cd mailcow-dockerized
执行初始化脚本:./generate_config.sh
根据提示设置域名和时区等信息。注意:
- 域名要和上面设置的主机名一致,比如
mail.domain.com
- 如果后续需要修改,可以编辑
mailcow.conf
这个配置文件
mailcow默认使用了80/443
作为WEB端口,如果您的服务器上已经存在WEB服务,可能会导致端口冲突,我们可以修改mailcow.conf
这个配置文件,将
HTTP_PORT=80
HTTPS_PORT=443
修改为其它端口,比如修改为:
HTTP_PORT=880
HTTPS_PORT=8443
然后执行下面的命令拉取容器镜像和启动:
#拉取镜像
docker-compose pull
#启动容器
docker-compose up -d
初始化mailcow和添加域名
安装成功后,访问您的IP + 端口进入WEB管理界面,默认用户名:admin
,密码为:moohoo
进入后台后点右上方“配置 - 邮箱设置 - 添加域名”
注意:添加域名的时候这里需要填写您的顶级域名domian.com
,比如您主机名设置的是mail.domain.com
,那么这里添加域名的时候填写domain.com
添加邮箱解析
域名添加完毕后,右侧有个DNS按钮,点击这个按钮会对您的域名DNS进行检测和指引。
不过那个检测有点不准,而且并非所有记录都要添加,下面是必须添加的记录。
主机名 | 记录类型 | 记录值 | 备注 |
---|---|---|---|
mail.domain.com | A | 您的IP | 填写你VPS的公网IP |
您的IP | PTR | mail.domain.com | 可能需要联系服务商添加 |
domain.com | MX | mail.domain.com | |
autodiscover.domain.com | CNAME | mail.domain.com | |
autoconfig.domain.com | CNAME | mail.domain.com | |
domain.com | TXT | v=spf1 a mx ip4:173.0.xx.xxx ~all | IP改成你自己的 |
dkim._domainkey.domain.com | TXT | 从mailcow后台获取 | DKIM记录从mailcow后台获取 |
邮件测试
DNS解析添加完毕后,等待几分钟生效,然后在mailcow后台添加邮箱账号,并登录webmail进行发件测试。
打开https://www.mail-tester.com/这个网站,然后用你的mailcow邮箱发送邮件,发送完毕后查看得分。
满分为10分,如果评分很差,mail-tester会给出提示,建议根据提示进行修正即可。
总结
上述步骤我们仅仅是完成了安装和初始化,其实后续还有很多配置和维护工作要做。比如禁用IPV6、反向代理、配置SSL证书、数据备份与恢复等,有兴趣的可以参考mailcow官方文档完成,后续xiaoz再分享mailcow配置方面的内容。
自建邮局比较复杂且步骤繁多,很多细节问题若处理不好很容易进垃圾箱。非必要情况建议使用第三方企业邮箱即可,除非有特殊需求。自建邮局虽然不受发件量限制,但不建议短时间内发送大量垃圾邮件,否则你的IP或域名很容易被拉黑,最后得不偿失。
- mailcow官网:https://mailcow.email/
如果您也需要自建邮局服务器,可联系我的
QQ:446199062
或者微信:xiaozme
设置Linux主机名—这一步可以省略吗?
省略了好像有点问题,官网文档是要求设置主机名的,建议还是设置一下。
好像没啥大事,我没有改,目前正常。自用
嗯嗯,没问题就行。我是担心怕出现什么奇怪的BUG
报错:Container mailcowdockerized-unbound-mailcow-1 erro
这个看不出来,建议看下容器日志进一步定位错误原因。
报错:
ERROR: The Compose file ‘./docker-compose.yml’ is invalid because:
services.nginx-mailcow.ports is invalid: Invalid port “:443:443”, should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
services.nginx-mailcow.ports is invalid: Invalid port “:80:80”, should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
何解?
看起来是你自己去修改了docker-compose.yml文件,但是格式没对,提示比较明显了,应该是”443:443″而不是”:443:443″(你前面多了一个冒号),建议根据报错提示再检查检查。
这个可没有,我是按照步骤一步一步来的,然后没排查出来,又按照mailcow的文档装了一次,没有出现这个错误了,结果docker-compose up -d后,网页打不开,用IP或域名访问都打不开,防火墙也关了,整了一下午,真郁闷……
如果我的是内网服务器呢,多个服务器 使用一个 公网IP
做好端口映射就行,但是如果你的公网IP是动态变化的话还需要DDNS
具体需要映射哪些端口阿
这个mailcow支持多个域名添加吗
可以添加多个别名域名,好像不支持添加多个主域。
可以的,我用过。用SAN config ,mailcow.conf,你可以自己修改这个文件。
这里有详细教程:
https://community.mailcow.email/d/206-mailcow-ignores-additional-san-in-config
为啥我输入账号密码 登录不进去 ,点击登录 页面刷新了一下没了
不太清楚,建议根据浏览器控制台报错和服务端日志来排查。
如果你是在sogo里面遇到这个情况,是因为默认关闭了修改密码功能,需要去开启
Enable password changing¶
The password change option in SOGo is disabled by default because it:
doesn’t take into account the password policy set in the mailcow UI
doesn’t work when the user is logged in into SOGo using the Login to Webmail function in the mailcow UI (Auth Proxy)
If you still want enable this option edit data/conf/sogo/sogo.conf and change SOGoPasswordChangeEnabled to YES. Please do not add a new parameter.
Run this command to activate the changes:
docker compose (Plugin)
docker-compose (Standalone)
docker compose restart memcached-mailcow sogo-mailcow
你可以查看一下这段文档解释。
具体操作是这样的:
cd /opt/mailcow-dockerized/data/conf/sogo
vi sogo.conf
修改里面的SOGoPasswordChangeEnabled 为YES后保存退出
然后运行下面这段代码让他生效
docker compose restart memcached-mailcow sogo-mailcow
弄这个有啥用
可以用来收发邮件,限制更少一些。