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

Linux环境使用mail命令发送错误日志被作为bin附件而非正文的问题

问题根因

该问题和日志中的/字符完全无关,触发原因主要有2个:

  • 你脚本中写日志时没有给$mContent加双引号,导致日志原有的换行、制表符等格式被替换为空格,生成的临时文件格式异常,mail命令识别为非纯文本内容后自动打包为.bin附件
  • 没有显式指定邮件的内容类型和编码,当日志存在特殊控制字符时,mail会默认判定为二进制文件转为附件发送

修复后的脚本

调整点如下:

  • 所有shell变量加双引号包裹,避免特殊字符、空格导致的解析异常
  • 给mail命令添加Content-type头,强制指定内容为UTF-8编码的纯文本,避免自动识别异常
  • 优化临时文件写入逻辑,避免残留内容干扰
mContent=$(cat "$1")
msgimp="$2"
mailsub="$3"
monitor="$4"
logname="$5"
log_temp="/datapp/common/operation_admin/monitor/monitor_log/$mailsub.txt"

# 清空临时文件
> "$log_temp"
echo "" >> "$log_temp"
# 保留原有日志格式写入
echo "$mContent" >> "$log_temp"

mail -a "Content-type: text/plain; charset=utf-8" \
-s "[Prod] [$monitor] [$msgimp] [$mailsub] found in $logname log" \
-r "DBS Production Alert <noreply@*******.com>" \
alert.*********.com < "$log_temp"

rm -f "$log_temp"

可选优化建议

  • 如果你使用的是mailx版本的mail命令,可以额外添加-a "Content-Transfer-Encoding: 8bit"参数,进一步避免编码识别异常
  • 若日志中存在不可见的控制字符,可以在读取日志后先执行清洗:mContent=$(echo "$mContent" | tr -cd '\11\12\15\40-\176'),过滤无效字符后再写入临时文件
  • 可以直接将日志内容通过管道传给mail命令,省去临时文件的读写操作,逻辑更简洁:echo "$mContent" | mail -a "Content-type: text/plain; charset=utf-8" -s 标题 收件人

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:45:01