Postfix发送邮件出现554错误(charset=<NULL>)的原因及配置调整咨询
看起来你在Ubuntu 22.04上搭了Virtualmin+Postfix 3.6.4,对接Amazon SES发邮件时碰到了这个棘手的charset空值问题——SES直接返回554错误,说参数里的charset=是空的,确实挺闹心的。先把你碰到的错误和邮件内容贴出来方便大家参考:
host email-smtp.us-west-2.amazonaws.com[44.225.148.59]
said: 554 Transaction failed: In parameter list <;; charset=>, expected
parameter value, got "null" (in reply to end of DATA command)
你提到的邮件源码片段也能明确看到问题所在,纯文本部分的charset字段是空的:
This is a multi-part message in MIME format.
--bound1714185094
Content-Type: multipart/alternative; boundary="altsbound1714185094"
Content-Transfer-Encoding: 7bit
--altsbound1714185094
Content-Type: text/plain; charset=
Content-Transfer-Encoding: 7bit
no message
--altsbound1714185094
Content-Type: text/html; ch...
下面给你几个排查和调整的方向,都是实际运维里常见的解决思路:
先查Virtualmin的邮件模板配置:毕竟你的邮件是Virtualmin生成的,大概率是模板里的Content-Type头没填charset值。进入Virtualmin后台,找到对应虚拟服务器的「Edit Mail Templates」(或者全局的服务器模板),检查默认的纯文本、HTML邮件模板里,Content-Type是不是写的
text/plain; charset=utf-8,而不是只写text/plain; charset=。如果是空的,手动补上utf-8或者其他你需要的编码。配置Postfix的默认charset参数:Postfix本身有个
default_charset参数,可以给所有没指定charset的邮件自动补上默认值。操作步骤如下:# 编辑Postfix主配置文件 sudo nano /etc/postfix/main.cf # 添加或修改这一行(如果已经存在就改值) default_charset = utf-8 # 重启Postfix生效 sudo systemctl restart postfix这个参数会强制给MIME部分没指定charset的内容加上utf-8编码,刚好能解决你现在的空值问题。
检查Virtualmin的Postfix集成设置:Virtualmin有时候会覆盖Postfix的部分配置,你可以去「System Settings -> Server Templates -> Default Settings -> Mail for Domain」里看看,有没有关于邮件编码的选项,确保开启了强制设置charset的功能,或者直接指定默认编码为utf-8。
排查测试邮件的发送方式:如果你是用Virtualmin自带的测试邮件功能,或者手动用
sendmail/mail命令发的测试邮件,看看测试内容有没有正确指定Content-Type头。比如手动发邮件时,要确保头信息里带charset=utf-8,避免生成空的charset字段。
调整完之后,先给自己发一封测试邮件,查看邮件的源码,确认text/plain和text/html部分的charset都有有效值了,再去对接Amazon SES测试,应该就能绕过这个554错误了。
备注:内容来源于stack exchange,提问作者wayanr

