You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

关键改动说明

  1. 递归压缩:添加zip -r参数,确保临时目录下的子文件夹和文件都能被压缩。
  2. base64编码处理:用base64 -w 0生成无换行的编码字符串,避免MIME解析时出现格式错误。
  3. MIME格式修正:
    • 规范Content-Type写法,添加字符集声明确保正文显示正常。
    • 修正Content-Disposition的引号位置,正确包裹文件名。
    • 添加--NextPart--作为多部分邮件的结束标记,符合MIME标准。
  4. 改用EOF写入文件:避免echo命令处理复杂字符串时的转义问题,提升脚本可读性和稳定性。

内容的提问来源于stack exchange,提问作者Bernadette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:50:23