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文件比把内容存在变量里更稳妥,避免特殊字符转义或内容截断的问题。
额外排查建议
- 检查Zip文件权限:确保脚本有读取权限,执行
ls -l your_target.zip查看,权限不足的话用chmod +r your_target.zip调整。 - 测试邮件结构:可以把邮件内容输出到文件(把
| sendmail -t改成> test_mail.txt),打开文件检查边界、编码后的附件内容是否正常。 - 确认sendmail可用:有些系统默认用
mailx或mutt,如果sendmail不可用,需要调整发送命令,但核心的MIME构造逻辑是通用的。
内容的提问来源于stack exchange,提问作者Harman international
相关产品推荐
相关产品推荐

