Linux渠道mailx发邮件忽然呈现附件ATT00001.bin的状况总结
现象描绘
最近发现咱们监控作业偶然会宣布带有附件ATT00001.bin的邮件,而大部分时分,它都宣布带有内容的邮件,以脚本mysql_slowlog_monitor.sh来说, 平常会将慢查询剖析陈述放在邮件的正文发给DBA,慢查询剖析陈述的内容放在邮件中,呈现问题的时分,邮件正文没有内容,它只要 一个附件ATT00001.bin
function send_slow_rpt(){
$PT_QUERY_DIGEST --since=$HOURS $SLOW_LOG_FILE > $ANALYSIS_RPT_FILE
rpt_exist_data=`cat $ANALYSIS_RPT_FILE | wc -l `
if [ $rpt_exist_data -gt 2 ]; then
MAIL_SUBJECT="MySQL slow log report on the `hostname` ($SERVER_IP) at $SLOW_RPT_DATE"
mailx -s "${MAIL_SUBJECT}" -r ${MAIL_FROM} ${MAIL_TO} < ${ANALYSIS_RPT_FILE}
fi
}
原因剖析:
剖析后发现原因:pt-query-digest生成的慢查询剖析报表,有些SQL句子里边包括了特别字符^M,它导致mail将运用回车符 (^M, \r) 字符的 非 Unix 文本文件将被视为二进制数据。所以mailx将将其当作附件发送出来,详细请见下面英文,更多详细信息参阅参阅资料[1]
Mailx expects input text to be in Unix format, with lines separated by newline (^J, \n) characters only. Non-Unix text files that use carriage return (^M, \r) characters in addition will be treated as binary data; to send such files as text, strip these characters e. g. by tr -d '\015'
Mailx will, if it encounters unknown / control characters in text input, convert it into an attachment with application/octet-stream mime-type set.
文本文件中一起包括回车符和换行符(即Windows风格的文本文件),mailx会将其视为二进制数据,从而将邮件正文作为附件发送,而不是将其作为邮件正文内容。 Mailx 会将其转换为设置了 application/octet-stream mime 类型的附件。
解决方案
解决方案便是这些特别字符(^M, \r)置换,鉴于此处特别状况,咱们运用指令dos2unix将文本内容格局直接从Windows替换成Unix格局。简略高效。
function send_slow_rpt(){
$PT_QUERY_DIGEST --since=$HOURS $SLOW_LOG_FILE > $ANALYSIS_RPT_FILE
rpt_exist_data=`cat $ANALYSIS_RPT_FILE | wc -l `
if [ $rpt_exist_data -gt 2 ]; then
# 有些状况,mysql慢查询报表中会呈现特别字符(例如^M),导致邮件内容变成附件ATT00001.bin
if [ -x /usr/bin/dos2unix ];then
/usr/bin/dos2unix -k $ANALYSIS_RPT_FILE
fi
MAIL_SUBJECT="MySQL slow log report on `hostname` ($SERVER_IP) at $SLOW_RPT_DATE"
mailx -s "${MAIL_SUBJECT}" -r ${MAIL_FROM} ${MAIL_TO} < ${ANALYSIS_RPT_FILE}
fi
}
参阅资料
[1] 1: https://access.redhat.com/solutions/2210791