Bash 脚本电子邮件不会忽略输出中的 html 部分

Bash 脚本电子邮件不会忽略输出中的 html 部分

LE。我杀掉了所有与 html 相关的东西。声明了 2 个变量 R 和 G(代表红色和绿色)。

我的邮件显示状态[0;32mGLOBAL_STATUS = 确定,明显不是颜色。

如果我评论我在电子邮件中收到的变量 GLOBAL_STATUS = OK -> 无颜色。

漂亮,请帮我接收带有绿色 GLOBAL_STATUS = OK 的邮件


我编写了这部分代码,但它没有打印在我应该收到的电子邮件中:GLOBAL_STATUS = OK(绿色)☹

它显示在电子邮件顶部:<h1> <span style='color:green;'> GLOBAL_STATUS = OK </span></h1><br/><br/><br/>

在电子邮件的末尾:<html> <body> <br><br><br> </body> </html>

我究竟做错了什么?我试图消除 html、正文等部分,但邮件的开头仍然是相同的:<h1> <span style='color:green;'> GLOBAL_STATUS = OK </span></h1><br/><br/><br/>

#echo "<html> ">>$LOG
#echo "<body>" >> $LOG
#echo "<br><br><br>" >> $LOG
#echo "<br><br><br>" >> $LOG
R='\033[0;31m'
G='\033[0;32m'
content="tmp.txt"
global_status=0
while read line; do
   if [[ "$line" == *"KO"* && "$global_status" == "0" ]]; then
         echo -e "\n\n\n $line";
         ((global_status=!global_status));
         echo -e "\n $global_status"
   fi
   echo "$line" >> $content
done < $LOG

#echo "<h1>" > $LOG
if [ "$global_status" -eq 0 ]; then
     echo -e "${G}GLOBAL_STATUS = OK" > $LOG
else 
     echo -e "${R}GLOBAL_STATUS = KO" > $LOG
fi
cat $content >> $LOG
rm tmp.txt
#echo "</body>" >> $LOG
#echo "</html>" >> $LOG
mail -s "Check Back" [email protected] < /home/check_back.log

答案1

重点关注这一点:

漂亮,请帮我接收带有绿色 GLOBAL_STATUS = OK 的邮件

您可能遇到的问题之一可能是Content-type标题。如果它将消息标记为纯文本 ( text/plain),则很可能会这样显示。您需要更改标头以将类型标记为text/html

例如,使用mailDebianbsd-mailx软件包中的命令,至少可以像 Gmail 接收到的那样工作。

#!/bin/sh

[email protected]
mail -s "colortest" -a 'Content-Type: text/html; charset="UTF-8"' "$emailaddr" << EOF
<html>

<h1> <span style='color:green;'>  GLOBAL_STATUS = OK </span></h1>
</h1>
<p>
Blah blah...
</p>

</html>
EOF

至少这个特定版本将mail内容类型设置为text/plain默认值,除非被覆盖。请参阅手册页有关-aMIME 标头的注释。

注意该工具的其他版本mail可能会有所不同,他们可能有不同的设置标题的方法。我也根本没有检查 HTML 语法:您可能想要实际检查要使用的正确 DOCTYPE 等。Content-Transfer-Encoding如果您在消息中使用非 ASCII 字符,您可能还需要检查编码(标头)。

text/plain另外,为了正确执行此操作,您可能应该生成包含和变体的多部分 MIME 消息text/html。我也不打算去那里。

至于该代码,如果您只是从输入文件中查找字符串KO,并完整地传递文件,则可以使用grep而不是 shell 循环。也许是这个方向的事情(未经测试):

#!/bin/sh

[email protected]
status=XXX
color=xxx
subject=test
inputfile=foo.txt
msgfile=$(mktemp)
if grep -qe KO "$inputfile"; then
    status='GLOBAL_STATUS = KO'
    color=red
else
    status='GLOBAL_STATUS = OK'
    color=green
fi

> "$msgfile"
cat <<EOF >> "$msgfile" 
<html>
<h1><span style='color:$color;'> $status </span></h1>
</h1>
<pre>
EOF
cat "$inputfile" >> "$msgfile"
cat <<EOF >> "$msgfile" 
</pre>
</html>
EOF

mail -s "$subject" -a 'Content-Type: text/html; charset="UTF-8"' \
    "$emailaddr" < "$msgfile"

rm -f "$msgfile"

答案2

因此,我在此脚本中的最后一步是比较服务器的日期并将它们与今天的日期进行比较。如果一台服务器的日期不是今天的日期 DATE = KO。

尝试过这个:

LOG="/home/check_back.log"
date="date +%d-%m-%y -r"
datemail=$(date "+%d-%m-%y")
>LOG

For each server the date is read and printed in the email with: 
echo " " && $date /tmp/check_back.log"  >>$LOG

if [[ $date -lt $datemail ]]; then
    check_date='DATE = KO'
    color='red'
fi

我收到错误:[[date +%d-%m-%y -r: 未找到命令。我认为我的代码没有读取每个服务器的日期,但我不知道该怎么做。有人可以帮忙吗?先谢谢您的帮助。

相关内容