"552 5.2.3 Message too large" 错误如何调整大小限制?
发件时收到"552 5.2.3 Message too large"退信,但附件明明不大,是什么原因?如何调整限制?
552 5.2.3 Message too large 是 SMTP 协议定义的永久性失败响应码,表示邮件总大小超过了收件方服务器的接收限制。即使附件本地显示较小,实际邮件大小可能远大于预期。
1. 为什么附件看起来小但邮件大小大得多?
核心原因在于 MIME Base64 编码。邮件的附件通过 MIME 编码传输,Base64 编码会使原始二进制数据膨胀约 37%(每 3 字节编码为 4 字节)。更关键的是:
- 一封带 10MB 附件的邮件,MIME 编码后实际 SMTP 传输大小约为 13.5~14MB;
- 若邮件包含 HTML 和纯文本双版本(multipart/alternative)+ 编码后的附件,总大小进一步增加;
- 邮件头部(header + 边界标记等)通常占几 KB 至几十 KB。
2. Postfix 相关配置参数
Postfix 通过以下参数控制邮件大小:
# 整个邮件(含所有附件)的最大字节数,默认 10240000(约 10MB)
message_size_limit = 25600000
# 单封邮件 SMTP 传输中各缓冲区的最大尺寸
line_length_limit = 2048
# 邮件头部允许的最大行数(超过则拒绝收信)
header_size_limit = 102400
修改 main.cf 后执行 postfix reload 生效。
3. 其他层级的限制
除了发送方 MTA 的限制,还需要检查:
- 收件方 MTA:对方服务器的
message_size_limit也可能更小——这是退信的常见原因; - Dovecot LDA:如果使用 Dovecot 作为 MDA,Dovecot 的
plugin { quota_max_mail_size }会限制单封邮件大小,超过此值的邮件会被退回; - Reverse Proxy / Mail Gateway:如果经过邮件安全网关,网关的 HTTP Body Size 或 Receive Buffer 限制也会造成 552。
4. 协议层面的协商机制(RFC 1870)
ESMTP 的 SIZE 扩展(RFC 1870)使得发送方在发信前即可了解对方允许的最大邮件尺寸。Postfix 在 EHLO 响应中声明:
250-SIZE 25600000
发送方(如 Gmail)看到此声明后,如果准备发送的邮件超过此值,会直接在发件端拒绝,而不是发出后等待退信,节省了带宽和队列资源。
5. 建议的最佳实践
对大多数企业邮件系统,建议将 message_size_limit 设置为 25MB~30MB(对应附件约 20MB),并配合邮件安全网关的附件大小白名单策略使用。如有超大附件传输需求,推荐使用网盘分享链接替代邮件附件。
参考来源:RFC 1870 — SMTP Service Extension for Message Size Declaration · Postfix message_size_limit 文档
