为什么选择 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证书

这里很多人都是选择使用内置的Let's Encrypt certificate 去申请
但我觉得我使用的是bridge网络模式可能会失败
于是我就去了1panel面板去申请了 mail.nimama.de 证书
这个地方有两个需要注意的
- 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生效。
- 我们现在申请的证书,很大一部分都是默认申请为 ECC (椭圆曲线) 算法的证书,而post.io和其他的很多邮局系统只支持标准的 RSA 证书,所以要擦亮眼睛,别搞错了。ECC算法证书 ❌ RSA 算法证书 ✅
解析必要的DNS
| 记录类型 | 名称 | 内容 | 备注 |
|---|---|---|---|
| A | 1.2.3.4(自己邮局服务器的IP地址) | 名称可自定义 | |
| MX | @ | mail.nimama.de | 优先级10 |
| TXT | @ | v=spf1 a mx -all | |
| TXT | 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 滑到最下面。

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

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

连接其他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回环和证书验证失败的问题
建议lz修正一下标题和正文,这个叫
poste.io并非post.io要不然搜索 poste 都搜不到你这篇帖子
poste.io docker设置HTTPS=OFF就不会自动跳443了,也就不用proxy_ssl_verify off ,直接nginx用自己的证书就行了
你这域名。。。
我选择mxroute
@Mint0315 #1
是

ninb.de还是nimama.deRoundcube这样对接支持改密码和注册吗?
ClamAV 这种在运行docker之前就可以在命令里关闭的
@GOOs #5
搜噶,可以补充一下
因为我本身就用ClamAV,我也没特别想要给关掉
@GOOs #4
不支持,改密这个应该不能通过邮件协议吧
不过好像post.io有提供api,能力强的话好像也不是不可以集成到里面去
收藏了
满分!!!