调用AWS SES发邮件报InvalidParameterValue: Invalid Base64 stream错误
报错根因
你遇到的InvalidParameterValue: Invalid Base64 stream报错由以下几个问题共同导致:
- 附件传入的不是合法纯Base64字符串:你直接把Data URL格式的图片字符串填进去了,开头的
data:image/png;base64,是Data URI的协议前缀,不属于Base64编码内容本身,SES解析时会把这段前缀计入Base64流,直接判定编码非法。 - MIME结构配置错误:
- 带附件的邮件顶层
Content-Type不能用multipart/alternative,这个类型仅用来承载纯文本、HTML两种互斥的正文备选内容,要同时包含正文+附件必须使用multipart/mixed类型 - 附件的
Content-Type配置错误:你传输的是图片文件,却配置成了text/plain类型,和实际文件格式不匹配;另外你写的附件名是test.jpeg,但实际Base64内容是PNG格式,存在格式不匹配问题
- 带附件的邮件顶层
- 潜在兼容问题:MIME规范要求Base64编码的传输内容每行长度不超过76字符,整段长Base64不折行可能触发解析异常。
修复步骤
- 先清洗Base64字符串,移除Data URI前缀,同时按规范折行:
// 从Data URL中提取纯Base64内容 const rawBase64Str = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII="; const pureAttachmentBase64 = rawBase64Str.replace(/^data:image\/\w+;base64,/, ''); // 按76字符每行折行Base64内容,符合MIME规范 const foldedBase64 = pureAttachmentBase64.match(/.{1,76}/g).join('\n');
- 修正MIME结构,调整Content-Type配置,核心代码如下:
const boundary = `----=_Part${Math.random().toString().substr(2)}`; const rawMessage = [ `From: ${"johndoe@support.com"}`, `To: ${"lorem@ipsum.com"}`, `Subject: ${"template.SubjectPart"}`, `MIME-Version: 1.0`, `Date: ${this.formatDate(date)}`, // 顶层类型改为multipart/mixed承载正文+附件 `Content-Type: multipart/mixed; boundary="${boundary}"`, `\n`, `--${boundary}`, // 正文部分嵌套multipart/alternative兼容纯文本/HTML客户端 `Content-Type: multipart/alternative; boundary="${boundary}-body"`, `\n`, `--${boundary}-body`, `Content-Type: text/plain; charset=UTF-8`, `Content-Transfer-Encoding: 7bit`, `\n`, "template.TextPart", `--${boundary}-body`, `Content-Type: text/html; charset=UTF-8`, `Content-Transfer-Encoding: 7bit`, `\n`, "<h1> Thanks for reaching me out </h1>", `\n`, `--${boundary}-body--`, `\n`, `--${boundary}`, // 附件Content-Type改为对应图片格式,文件名和格式匹配 `Content-Type: image/png; name="test.png"`, `Content-Description: test.png`, `Content-Disposition: attachment;filename="test.png";`, `creation-date="${this.formatDate(date)}"`, `Content-Transfer-Encoding: base64`, `\n`, foldedBase64, // 传入折行后的纯Base64内容 `\n`, `--${boundary}--`, ]; const mailParams: SES.Types.SendRawEmailRequest = { Source: `${companyName} <${alias}>`, Destinations: [toEmail], RawMessage : { Data: rawMessage.join('\n'), }, }; // 后续发送逻辑保持不变即可
注意:如果确定不需要兼容纯文本邮件客户端,也可以不嵌套
multipart/alternative层,直接在multipart/mixed下放HTML正文和附件,不影响发送。
内容的提问来源于stack exchange,提问作者Anas Arshad
相关产品推荐
相关产品推荐

