AWS SES SendRawEmail报Missing required header 'To':Mac正常CI及Linux异常求解决
AWS SES SendRawEmail报错"Missing required header 'To'":Mac正常但Linux/CI失败的解决思路
问题场景
编写了用于内部构建流程发邮件的脚本,在Mac本地运行完全正常,但部署到CI环境或Linux服务器上执行时,调用AWS SES的SendRawEmail操作抛出错误:
An error occurred (InvalidParameterValue) when calling the SendRawEmail operation: Missing required header 'To'.
核心原因
Mac系统默认换行符是CR(\r),而Linux/CI环境默认是LF(\n),但邮件标准要求邮件头必须用CRLF(\r\n)作为换行分隔符。脚本在生成原始邮件内容时,若依赖系统默认换行符,会导致Linux环境下生成的邮件头格式不符合标准,AWS SES无法正确解析出To头。
解决方案
1. 强制使用CRLF构建邮件内容
在脚本拼接邮件头和正文时,明确指定用\r\n作为换行符,不依赖系统默认设置。以Python为例:
# 构建符合标准的原始邮件内容 raw_email_content = ( f"To: {recipient_email}\r\n" f"From: {sender_email}\r\n" f"Subject: Build Notification\r\n" "\r\n" # 邮件头与正文的分隔线 f"Build completed with status: {build_status}\r\n" )
2. 处理模板文件的换行符
如果是从文件读取邮件模板,读取后统一将换行符替换为CRLF:
with open("email_template.txt", "r", encoding="utf-8") as template_file: template_content = template_file.read().replace("\n", "\r\n") # 替换模板变量后直接使用 final_email = template_content.format(recipient="xxx", status="success")
3. 验证原始邮件格式
在Linux环境下生成邮件内容后,可通过打印或写入文件检查格式,确保每一行邮件头都以\r\n结尾,避免出现纯LF的情况。
内容的提问来源于stack exchange,提问作者darrin
相关产品推荐
相关产品推荐

