Source: https://once-email.com/zh_cn/blog/corecomponent

送达与认证  · 2025年5月22日更新于 2026年8月23日

# Postfix 与 Dovecot 有什么区别：收件服务器职责与排障路径

看懂 Postfix、Dovecot、LMTP、邮件队列和 IMAP 在收件链路中的分工，并按证据判断邮件卡在哪一层。

[Once Email 工程团队, Once Email author Once Email 工程团队](<https://once-email.com/zh_cn/about>)

审校 Once Email 技术审校

这篇指南帮助你完成

判断入站邮件故障发生在 SMTP 接收、队列投递、邮箱存储还是 IMAP 访问。

文章导读

这篇文章值得阅读的原因

**原创分析**

本文把同一封入站邮件拆成 SMTP 接收、排队、LMTP 投递、邮箱存储和 IMAP 读取五个检查点，并把失败证据归给真正负责的组件。

**趋势背景**

Postfix 与 Dovecot 仍常被组合使用，但容器镜像和面板会隐藏传输、最终投递与邮箱访问的边界，导致运维人员把不同故障混为一谈。

**实用价值**

读者可用职责表和有序证据链区分 SMTP 未接收、队列延迟、邮箱写入失败与客户端不可见，同时避免记录邮件敏感内容，并保留可审计但已经脱敏的运行证据。

Postfix 与 Dovecot 经常安装在同一台邮件服务器上，但它们不是同一个东西。常见收件架构中，**Postfix 接收 SMTP 连接并管理邮件队列**，**Dovecot 负责最终写入邮箱，或通过 IMAP 向已认证客户端提供邮件**。其中一个服务显示正常，不代表完整收件流程正常。

本文是一张排障地图，不是可以直接复制到生产环境的配置教程。真实部署还涉及 DNS、TLS、收件人校验、反垃圾、存储权限、备份、监控和中继限制。Once Email 只接收邮件，不提供 SMTP 发信、回复、转发或群发；下文只讨论入站边界。

## [一张表看懂职责](<https://once-email.com/zh_cn/blog/corecomponent#%E4%B8%80%E5%BC%A0%E8%A1%A8%E7%9C%8B%E6%87%82%E8%81%8C%E8%B4%A3>)

| 问题 | Postfix | Dovecot |
| --- | --- | --- |
| 主要网络协议 | 接收或发送 SMTP | 通过 IMAP/POP3 提供邮箱访问，也可用 LMTP 接收最终投递 |
| 是否拥有邮件队列 | 是 | 否 |
| 是否决定 SMTP 阶段接收某个收件人 | 通常由 Postfix 及其查询、策略服务决定 | 某些架构会由 Dovecot 提供用户或邮箱资料 |
| 谁把邮件写入最终邮箱 | Postfix 可本地投递，也可交给 Dovecot LMTP | Dovecot LMTP 可执行最终邮箱投递 |
| 谁让客户端列出和读取邮件 | 不负责 | 通常由 Dovecot IMAP 负责 |

所以，“Postfix 还是 Dovecot”通常不是二选一。对托管邮箱而言，真正的问题是一个组件的责任在哪里结束，下一个组件从哪里开始。

## [跟踪一封入站邮件](<https://once-email.com/zh_cn/blog/corecomponent#%E8%B7%9F%E8%B8%AA%E4%B8%80%E5%B0%81%E5%85%A5%E7%AB%99%E9%82%AE%E4%BB%B6>)

[Postfix 官方架构说明](<https://www.postfix.org/OVERVIEW.html>) 描述了网络邮件进入 ` smtpd `、经过 cleanup 并进入队列，随后由队列管理器选择投递代理。可以把一次收件拆成四个检查点：

1. **SMTP 连接**：远端发送服务器能否连接 Postfix，并完成邮件事务。
2. **收件人接收**：Postfix 是否依据地址表和访问规则接收信封收件人。
3. **队列与交接**：已接收邮件是否进入队列，并由 local、virtual、pipe 或 LMTP 投递。
4. **邮箱访问**：最终投递后，Dovecot 是否允许已授权客户端通过 IMAP 列出并读取邮件。

SMTP 返回 ` 250 ` 不等于用户已经看见邮件。Postfix 可以先接收，随后因 LMTP、配额或存储错误将邮件保留在延迟队列。反过来，邮件可能已经写入邮箱，但 IMAP 认证、索引、命名空间或文件权限问题让客户端看不到它。

## [LMTP 如何连接两个服务](<https://once-email.com/zh_cn/blog/corecomponent#lmtp-%E5%A6%82%E4%BD%95%E8%BF%9E%E6%8E%A5%E4%B8%A4%E4%B8%AA%E6%9C%8D%E5%8A%A1>)

一种常见边界是 LMTP：Postfix 继续负责公网 SMTP 与队列，然后调用 Dovecot LMTP 完成最终投递。Dovecot 的 [Postfix 与 Dovecot LMTP 指南](<https://doc.dovecot.org/2.4.2/howto/lmtp/postfix>) 使用 Postfix spool 内的受保护 Unix socket 展示这种交接。

这个 socket 不是从教程复制一个路径就结束。所有者、组、权限、chroot 位置和服务状态共同构成安全与可靠性合同。Postfix 无法访问它时，正确现象通常是队列延迟，而不是把收件箱伪装成空。LMTP 已接收邮件后，应优先检查 Dovecot 投递、配额和存储证据，而不是继续盯着公网 SMTP。

不要为了消除权限报错把 socket 改成所有人可写。应确认哪个服务账号确实需要访问，并授予最小权限；除非架构明确要求并具备认证与传输保护，也不要把 LMTP 暴露到公网。

## [按证据定位，不要先重启两个服务](<https://once-email.com/zh_cn/blog/corecomponent#%E6%8C%89%E8%AF%81%E6%8D%AE%E5%AE%9A%E4%BD%8D%E4%B8%8D%E8%A6%81%E5%85%88%E9%87%8D%E5%90%AF%E4%B8%A4%E4%B8%AA%E6%9C%8D%E5%8A%A1>)

| 观察到的证据 | 首先检查的边界 |
| --- | --- |
| 远端无法连接 25 端口 | DNS、防火墙、TLS 监听或 Postfix ` smtpd ` |
| SMTP 在邮件正文传输前拒绝收件人 | Postfix 收件人表和策略，以及它查询的用户目录 |
| SMTP 已接收，但邮件仍在 deferred 队列 | Postfix 队列状态和选中的投递 transport |
| 日志显示 LMTP socket 不存在或权限拒绝 | Postfix 到 Dovecot 的 socket、用户和权限 |
| LMTP 报配额或邮箱写入失败 | Dovecot 投递与邮箱存储 |
| 磁盘存在邮件，但客户端列不出来 | Dovecot IMAP 认证、命名空间、索引与文件权限 |

使用唯一测试标记和有限时间窗口，保留队列 ID、SMTP 状态类别、LMTP 结果和脱敏的邮箱结果。不要把真实邮箱、验证码、Token、主题、正文、附件名或完整 URL 写进共享日志和分析平台。

## [常见分类错误](<https://once-email.com/zh_cn/blog/corecomponent#%E5%B8%B8%E8%A7%81%E5%88%86%E7%B1%BB%E9%94%99%E8%AF%AF>)

安装 Dovecot 不会自动提供公网 SMTP 监听；安装 Postfix 也不会自动给用户一个 IMAP 收件箱。SPF、DKIM、DMARC 又是另一层，它们提供域名认证与对齐证据，不负责邮箱访问。这个任务应阅读独立的 [SPF、DKIM 与 DMARC 结果指南](<https://once-email.com/zh_cn/blog/read-spf-dkim-dmarc-results>) 。

队列为空不能证明投递成功：邮件可能退信、过期、被明确策略丢弃，或已经离开队列。收件箱为空也不能证明没有来信：查询可能失败、客户端可能离线，或选择了其他邮箱命名空间。必须区分“没有结果”“临时失败”和“已确认为空”。

## [改配置前先建立四字段追踪卡](<https://once-email.com/zh_cn/blog/corecomponent#%E6%94%B9%E9%85%8D%E7%BD%AE%E5%89%8D%E5%85%88%E5%BB%BA%E7%AB%8B%E5%9B%9B%E5%AD%97%E6%AE%B5%E8%BF%BD%E8%B8%AA%E5%8D%A1>)

对一封已授权测试邮件，只记录四类脱敏事实。把它们串起来，才能证明 SMTP 接收、队列交接、最终投递和邮箱可见性是否属于同一事务：

| 检查点 | 只保留 | 能证明什么 |
| --- | --- | --- |
| SMTP 接收 | 时间、增强状态类别和缩短后的队列 ID | 证明 Postfix 接收了该事务，不等于最终投递成功 |
| 队列结果 | 同一缩短队列 ID、transport 名称及 delivered/deferred 状态 | 证明 Postfix 选择了投递通道，并完成或保留了交接 |
| LMTP 结果 | 成功或增强错误类别，不含收件人和正文 | 证明 Dovecot LMTP 接受最终投递，或返回了有限失败原因 |
| 邮箱可见性 | 测试前后邮件数量及应用读取结果 | 证明存储发生变化，并确认实际读取路径能否看见结果 |

先做只读检查。` postqueue -p ` 可列出队列，应在本机按缩短 ID 筛选，不要导出完整队列；` doveadm mailbox status -u TEST_USER "messages unseen" INBOX ` 可检查邮箱计数，但只能替换为已授权测试身份，也不要把输出贴到公开工单。[Postfix 队列工具](<https://www.postfix.org/QSHAPE_README.html>) 和 [Dovecot mailbox status 官方说明](<https://doc.dovecot.org/2.4.2/core/man/doveadm-mailbox.1.html>) 界定了这些证据的含义。若时间与脱敏事务标记没有同时对应，任何一条命令都不能证明看到的就是本次测试邮件。

## [安全的验证顺序](<https://once-email.com/zh_cn/blog/corecomponent#%E5%AE%89%E5%85%A8%E7%9A%84%E9%AA%8C%E8%AF%81%E9%A1%BA%E5%BA%8F>)

先验证公网 SMTP 端点，再投递一封已授权且带唯一标记的测试邮件；记录 Postfix 是否接收，跟踪队列与最终投递结果，确认 Dovecot 邮箱状态，最后通过应用实际使用的 IMAP 路径读取。测试结束后删除测试邮箱，只保留脱敏运行证据。

这个顺序能告诉你故障发生在哪一层。先重启两个服务会丢失时间与队列证据，把可复现故障变成偶发问题，而且仍然解释不了根因。

## 相关文章

如何阅读 Received 邮件头并还原邮件投递路径

按正确顺序阅读 Received 字段，谨慎比较时间戳，并理解主机名、IP 地址、时钟偏差与不可信追踪信息的证据边界。

[如何阅读 Received 邮件头并还原邮件投递路径](<https://once-email.com/zh_cn/blog/read-received-headers>)

临时邮箱 API 测试指南：避免等待脆弱、串信和泄露秘密

用隔离邮箱、退避轮询、精确匹配、安全日志和强制清理，构建稳定且可诊断的邮件自动化测试。

[临时邮箱 API 测试指南：避免等待脆弱、串信和泄露秘密](<https://once-email.com/zh_cn/blog/temporary-email-api-testing-guide>)

收不到验证邮件？一份安全的排查清单

依次检查地址错误、发件延迟、重试、过滤和邮箱限制，不要反复索取验证码或削弱账号安全。

[收不到验证邮件？一份安全的排查清单](<https://once-email.com/zh_cn/blog/anxiety>)

## 使用相关工具

邮件头分析器

解释邮件投递路径并汇总 SPF、DKIM、DMARC 证据，不作绝对真实性承诺。

[邮件头分析器](<https://once-email.com/zh_cn/tools/email-header-analyzer>)

[邮件附件太多？使用 UnpackFlow 在本地批量解压和整理 把附件下载到独立目录，核对浏览器保存结果，再在本地按 list、plan、run 或 start 处理分卷与嵌套压缩包。](<https://once-email.com/zh_cn/blog/batch-email-attachments-unpackflow>) [临时邮箱能用多久？在过期前做好计划 理解 Once Email 邮箱时效、删除与更换规则，判断应保存什么，以及何时必须迁移到长期恢复地址。](<https://once-email.com/zh_cn/blog/readbook>)
