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
相关产品推荐
相关产品推荐

