使用 mailcow:dockerized 搭建邮件服务器

本文记录了我在全新的 vultr 服务器上利用 mailcow:dockerized 搭建邮件服务,并进行邮箱设置优化的过程。

前提条件

  • 一台公网服务器,我使用的配置为:Vultr Ubuntu_17.10_x64 / $2.50/mo。官方文档给出的配置要求:
资源 mailcow: dockerized
CPU 1 GHz
内存 1 GiB (或更好的 1.5 GiB + Swap)
硬盘 5 GiB (不含邮件存储)
系统类型 x86_64
  • 一个域名,下文以 xxx.xxx 指代。

vultr 服务器默认是关闭 25 端口的,需要先发工单解除屏蔽!我一开始费了老大劲,各种改配置都无法成功发信,偶然才了解了这个情况,真是一把辛酸泪!
另外 google cloud engine(gce)的服务器也是屏蔽25端口的,并且无法解封。Sending Email from an Instance

端口检查

运行命令:netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995',如果无输出则表示没有端口占用的情况,否则需要自行处理端口(关掉占用的程序或者后续安装时改 mailcow 配置)。如果已经运行了 nginx 或者其他 web 程序,可以考虑修改 mailcow 的端口,用反向代理的方式访问 mailcow。

添加swap

乞丐版配置需要通过添加 swap 来满足内存需求,步骤参考:服务器折腾

安装 mailcow

安装 mailcow: dockerized,照着官方文档走:Installation - mailcow: dockerized documentation ,下面简单介绍下主要环节。

基础 DNS 设置

先配四条基础的:

# Name              Type       Value
mail                IN A       1.2.3.4(服务器ip)
autodiscover        IN CNAME   mail
autoconfig          IN CNAME   mail
@                   IN MX 10   mail

安装 docker 和 docker-compose

照着 docker-ce 文档自行包安装的,没有跟着 mailcow 文档走。

  • docker Get Docker CE for Ubuntu
    添加key:

    $ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    查看 key:

    $ sudo apt-key fingerprint 0EBFCD88
    
    pub   4096R/0EBFCD88 2017-02-22
          Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid                  Docker Release (CE deb) <docker@docker.com>
    sub   4096R/F273FCD8 2017-02-22

    添加软件源:

    $ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

    安装、启动:

    $ sudo apt-get update && sudo apt-get install docker-ce
    sudo systemctl enable docker.service
    sudo systemctl start docker.service
  • docker-compose Install Docker Compose
    下载后添加可运行权限(如下载失败,请检查并去掉多余的反斜杠):

    $ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)  -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

获取并启动 mailcow-dockerized

先执行 umask 命令,确定为 0022,之后将 mailcow-dockerized 代码拉下来放到某个地方(比如 /opt):

cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

执行./generate_config.sh,这里填的域名MAILCOW_HOSTNAME,即mail.xxx.xxx
获取 docker 镜像并启动:

docker-compose pull
docker-compose up -d

安装完成后可通过https://${MAILCOW_HOSTNAME}访问网页端管理,使用默认的用户名:admin,密码:moohoo 登陆。我第一次访问时发现https 证书错误,根据 官方文档 应该会自动尝试获取 Letsencrypt 的证书,参考 #489,删除旧证书并重启就好了:

rm data/assets/ssl/acme/private/*
docker-compose down && docker-compose up -d

添加 domain 和 mailbox

登陆后,先改下密码,然后在右上方菜单 Configuration->Mailboxes 处添加域名,即 xxx.xxx(非mail.xxx.xxx),接着添加邮箱账号(mailbox,如i@xxx.xxx),点击页面右上角 Restart SOGo,之后可通过 Apps->SOGo 进入 web 界面。
至此,使用 i@xxx.xxx 的邮箱地址已经可以成功收信和发信了,只是一般都会被别的邮件服务商归为垃圾邮件,我们还需要完善下配置,提高可信度。

更多设置

对照 DNS Setup 完善下 DNS 设置。

SPF

抄了一条 DNS 记录:

    @                   IN TXT     "v=spf1 mx ~all"

DKIM

在 mailcow 网页端,Configuration -> Administration -> ARC/DKIM keys,添加一个dkim,Domainxxx.xxxSelectordkim,length 选 1024(2048貌似 Dnspod 不支持),生成结果如图:
dkim.png
将 key 的内容填入 DNS 记录:

dkim._domainkey  IN TXT     "v=DKIM1; k=rsa; t=s; s=email; p=..."

DMARC

在网上抄了一条:

_dmarc              IN TXT     "v=DMARC1; p=reject; pct=100;"

SRV

没填

rDNS

Reverse DNS,反向 DNS,给 ip 指定域名,有时候会用到反向解析,参考 vultr rDNS ,前往主机的管理后台设置下:
rDNS

最终我的 DNS 设置大致如下:
mailcow DNS

测试

mail tester 跑个分。

邮件客户端设置

server setting

备注

常用命令:

docker-compose up -d  #启动
docker-compose down    #停止
docker-compose logs [options] $service_name #查看日志,比如 docker-compose logs acme-mailcow

参考内容