Poste.io 是什么
Poste.io 是一个开箱即用的邮件服务器方案,通过 Docker 容器化部署,将 SMTP、IMAP、POP3、Webmail、反垃圾邮件、防病毒、SSL 证书管理等组件打包在一起,一条命令即可启动服务,但完整的邮件系统搭建仍需提前配置 DNS、申请 SSL 证书、设置 DKIM 等步骤。
| 组件 | 说明 |
|---|---|
| SMTP / SMTPS | 发送邮件(端口 25/465/587) |
| POP3 / POP3S | 收取邮件(端口 110/995) |
| IMAP / IMAPS | 收取邮件(端口 143/993) |
| Webmail | 内置 Roundcube 网页邮箱 |
| 反垃圾邮件 | Rspamd |
| 防病毒 | ClamAV |
| SSL 证书 | Let’s Encrypt 自动申请与续期 |
| 管理面板 | Web 可视化管理后台 |
| DNS 诊断 | 内置 SPF / DKIM / DMARC / PTR 检测工具 |
Docker Hub 镜像 analogic/poste.io 是 Docker Hub 上最受欢迎的 Docker 邮件方案之一。
系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核+ |
| 内存 | 2 GB(低配优化后可在 1 GB 运行) | 2 GB 及以上 |
| 磁盘 | 20 GB | 30 GB+ |
| 系统 | Ubuntu 20.04+ / Debian 11+ | Ubuntu 22.04 / Debian 12 |
| Docker | ≥ 20.10 | 最新稳定版 |
| 关键 | 25 端口必须开放(出入站) | 且 80/443 端口公网可达 |
Poste.io 默认可在 2 GB 内存的机器上正常运行。若服务器内存低于 2 GB,建议先按下方”低配优化”禁用 ClamAV 和 Rspamd 后再启动,否则容易触发 OOM。
25 端口是发送邮件的命脉。 国内云服务器(阿里云、腾讯云、华为云等)默认封锁 25 端口。部分云厂商支持申请解封(如腾讯云),但审核较严格。海外 VPS(Vultr、DigitalOcean、Hetzner 等,默认开放)仍是更省心的选择。
对于仅有接收邮件需求(不发送外网邮件)的场景,25 端口封锁也可以使用,但无法向外部邮箱(Gmail、QQ 邮箱等)发送邮件。
部署前:DNS 配置
假设域名为 example.com,服务器 IP 为 1.2.3.4。在部署之前,需要先在 DNS 管理面板添加以下记录。
A 记录与 CNAME
| 主机记录 | 记录类型 | 记录值 | 说明 |
|---|---|---|---|
| A | 1.2.3.4 | 邮件服务器主域名 | |
| smtp | CNAME | mail.example.com | SMTP 别名(可选) |
| pop | CNAME | mail.example.com | POP3 别名(可选) |
| imap | CNAME | mail.example.com | IMAP 别名(可选) |
MX 记录
| 主机记录 | 记录类型 | 优先级 | 记录值 |
|---|---|---|---|
| @ | MX | 10 | mail.example.com |
反垃圾邮件 DNS 记录(SPF / DKIM / DMARC)
邮件送达率(尤其是发送到 Gmail、Outlook 等大厂邮箱)很大程度上取决于这三条记录是否配置正确。
| 主机记录 | 记录类型 | 记录值 | 说明 |
|---|---|---|---|
| @ | TXT | v=spf1 mx ~all | SPF:授权你的服务器发送邮件 |
| (部署后获取) | TXT | (部署后从后台获取) | DKIM:邮件加密签名 |
| _dmarc | TXT | v=DMARC1; p=none; rua=mailto:admin@example.com | DMARC:验证策略与报告 |
DKIM 记录需要在 Poste.io 部署完成后,从后台 “Virtual domains → 域名 → DKIM” 生成,再添加到 DNS。不要在部署前猜测 DKIM 值。
PTR 记录(反向 DNS) 也非常重要。如果你的 IP 的 PTR 记录是类似 ip-87-45.isp.com 的格式,邮件几乎必定进垃圾箱。联系你的服务器提供商,将 IP 的 PTR 记录设置为 mail.example.com。大部分海外 VPS 在控制面板提供自助设置。
DNS 生效检查
# 检查 A 记录dig +short mail.example.com# 应返回 1.2.3.4
# 检查 MX 记录dig +short MX example.com# 应返回 mail.example.com
# 检查 TXT (SPF)dig +short TXT example.com# 应包含 v=spf1 mx ~allDNS 记录修改后可能需 10 分钟到数小时全球生效,建议在部署前提前配置好,等待 TXT 记录确认生效后再启动容器。
⚠️ Cloudflare 用户注意:如果域名使用 Cloudflare 的 DNS 代理(橙色云朵图标),务必关闭
smtp、imap、pop等主机记录的 CDN 代理(设为”仅 DNS”)。MX 记录也绝对不能开启代理,否则邮件流量被 Cloudflare 拦截,邮件服务将完全失效。
Docker Compose 部署
项目目录结构
poste/├── docker-compose.yml└── data/ # 自动创建,持久化所有数据docker-compose.yml
services: mailserver: container_name: mailserver hostname: mail.example.com # 替换为你的域名 image: analogic/poste.io network_mode: host # 必须使用 host 模式 restart: always environment: - TZ=Asia/Shanghai - HTTP_PORT=80 - HTTPS_PORT=443 # 低配机器可开启以下两项以节省内存 # - DISABLE_CLAMAV=TRUE # - DISABLE_RSPAMD=TRUE volumes: - ./data:/data
network_mode: host是 Poste.io 推荐的网络模式。邮件协议涉及大量端口,host 模式避免了逐个映射的麻烦,也避免了 NAT 导致的性能和安全问题。不要改用 bridge 模式,否则 DKIM 签名等多项功能会出问题。
data/ 目录包含所有邮件数据、SSL 证书、用户信息和配置,备份这个目录就等于备份了整个邮件系统。
启动
mkdir poste && cd poste# 创建 docker-compose.ymldocker compose up -d查看日志确认启动状态:
docker compose logs -f首次启动需要下载镜像(约 400 MB)并初始化数据库,可能需要 1–2 分钟。建议固定使用特定版本号(如 analogic/poste.io:2.3.18)以避免自动更新带来的不确定性。看到 HTTP server started 之类的日志后即可访问。
初始化配置
第一步:访问管理后台
浏览器打开 https://mail.example.com,首次访问会进入初始化向导。
设置管理员账号(如 admin@example.com)和管理员密码。管理员账号同时也是一个普通邮箱,可以正常收发邮件。
第二步:申请 SSL 证书
进入后台 → System settings → TLS Certificate:
- 选择 “Let’s Encrypt” 作为证书来源
- 填入域名
mail.example.com - 填入管理员邮箱
- 勾选 “Include wildcard” 和 “Auto renew”
- 点击 “Create certificate”
证书申请需要 80 端口公网可达(Let’s Encrypt HTTP-01 验证),请确保服务器防火墙已开放 80/443 端口。证书获取后,HTTPS 和邮件加密(STARTTLS / SSL/TLS)会自动生效,有效期 90 天,到期自动续期。
如果 80 端口被封锁(部分家庭宽带场景),可以手动上传已有证书,或通过 DNS-01 方式申请 Let’s Encrypt 证书后手动导入。
第三步:配置 DKIM
进入 Virtual domains → example.com → DKIM:
- 点击 “Create a new key”
- 复制生成的 DNS TXT 记录(类似
s20160910378._domainkey.example.com) - 添加到你域名的 DNS 配置中
- 等待 DNS 生效后,回到后台确认显示绿色
作为良好的安全实践,可考虑定期(如每年)轮换 DKIM 密钥,但非强制要求,请根据实际安全策略决定。轮换时在后台生成新密钥并更新 DNS 记录,旧密钥可保留一段时间后再删除。
第四步:创建邮箱账号
进入 Email accounts → Create a new email:
- 设置用户名的本地部分(如
hello) - 设置密码
- 选择域名
创建后即可用该账号登录 Webmail 或配置邮件客户端。
客户端配置
Webmail
直接访问 https://mail.example.com/roundcube(当前主流版本的默认路径),用邮箱地址和密码登录。https://mail.example.com/ 进入管理面板,登录后也可从导航菜单跳转至 Webmail。请以实际部署版本显示为准。内置 Roundcube,界面现代,支持文件夹管理、搜索、附件等常规功能。
桌面/移动客户端
| 协议 | 服务器地址 | 端口 | 加密方式 |
|---|---|---|---|
| IMAP | mail.example.com | 993 | SSL/TLS |
| POP3 | mail.example.com | 995 | SSL/TLS |
| SMTP | mail.example.com | 465 或 587 | SSL/TLS 或 STARTTLS |
推荐使用 IMAP + SMTP 465 (SSL/TLS),兼容性最好。
常见邮件客户端设置要点:
- Outlook / Thunderbird:手动配置时选择 “IMAP/SMTP”,填入上述服务器和端口
- Apple Mail:选择 “其他邮件账户”,填入邮箱地址和密码后手动输入服务器信息
- 移动端:选择 “手动设置” → “IMAP 账号”,填入服务器信息
防火墙端口清单
确保以下端口已在服务器防火墙(iptables / firewalld / 云服务商安全组)中开放:
| 端口 | 协议 | 用途 | 必须? |
|---|---|---|---|
| 25 | TCP | SMTP(邮件投递) | 是 |
| 80 | TCP | HTTP(Let’s Encrypt 验证) | 是 |
| 443 | TCP | HTTPS(管理面板 + Webmail) | 是 |
| 465 | TCP | SMTPS(客户端发送) | 是 |
| 587 | TCP | SMTP STARTTLS(客户端发送备选) | 推荐 |
| 993 | TCP | IMAPS(客户端收取) | 是 |
| 995 | TCP | POP3S(客户端收取备选) | 推荐 |
| 110 | TCP | POP3 | 可选 |
| 143 | TCP | IMAP | 可选 |
测试邮件系统
发送测试
用 Webmail 或客户端向自己的外部邮箱(Gmail、QQ 邮箱等)发送一封测试邮件,检查是否收到。
如果邮件进了垃圾箱,参考下一节”提升邮件送达率”进行系统排查。
命令行测试
# 测试 SMTP 连接openssl s_client -connect mail.example.com:465 -crlfEHLO example.com# 测试 IMAP 连接openssl s_client -connect mail.example.com:993 -crlf提升邮件送达率
邮件被 Gmail、Outlook 等大厂邮箱拒收或投入垃圾箱,通常是因为发件方验证(SPF/DKIM/DMARC/PTR)未完整配置。以下按优先级排列排查与优化步骤。
1. PTR 记录(反向 DNS)
大多数邮件服务商会检查发送方 IP 的 PTR 记录。如果你的 IP 的 PTR 是 ip-87-45.isp.com 这种格式,邮件几乎必定进垃圾箱。联系服务器提供商,将 IP 的 PTR 设置为 mail.example.com。
2. SPF 记录
检查 SPF 是否生效:发送一封邮件到 Gmail,查看原始邮件头中的 spf=pass。
初期可使用 ~all(软拒绝)降低风险,确认一切正常后建议收紧为 -all(硬拒绝):
v=spf1 mx -all3. DKIM 签名
检查原始邮件头中的 dkim=pass。如果显示 dkim=none 或 dkim=fail,在 Poste.io 后台确认 DKIM 密钥已生成且 DNS 记录已生效。
4. DMARC 策略
初期使用 p=none 监控模式,观察一段时间确认无正常邮件被误判:
v=DMARC1; p=none; rua=mailto:admin@example.com稳定后(通常 2–4 周)可逐步收紧为 p=quarantine(可疑邮件进垃圾箱)或 p=reject(直接拒收)。
5. IP 声誉
新 IP 没有历史信誉记录,送达率天然偏低。持续发送正常邮件(非群发、非营销)2–4 周后,各大邮件服务的信誉评分会逐步提升。
在线检测工具
- MXToolbox — 检查 MX、SPF、DKIM、DMARC、PTR 等记录
- Mail Tester — 发送一封邮件到测试地址获取详细评分
- DKIMValidator — 验证 DKIM 签名配置
数据备份与恢复
Poste.io 的所有数据都在 ./data 目录下,备份即备份该目录:
# 备份tar czf poste-backup-$(date +%Y%m%d).tar.gz ./data
# 恢复:停止容器 → 恢复 data 目录 → 启动容器docker compose downtar xzf poste-backup-20260525.tar.gzdocker compose up -d建议设置 cron 定时任务,每日自动备份:
0 3 * * * cd /opt/poste && tar czf backups/poste-$(date +\%Y\%m\%d).tar.gz ./data容器运行时直接 tar 打包可能产生数据不一致,建议先
docker compose stop再备份,或在凌晨流量最低时执行。对于重要邮件,推荐遵循 3-2-1 备份原则(3 份副本,2 种不同介质,1 份异地)。
低配优化
若服务器内存低于 2 GB,建议先禁用 ClamAV 和 Rspamd 后再启动,否则容易触发 OOM。禁用反病毒和反垃圾邮件模块:
environment: - DISABLE_CLAMAV=TRUE - DISABLE_RSPAMD=TRUE其中禁用 ClamAV 的效果最为显著——病毒特征库会额外占用数百 MB 内存。禁用后内存占用可降至约 500 MB,但会失去垃圾邮件过滤和病毒扫描能力。对于仅自己使用、发送量小的场景影响不大。
常见问题
Q:启动后无法打开管理页面
检查容器状态:
docker compose psdocker compose logs --tail 50常见原因:hostname 为 localhost(应改为完整域名)、80/443 端口被占用、DNS A 记录未生效导致 Let’s Encrypt 验证失败。
Q:Let’s Encrypt 证书申请失败
确认 80 端口公网可达:
# 在外部网络执行curl http://mail.example.com如果 80 端口确实无法开放,可以手动申请证书后挂载进容器:
# 使用 certbot 的 DNS-01 验证方式certbot certonly --manual --preferred-challenges=dns -d mail.example.com# 将证书复制到 data/ 目录下的对应位置Q:发送邮件被 Gmail/Outlook 拒收或进垃圾箱
详见”提升邮件送达率”章节,按 SPF → DKIM → PTR → DMARC → IP 声誉的顺序逐一排查。
Q:25 端口被封锁怎么办
如果服务器 25 端口出站被封锁(国内服务器普遍情况),可以考虑:
- 换用海外 VPS(最推荐的方案)
- 使用邮件中继服务(如 SendGrid、Mailgun 的免费计划),由中继服务通过 587 端口代发邮件
- 如果仅需收件,25 端口封锁不影响接收功能
中继服务配置:在 Poste.io 后台 System settings → Outgoing SMTP relay 中填写中继服务的 SMTP 地址和认证信息。
Q:内存不足报 OOM
按优先级处理:
- 禁用 ClamAV 和 Rspamd(见”低配优化”章节)
- 增加 swap:
Terminal window sudo fallocate -l 2G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfile - 升级服务器内存
Q:如何迁移邮件到新服务器
在旧服务器和新服务器之间通过 IMAP 同步:
# 使用 imapsync 工具docker run --rm gilleslamiral/imapsync imapsync \ --host1 mail.old-domain.com --user1 user@old-domain.com --password1 xxx \ --host2 mail.new-domain.com --user2 user@new-domain.com --password2 xxximapsync 免费版有 3 GB 流量限制,大邮箱迁移可能超出免费额度。超限后可购买授权或改用
doveadm sync等工具。
基本安全加固(可选)
邮件服务器暴露在公网,容易被扫描和暴力破解。建议安装 fail2ban 并启用相关监狱:
sudo apt install fail2ban -y创建 /etc/fail2ban/jail.local:
[sshd]enabled = true
[postfix-sasl]enabled = trueport = smtp,465,587,imap,993,pop3,995logpath = /opt/poste/data/log/mail.logmaxretry = 5bantime = 3600日志路径需根据实际 Poste.io 数据目录调整。重启 fail2ban:
sudo systemctl restart fail2ban。更多配置参考 Fail2ban 官方文档。