有时候,监控一个系统需要在系统出现警告时通过shell发送邮件来通知相关的负责人。本文讲讲如何shell发送邮件。一种是普通邮件,通过附件描述详细报告;一种是高级邮件(哈哈),本来就是告警,还不赶快看,还要慢慢下载附件打开看?所以将附件内容以HTML直接展示到正文处,并通过样式标记警告。1.安装sendEmail工具 下载、解压、配置环境变量]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz]# tar -zxf sendEmail-v1.56.tar.gz -C SendEmail/#配置环境变量这里不一样,不在profile文件里配置,而是拷贝到系统环境变量已有的路径中]# cd ~/myApp/SendEmail/]# cp sendEmail /usr/local/bin/2.开启邮箱的SMTP本文使用QQ邮件作为发送者设置 -> 账户 -> 下图中开启3.发送邮件QQ邮箱对SMTP有如下说明:#!/bin/bashRECIVER=“Wish0123@163.com"SENDER=“964478654@qq.com"SENDER_USERNAME=964478654#密码填写SMTP第三方客户端授权码SENDER_PASSWD=xuxjxankheuubcjdATTACHMENT_PATH=/root/workspace/sh/attach_test.txt#如下图描述,作为邮件发送方应填这个hostnameSTMP_HOST=smtp.qq.comMESSAGEL_SUBJECT=“Have Fun"MESSAGE_BODY=“报警啊…“sendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o message-charset=utf-8发送后报错了:******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don’t want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.******************************************************************* at /usr/local/bin/sendEmail line 1906.invalid SSL_version specified at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 444.意思是SSL版本不对,原因是在cent7中Perl的版本5.16,而应该使用更低版本。或者不用SSL,也就需要在脚本最后一行的sendEmail命令添加一个参数-o tls=nosendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o message-charset=utf-8 -o tls=no发送成功了!我擦,居然被当成诈骗钓鱼邮件。。4.HTML版邮箱直接展示html需要两个条件:一是把要展示的数据使用html标签封装起来,就可以随意增加样式了;二是在sendEmail增加参数-o message-content-type=html这里是根据系统内存情况发送系统邮件,当集群中机器的使用内存超过总内存80%的机器信息标红。[root@NN1 sh]# cat memory_info ip consum free total192.168.1.10 100 100 200192.168.1.11 1 239 240192.168.1.12 350 50 400192.168.1.13 40 24 64192.168.1.14 77 33 110192.168.1.15 150 250 400编写脚本#!/bin/bash -xRECIVER=“Wish0123@163.com"SENDER=“964478654@qq.com"SENDER_USERNAME=964478654#密码填写SMTP第三方客户端授权码SENDER_PASSWD=xuxjxankheuubcjdSTMP_HOST=smtp.qq.comMESSAGEL_SUBJECT=“Have Fun"HTML_PATH=html_pathecho “<table>">$HTML_PATHecho “<thead><th>ip</th><th>consum</th><th>free</th><th>total</th></thead>">>$HTML_PATHecho “<tbody>">>$HTML_PATHcreate_tr() { i=2 lines=$(cat memory_info | wc -l) while [ $i -le $lines ] do j=1 ip=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” m=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” f=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” t=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) tr="<tr>” #shell不能直接作小数运算 #更简单的运算写法是$[$m + 5] if [ $(expr $m * 5) -gt $(expr $t * 4) ]; then tr="<tr style="background-color:red">” fi echo $tr>>$HTML_PATH echo “<td>"$ip”</td>">>$HTML_PATH echo “<td>"$m”</td>">>$HTML_PATH echo “<td>"$f”</td>">>$HTML_PATH echo “<td>"$t”</td>">>$HTML_PATH echo “</tr>">>$HTML_PATH let “i++” done}create_trecho “</tbody>">>$HTML_PATHecho “</table>">>$HTML_PATHMESSAGE_BODY=$(cat $HTML_PATH)sendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o tls=no message-charset=utf-8 message-content-type=html发送成功!参考文章:https://blog.csdn.net/leshami…https://my.oschina.net/u/4005...https://blog.csdn.net/wz94732…