如何用Bash脚本发送压缩文件?附件为空问题求助
问题分析与解决方法
你的脚本存在三个核心问题,导致附件为空:
- 文件名不匹配:执行
zip attachmentt.zip "${temporaryDirectory}"/*生成的压缩包是attachmentt.zip,但变量ATTACHMENT错误设为attachmentt.zip.zip,邮件引用的文件名实际不存在。 - 缺少附件内容的base64编码:MIME头里声明了
Content-Transfer-Encoding:base64,但未将压缩文件内容转成base64并写入邮件数据中,这是附件为空的核心原因。 - MIME格式语法错误:
Content-Disposition字段的引号位置错误,还有多余分号,会导致邮件客户端解析异常。
修正后的完整脚本
# 递归压缩临时目录下所有文件(含子文件夹)到attachmentt.zip zip -r attachmentt.zip "${temporaryDirectory}"/* # 正确设置附件文件名 ATTACHMENT="attachmentt.zip" # 将压缩文件转成无换行的base64编码(符合MIME格式要求) ATTACHMENT_BASE64=$(base64 -w 0 "${ATTACHMENT}") # 构建符合规范的MIME邮件内容,用EOF避免转义混乱 cat > message.json << EOF { "Data": "From:${MAIL_ACCOUNT}\nTo:${recipient}\nSubject:${MAIL_SUBJECT}\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"NextPart\"\n\n--NextPart\nContent-Type: text/plain; charset=utf-8\n\n${body}\n\n--NextPart\nContent-Type: application/zip; name=\"${ATTACHMENT}\"\nContent-Description: ${ATTACHMENT}\nContent-Disposition: attachment; filename=\"${ATTACHMENT}\"\nContent-Transfer-Encoding: base64\n\n${ATTACHMENT_BASE64}\n\n--NextPart--" } EOF # 发送邮件 aws ses send-raw-email --raw-message file://message.json
关键改动说明
- 递归压缩:添加
zip -r参数,确保临时目录下的子文件夹和文件都能被压缩。 - base64编码处理:用
base64 -w 0生成无换行的编码字符串,避免MIME解析时出现格式错误。 - MIME格式修正:
- 规范
Content-Type写法,添加字符集声明确保正文显示正常。 - 修正
Content-Disposition的引号位置,正确包裹文件名。 - 添加
--NextPart--作为多部分邮件的结束标记,符合MIME标准。
- 规范
- 改用EOF写入文件:避免
echo命令处理复杂字符串时的转义问题,提升脚本可读性和稳定性。
内容的提问来源于stack exchange,提问作者Bernadette
相关产品推荐
相关产品推荐

