logo NodeSeekbeta

poste.io自建邮局+对接Roundcube,经验分享

为什么选择 poste.io

poste.io我个人认为是相对来说较为简单且轻量(关掉反病毒的前提下)的邮局系统,也是我加入mjj后部署的首个邮局系统,想当年(其实好像也就是年初),我拿着RN的1h1g在互联网上检索自建邮局的教程,那时候我安装docker都装不明白,完全复刻教程都搞不好得傻鸟,依稀记得当时在网吧里通宵搞这个,一次次的重装系统哈哈。

今天我故地重游,再次部署一下 post.io,相信搭配我的 nimama.de 域名,还是很有特色的,例如 [email protected]。做都做了,顺便给大家分享下一些经验。请多点温暖多点爱!

大家也可以在此看本文 https://ninb.de/postio

部署 poste.io

使用docker命令部署 poste.io

docker run -d --restart=always \
  --net=postio(子网名,建议单独为邮件服务建个bridge子网) \
  -p 25:25 \
  -p 3016(修改为可用端口):80 \
  -p 110:110 \
  -p 143:143 \
  -p (3017)修改为可用端口:443 \
  -p 587:587 \
  -p 993:993 \
  -p 995:995 \
  -v 宿主机挂载目录:/data \
  -v /etc/localtime:/etc/localtime:ro \
  -e TZ=Asia/Shanghai \
  --name "容器名" \
  -h "mail.nimama.de(邮局域)" \
  -t analogic/poste.io

配置反代

一开始我是只反代了容器内部的80端口,然后发现poste.io会自己跳转443端口
于是我又为容器内部的443端口反代

反代配置示例:

容器80端口

