3310 字
17 分钟
Poste.io 本地部署使用教程:Docker 自建域名邮箱

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 邮件方案之一。

系统要求#

项目最低要求推荐配置
CPU1 核2 核+
内存2 GB(低配优化后可在 1 GB 运行)2 GB 及以上
磁盘20 GB30 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#

主机记录记录类型记录值说明
mailA1.2.3.4邮件服务器主域名
smtpCNAMEmail.example.comSMTP 别名(可选)
popCNAMEmail.example.comPOP3 别名(可选)
imapCNAMEmail.example.comIMAP 别名(可选)

MX 记录#

主机记录记录类型优先级记录值
@MX10mail.example.com

反垃圾邮件 DNS 记录(SPF / DKIM / DMARC)#

邮件送达率(尤其是发送到 Gmail、Outlook 等大厂邮箱)很大程度上取决于这三条记录是否配置正确。

主机记录记录类型记录值说明
@TXTv=spf1 mx ~allSPF:授权你的服务器发送邮件
(部署后获取)TXT(部署后从后台获取)DKIM:邮件加密签名
_dmarcTXTv=DMARC1; p=none; rua=mailto:admin@example.comDMARC:验证策略与报告

DKIM 记录需要在 Poste.io 部署完成后,从后台 “Virtual domains → 域名 → DKIM” 生成,再添加到 DNS。不要在部署前猜测 DKIM 值。

PTR 记录(反向 DNS) 也非常重要。如果你的 IP 的 PTR 记录是类似 ip-87-45.isp.com 的格式,邮件几乎必定进垃圾箱。联系你的服务器提供商,将 IP 的 PTR 记录设置为 mail.example.com。大部分海外 VPS 在控制面板提供自助设置。

DNS 生效检查#

Terminal window
# 检查 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 ~all

DNS 记录修改后可能需 10 分钟到数小时全球生效,建议在部署前提前配置好,等待 TXT 记录确认生效后再启动容器。

⚠️ Cloudflare 用户注意:如果域名使用 Cloudflare 的 DNS 代理(橙色云朵图标),务必关闭 mailsmtpimappop 等主机记录的 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 证书、用户信息和配置,备份这个目录就等于备份了整个邮件系统。

启动#

Terminal window
mkdir poste && cd poste
# 创建 docker-compose.yml
docker compose up -d

查看日志确认启动状态:

