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

Shell脚本发带HTML正文和附件邮件:空Zip附件问题求助

解决Shell脚本发送邮件时Zip附件为空的问题

看起来你踩了MIME邮件格式的常见坑——你的脚本只处理了邮件头和HTML正文,完全没正确处理Zip附件的读取与编码逻辑,导致收件端拿到的附件是空的。我帮你修正一下脚本,同时解释关键要点:

修正后的完整脚本示例

#!/bin/bash

# 配置邮件相关参数
TO="xyz@abc.com"
SUBJECT="QC Count failed report Please find Attachment."
HTML_BODY_FILE="test.html"
ZIP_ATTACHMENT="your_target.zip"  # 替换成你的实际Zip文件路径
MIME_BOUNDARY="B835649000072104Jul07"

# 构造并发送邮件
(
    # 邮件头部分
    echo "To: $TO"
    echo "Subject: $SUBJECT"
    echo "MIME-Version: 1.0"
    echo "Content-Type: multipart/mixed; boundary=\"$MIME_BOUNDARY\""
    echo ""  # 这里必须空一行!分隔邮件头和MIME内容块

    # 第一块:HTML正文
    echo "--$MIME_BOUNDARY"
    echo "Content-Type: text/html; charset=utf-8"
    echo "Content-Transfer-Encoding: 7bit"
    echo ""  # 空行分隔块头与内容
    cat "$HTML_BODY_FILE"  # 直接读取HTML文件,比存变量更可靠

    # 第二块:Zip附件(核心修复点)
    echo ""
    echo "--$MIME_BOUNDARY"
    echo "Content-Type: application/zip; name=\"$(basename "$ZIP_ATTACHMENT")\""
    echo "Content-Disposition: attachment; filename=\"$(basename "$ZIP_ATTACHMENT")\""
    echo "Content-Transfer-Encoding: base64"
    echo ""  # 空行分隔块头与编码内容
    base64 "$ZIP_ATTACHMENT"  # 对Zip文件做base64编码,二进制文件必须这么处理
    echo ""

    # 结束MIME多部分结构,必须加--
    echo "--$MIME_BOUNDARY--"
) | sendmail -t

关键修复点解释

  • 必须的空行分隔:邮件头和MIME内容块之间、每个MIME块的头与内容之间,都需要空行,否则邮件客户端会解析失败,这是很多人忽略的细节。
  • 附件的base64编码:Zip是二进制文件,不能直接明文插入邮件,base64命令会把它转换成文本格式,确保内容完整传递。
  • 正确的MIME边界:每个内容块开头用--边界字符串,结尾必须用--边界字符串--,缺少结尾的--会导致部分内容被截断。
  • 直接读取文件:用cat读取HTML文件比把内容存在变量里更稳妥,避免特殊字符转义或内容截断的问题。

额外排查建议

  1. 检查Zip文件权限:确保脚本有读取权限,执行ls -l your_target.zip查看,权限不足的话用chmod +r your_target.zip调整。
  2. 测试邮件结构:可以把邮件内容输出到文件(把| sendmail -t改成> test_mail.txt),打开文件检查边界、编码后的附件内容是否正常。
  3. 确认sendmail可用:有些系统默认用mailx或mutt,如果sendmail不可用,需要调整发送命令,但核心的MIME构造逻辑是通用的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:34:24