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

作者:潇湘隐者原文地址:https://www.cnblogs.com/kerrycode/p/18569702

%s 个评论

要回复文章请先登录注册