server {
    listen 80;
    server_name mail.nimama.de;#邮局域
    
    # 日志文件配置(以自己实际路径为准)
    access_log /www/sites/postio/log/access.log main;
    error_log /www/sites/postio/log/error.log;

    # 【核心部分】反向代理设置
    location / {
        # 将流量转发给宿主机的 3016 端口,对应容器的80端口(以自己实际设置端口为准)
        proxy_pass http://127.0.0.1:3016;
        
        # 必须携带的 Header,否则 Poste.io 无法识别来源
        proxy_set_header Host $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;
        
        # 支持 Websocket (Poste.io 部分功能可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 用于 Let's Encrypt 证书申请的验证目录
    location ^~ /.well-known/acme-challenge {
        allow all;
        root /usr/share/nginx/html;
    }
}

容器443端口

注意:

  • 443端口反代一定要加上 proxy_ssl_verify off 忽略容器内的自签名证书验证
server {
    # 1. 开启 SSL 监听
    listen 443 ssl http2;
    server_name mail.nimama.de;#邮局域

    # 2. SSL 证书路径配置(以自己实际证书路径为准)
    ssl_certificate /www/sites/postio2/ssl/fullchain.pem; 
    ssl_certificate_key /www/sites/postio2/ssl/privkey.pem;

    # SSL 优化参数
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # 3. 日志 (以自己实际路径为准)
    access_log /www/sites/postio2/log/access.log main;
    error_log /www/sites/postio2/log/error.log;

    # 4. 允许上传大附件
    client_max_body_size 100m;

    # 5. 【核心】反向代理设置
    location / {
        # 将流量转发给宿主机的 3017 端口,对应容器的443端口(以自己实际设置端口为准)
        # 注意:这里用 https 协议转发,因为 Poste.io 内部强制 HTTPS
        proxy_pass https://127.0.0.1:3017;

        # 【关键】因为容器内是自签名证书,宿主机 Nginx 必须忽略验证,否则报 502
        proxy_ssl_verify off;

        # 传递真实头部信息
        proxy_set_header Host $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;
        
        # Websocket 支持 (Poste.io 网页版可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

进入安装页面

配置完毕后,打开 https://mail.nimama.de/admin/install/server 进入安装页面
这里,我以为是 /admin 或 /install 重装了好多次,才知道是 /admin/install/server 是安装页面
填管理员账户名,设置密码,进入后台


添加ssl证书

然后我们到下图所示的地方去添加ssl证书
image

这里很多人都是选择使用内置的Let's Encrypt certificate 去申请
但我觉得我使用的是bridge网络模式可能会失败
于是我就去了1panel面板去申请了 mail.nimama.de 证书
这个地方有两个需要注意的

  1. 1panel申请下来的证书是两个文件,分别是fullchain.pem和privkey.pem,但是这个页面要上传三个证书文件,分别是Private part of certificate,Intermediate certificate和Public part of certificate。我们需要把fullchain.pem拆开,其中Private part of certificate对应privkey.pem,Public part of certificate对应的是fullchain.pem的上半段内容,Intermediate certificate对应的是fullchain.pem和privkey.pem的后半段内容。将这些上传至对应块,点击 Save chanages生效。
  2. 我们现在申请的证书,很大一部分都是默认申请为 ECC (椭圆曲线) 算法的证书,而post.io和其他的很多邮局系统只支持标准的 RSA 证书,所以要擦亮眼睛,别搞错了。ECC算法证书 ❌ RSA 算法证书 ✅

解析必要的DNS

记录类型 名称 内容 备注
A mail 1.2.3.4(自己邮局服务器的IP地址) 名称可自定义
MX @ mail.nimama.de 优先级10
TXT @ v=spf1 a mx -all
TXT mail v=spf1 a -all
TXT _dmarc "v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]" 后面替换邮局域

反向域名解析rDNS

这块的话,一般给开25端口的商家应该都会提供的。Netcup的话实在scp修改,RN的话需要发工单修改


关闭反病毒

poste.io默认是开启入站病毒检查的,好像是内置的ClamAV
众所周知,这玩意非常消耗资源,如果是小小鸡的话还是尽可能的关掉较好,免得撑炸了。(我当年的rn就是部署好直接撑炸)
依旧是打开System settings,上方栏目选中 Spam & virus checks 滑到最下面。
image

将图中默认勾选的选项取消勾选
image


发封邮件做测试

我们可以打开这个网站为刚刚搭好的邮局来评分 https://www.mail-tester.com/
他会生成一个邮件地址,你向这个地址发送邮件,然后会对整个邮件进行多方位的评分
在这个过程中我们可以看到有哪些设置不足,或者有哪些问题,这个网站会给出解决方案
image


连接其他Webmail程序Roundcube

其实吧,如果是部署poste.io的话,这一步纯多余,因为poste.io自带Webmail。但是中间的经验还是可以学一学的,后面如果更换了其他邮局系统,也会方便很多。


部署Roundcube

这里的docker命令中的参数其实是重点,这里我用了8080端口,各位可以随意

docker run -d --restart=always \
  --name roundcube \
  --net=postio \
  --link mailserver:mail.nimama.de \
  -p 8080:80 \
  -e ROUNDCUBEMAIL_DEFAULT_HOST=tls://mail.nimama.de \
  -e ROUNDCUBEMAIL_DEFAULT_PORT=143 \
  -e ROUNDCUBEMAIL_SMTP_SERVER=tls://mail.nimama.de \
  -e ROUNDCUBEMAIL_SMTP_PORT=587 \
  -e ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE=100M \
  -v /opt/roundcube/db:/var/www/html/db \
  -v /opt/roundcube/config:/var/www/html/config \
  roundcube/roundcubemail

Roundcube连接poste.io的坑

连接Webmail程序Roundcube时环境变量直接使用公网域名mail.nimama.de导致NAT 回环,登录时一直在转圈报错

将poste.io与Roundcube拉到同一个docker子网中,使用容器名连接,证书验证失败,无法建立连接

解决方案:
核心连接环境变量,使用tls连接邮局域

  • ROUNDCUBEMAIL_DEFAULT_HOST=tls://mail.nimama.de
  • ROUNDCUBEMAIL_DEFAULT_PORT=143
  • ROUNDCUBEMAIL_SMTP_SERVER=tls://mail.nimama.de
  • ROUNDCUBEMAIL_SMTP_PORT=587

docker run命令中加上如下参数

  • --link mailserver:mail.nimama.de
    link参数相当于,修改了容器内的路由表,直接指向了 post.io,同时解决了NAT回环和证书验证失败的问题

结束!感谢大家!!!

12
  • 建议lz修正一下标题和正文,这个叫 poste.io 并非 post.io xhj007
    要不然搜索 poste 都搜不到你这篇帖子

  • poste.io docker设置HTTPS=OFF就不会自动跳443了,也就不用proxy_ssl_verify off ,直接nginx用自己的证书就行了

  • 你这域名。。。

  • 我选择mxroute

  • Roundcube这样对接支持改密码和注册吗?

  • ClamAV 这种在运行docker之前就可以在命令里关闭的

  • @GOOs #5
    搜噶,可以补充一下
    因为我本身就用ClamAV,我也没特别想要给关掉

  • @GOOs #4
    不支持,改密这个应该不能通过邮件协议吧
    不过好像post.io有提供api,能力强的话好像也不是不可以集成到里面去

  • 收藏了

  • xhj003 牛,加鸡腿~

  • 满分!!!

12

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有43595位seeker

🎉欢迎新用户🎉