AWS SES使用sendRawEmail报InvalidParameterValue非法字符错误求助
核心问题本质
很多人从sendEmail切到sendRawEmail都会踩这个坑,两个接口的校验逻辑完全不是一套:
- 用
sendEmail时,SDK会自动帮你把传入的发件人地址做规范封装:自动匹配RFC格式、过滤隐形非法字符、补全必要的转义符,哪怕你传的地址有小的格式瑕疵,SDK都会修正后再提交给SES - 用
sendRawEmail时,SDK完全不做任何内容修正,你传入的Base64编码原始MIME报文会被原封不动提交给SES逐字符校验,哪怕报文里混了一个肉眼根本看不到的非法字符,都会直接触发校验失败。
这里绝大多数人的共性误区是:单独给接口入参的
Source参数做Punycode编码完全无效。sendRawEmail场景下,SES逐字符校验发件人合法性的依据,是你自己拼接在RawMessage.Data对应的原始MIME报文里的From:头字段;独立传入的Source参数仅作为信封发件人用于退信路由,不参与MIME头的字符校验流程。你之前给Source编码不生效,本质是改错了校验对象。
可落地排查&解决步骤
- 先把你传给
RawMessage.Data的Base64字符串解码,逐字符检查From:头行的内容:- 重点排查动态拼接逻辑容易混入的不可见字符:零宽空格、全角空格、多余的Windows回车符、换行残留,哪怕这些字符在地址的最开头或最末尾,都会被SES判定为本地地址段的非法内容
- 排查格式偏差:不要在地址外层使用全角尖括号,也不要在拼接时漏写半角分隔符;如果需要附带发件人显示名,必须严格遵循RFC格式写为
From: "Scott" <scott@address.com>,所有引号、尖括号必须是半角ASCII字符
- 纠正Punycode的使用位置:如果确实存在Unicode域名,Punycode编码需要替换原始MIME报文
From:头里的域名部分,不是修改独立传入的Source参数值,否则编码操作完全不触发校验逻辑 - 做最小化复现测试:用硬编码、无动态拼接的纯ASCII MIME报文做测试,示例报文格式如下:
将上述内容做连续无折行的标准Base64编码后传入From: scott@address.com To: your-verified-recipient@example.com Subject: raw email test Content-Type: text/plain; charset=UTF-8 Test raw email contentRawMessage.Data,搭配与From头完全一致的Source参数提交测试。如果该报文可以正常发送,即可确定问题出在你原有的MIME报文动态拼接逻辑中——90%的同类报错都是拼接时混入了不可见字符、或是Base64编码时对报文做了非要求的折行处理,导致From头被拆分到两行被SES误判 - 排查SDK版本兼容问题:如果使用的是v3版本AWS JS SDK,尽量不要手动拼接MIME报文,可使用SDK配套的MIME构造工具生成标准格式的原始报文,避免手动拼接导致的格式偏差
内容的提问来源于stack exchange,提问作者Scott Hillson
相关产品推荐
相关产品推荐

