Featured image of post 使用mailcow和docker自建私人邮箱服务器

使用mailcow和docker自建私人邮箱服务器

使用mailcow和docker在自己的电脑或服务器上搭建私人邮箱服务器

缘起

既然有了私有的域名,就可以充分利用一下,搭建一个私有的邮件服务器,这样就可以创建自己专属的邮箱,邮件的所有信息也都可以由自己完全掌控,更加安全。

私有邮件服务器有多种部署方式,因为我之前就已经在服务器上安装了docker,服务器上的其他软件工具也都使用docker进行容器化部署运行,因此这里的邮件服务器也选择用比较方便容器化的工具来部署。

在网上看到用得比较多的搭建邮件服务器的工具有Mailumailcow。最开始感觉Mailu的设置比较简单,界面也比较清爽,就试着弄了一下,但费了很大功夫也没能成功发送和接收邮件,最后只得作罢。

mailcow是另一个开源的邮箱服务器套装,包含搭建私有邮件服务器的必要软件包。mailcow官方提供用于docker容器化的安装指南,部署在服务器上比较方便。 然后测试了一下mailcow,能成功接收邮件,但对外发送邮件失败了,后来发现是因为我使用的运营商关闭了25端口,这时我已接近放弃自己搭建邮件服务器的想法。但后来看到网上说可以使用邮件中继/邮件转发作为替代方案,于是有花了很长时间摸索,终于用邮件中继解决了对外发送的问题。这里记录一下折腾这个邮件服务器的过程。

前提

  • docker和docker compose
  • 域名(二级域名即可)
  • acme.sh (生成SSL证书)
  • nginx (反向代理)

准备工作

准备域名

在自己购买域名的网站上或者自己域名的管理网站上创建一个二级域名并配置域名解析,具体过程可参见“个人网站的建立过程(一):购买个人域名并配置动态域名解析”

例如我有一个主域名jinli.cyou,于是我为私有邮箱服务器创建了一个"mail.jinli.cyou"的二级域名。然后在阿里云的域名管理平台上进行了域名和IP地址的绑定。

使用acme.sh生成SSL证书

网上很多教程都使用Let’s Encrypt来生成SSL证书,但由于我之前在搭建这个网站时已经下载了acme.sh工具,因此这里我使用了acme.sh来为"cloud.jinli.cyou"生成证书。具体过程可参见个人网站的建立过程(二):使用Hugo框架搭建个人网站

过程如下:

  1. 找到你的域名管理账户的Access key。可以使用之前的,也可以重新获取,然后将Access key到处为系统变量Ali_KeyAli_Secret

  2. 使用下面的命令生成证书:

    1
    
    acme.sh --issue --dns dns_ali -d your.domain.com
    
  3. 使用下面的命令将证书复制到你的mailcow目录下,例如我在mailcow安装目录下新建了一个文件夹cert来存放证书文件:

    1
    2
    3
    
    acme.sh --install-cert -d your.domain.com \
            --key-file /media/mailcow/cert/key.pem \
            --fullchain-file /media/mailcow/cert/cert.pem 
    

nginx反向代理配置

因为我之前在建立本网站时就安装了nginx,所以这里我使用了nginx作为反向代理工具。

在nginx的配置目录下创建一个新的配置文件mailcow.conf作为云网盘的反向代理配置文件,文件内写入:

server{
    listen 80;
    server_name mail.jinli.cyou;
    return 301 https://mail.jinli.cyou$request_uri;
}

server{
    listen 443 ssl;
    ssl_certificate /media/lijin/mailcow/certs/cert.pem;
    ssl_certificate_key /media/lijin/mailcow/certs/key.pem;
    server_name mail.jinli.cyou;
    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 0;
        proxy_buffer_size 128k;
        proxy_buffers 64 512k;
        proxy_busy_buffers_size 512k;
    }
}

这里我使用8080端口作为mailcow的服务端口。SSL证书存放在上一步指定的位置。

配置完成后重启nginx服务使修改生效:

1
sudo service nginx restart

安装mailcow

使用docker-compose安装mailcow的方法可以参见mailcow官方提供的教程

需要注意的是,安装mailcow需要使用docker compose而非docker-compose

添加新用户等后续设置

以管理员身份登录进mailcow管理界面后,点击右上角的管理员账户头像,在下拉菜单中可以看到“Users”选项。点击这个选项,就可以添加用户组和新用户了。

邮箱中继(邮箱转发)

很多运营商都会屏蔽25端口,这会导致邮件无法从服务器发送出去。因此一种选择是联系运营商,让运营商解封25端口,但这并不容易。

另一种解决方案是使用邮箱中继(邮箱转发)服务,即将需要从自建邮箱A发出的邮件交给另一个有发送邮件功能的邮箱服务器B,将要发送的邮件由邮箱服务器B代发出去。通常,邮箱服务器B可以是Gmail这样的 邮件服务商,可以是专门提供邮箱转发服务的商业公司(如MailgunSendGrid等),有些网络运营商(如AT&T)也会为用户提供邮件转发服务。

由于Gmail在提供邮件转发服务时,发送的邮件会加上Google的签名信息,而Mailgun和SendGrid等商业邮件转发需要付费才能使用,因此这里我使用AT&T提供的免费邮件转发服务。

中继邮箱设置

不同的邮箱可能有不同的设置方式,这里以AT&T提供的邮箱为例。

  1. 设置中找到Mailboxes选项,里面有Send-only email address,点击Add添加你需要代理转发的邮箱。例如我要使用AT&T邮箱替我的 个人邮箱[email protected]发送邮件,我就添加一个[email protected]

    Relay mail setting

  2. 点击确认之后,AT&T会向代转发的邮箱发送一封邮件来核实身份。登录进个人邮箱[email protected]之后,按照邮件的说明点击链接确认就行了。

  3. 邮箱核实成功之后,上面的AT&T设置里提示"Not verified"的红色提示会消失(可能需要等待几分钟到几小时)。

注意事项:

  • 在点击验证链接验证之后,可能需要等待几分钟到几小时,AT&T邮箱设置里的"Not verified"红色提示才会消失。

  • 有时点击AT&T发送的验证链接并不能正确跳转到验证页面,这可能是因为浏览器中有之前登录AT&T邮箱中的缓存问题,这时可以手动复制链接到新的隐私浏览器或者别的浏览器中打开。

mailcow设置

按照mailcow官方文档给出的设置邮箱转发的步骤为个人邮箱设置邮箱转发:https://docs.mailcow.email/manual-guides/Postfix/u_e-postfix-relayhost/

主要分为三步:

  1. 登录mailcow管理员界面,在Configuration and Details设置中找到Routing,添加上你的转发服务器,例如我使用AT&T的邮箱,就使用smtp.mail.att.net:587。 然后填上你的用户名和密码,建议在代理邮箱里重新设置一个给外部使用的密码。

  2. 设置好之后点击Test按钮,填上要代理的邮箱进行测试。若一切顺利,则可以看到最后发送成功的绿色的提示信息。若收到红色的失败信息,则表示设置的不对,需要检查前面的设置。

  3. 在mailcow的管理界面,进入Mail Setup,找到Domains。把前面在Routing中设置的代理邮箱添加到Sender-dependent transports

测试

Mail tester可以测试一下自己搭建的邮箱效果怎么样。

分数不高,将将及格,但也基本够用了。

Mail tester

想要提升分数的话可以看一下扣分的项,根据Mail tester的建议进行改进。

comments powered by Disqus