Terminal window
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

  1. 选择 “Let’s Encrypt” 作为证书来源
  2. 填入域名 mail.example.com
  3. 填入管理员邮箱
  4. 勾选 “Include wildcard” 和 “Auto renew”
  5. 点击 “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

  1. 点击 “Create a new key”
  2. 复制生成的 DNS TXT 记录(类似 s20160910378._domainkey.example.com
  3. 添加到你域名的 DNS 配置中
  4. 等待 DNS 生效后,回到后台确认显示绿色

作为良好的安全实践,可考虑定期(如每年)轮换 DKIM 密钥,但非强制要求,请根据实际安全策略决定。轮换时在后台生成新密钥并更新 DNS 记录,旧密钥可保留一段时间后再删除。

第四步:创建邮箱账号#

进入 Email accounts → Create a new email

  • 设置用户名的本地部分(如 hello
  • 设置密码
  • 选择域名

创建后即可用该账号登录 Webmail 或配置邮件客户端。

客户端配置#

Webmail#

直接访问 https://mail.example.com/roundcube(当前主流版本的默认路径),用邮箱地址和密码登录。https://mail.example.com/ 进入管理面板,登录后也可从导航菜单跳转至 Webmail。请以实际部署版本显示为准。内置 Roundcube,界面现代,支持文件夹管理、搜索、附件等常规功能。

桌面/移动客户端#

协议服务器地址端口加密方式
IMAPmail.example.com993SSL/TLS
POP3mail.example.com995SSL/TLS
SMTPmail.example.com465 或 587SSL/TLS 或 STARTTLS

推荐使用 IMAP + SMTP 465 (SSL/TLS),兼容性最好。

常见邮件客户端设置要点:

  • Outlook / Thunderbird:手动配置时选择 “IMAP/SMTP”,填入上述服务器和端口
  • Apple Mail:选择 “其他邮件账户”,填入邮箱地址和密码后手动输入服务器信息
  • 移动端:选择 “手动设置” → “IMAP 账号”,填入服务器信息

防火墙端口清单#

确保以下端口已在服务器防火墙(iptables / firewalld / 云服务商安全组)中开放:

端口协议用途必须?
25TCPSMTP(邮件投递)
80TCPHTTP(Let’s Encrypt 验证)
443TCPHTTPS(管理面板 + Webmail)
465TCPSMTPS(客户端发送)
587TCPSMTP STARTTLS(客户端发送备选)推荐
993TCPIMAPS(客户端收取)
995TCPPOP3S(客户端收取备选)推荐
110TCPPOP3可选
143TCPIMAP可选

测试邮件系统#

发送测试#

用 Webmail 或客户端向自己的外部邮箱(Gmail、QQ 邮箱等)发送一封测试邮件,检查是否收到。

如果邮件进了垃圾箱,参考下一节”提升邮件送达率”进行系统排查。

命令行测试#

Terminal window
# 测试 SMTP 连接
openssl s_client -connect mail.example.com:465 -crlf
EHLO example.com
Terminal window
# 测试 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 -all

3. DKIM 签名#

检查原始邮件头中的 dkim=pass。如果显示 dkim=nonedkim=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 目录下,备份即备份该目录:

Terminal window
# 备份
tar czf poste-backup-$(date +%Y%m%d).tar.gz ./data
# 恢复:停止容器 → 恢复 data 目录 → 启动容器
docker compose down
tar xzf poste-backup-20260525.tar.gz
docker compose up -d

建议设置 cron 定时任务,每日自动备份:

Terminal window
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:启动后无法打开管理页面

检查容器状态:

Terminal window
docker compose ps
docker compose logs --tail 50

常见原因:hostname 为 localhost(应改为完整域名)、80/443 端口被占用、DNS A 记录未生效导致 Let’s Encrypt 验证失败。

Q:Let’s Encrypt 证书申请失败

确认 80 端口公网可达:

Terminal window
# 在外部网络执行
curl http://mail.example.com

如果 80 端口确实无法开放,可以手动申请证书后挂载进容器:

Terminal window
# 使用 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 端口出站被封锁(国内服务器普遍情况),可以考虑:

  1. 换用海外 VPS(最推荐的方案)
  2. 使用邮件中继服务(如 SendGrid、Mailgun 的免费计划),由中继服务通过 587 端口代发邮件
  3. 如果仅需收件,25 端口封锁不影响接收功能

中继服务配置:在 Poste.io 后台 System settings → Outgoing SMTP relay 中填写中继服务的 SMTP 地址和认证信息。

Q:内存不足报 OOM

按优先级处理:

  1. 禁用 ClamAV 和 Rspamd(见”低配优化”章节)
  2. 增加 swap:
    Terminal window
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
  3. 升级服务器内存

Q:如何迁移邮件到新服务器

在旧服务器和新服务器之间通过 IMAP 同步:

Terminal window
# 使用 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 xxx

imapsync 免费版有 3 GB 流量限制,大邮箱迁移可能超出免费额度。超限后可购买授权或改用 doveadm sync 等工具。

基本安全加固(可选)#

邮件服务器暴露在公网,容易被扫描和暴力破解。建议安装 fail2ban 并启用相关监狱:

Terminal window
sudo apt install fail2ban -y

创建 /etc/fail2ban/jail.local

[sshd]
enabled = true
[postfix-sasl]
enabled = true
port = smtp,465,587,imap,993,pop3,995
logpath = /opt/poste/data/log/mail.log
maxretry = 5
bantime = 3600

日志路径需根据实际 Poste.io 数据目录调整。重启 fail2ban:sudo systemctl restart fail2ban。更多配置参考 Fail2ban 官方文档

参考资源#

Poste.io 本地部署使用教程:Docker 自建域名邮箱
https://blog.syomega.top/posts/posteio-deploy-guide/
作者
酱w
发布于
2026-05-25
许可协议
CC BY-NC-SA 4.0