在做一些Linux的shell脚本监控时,经常会遇到要利用sendmail命令发送各种监控数据的邮件,通常我们可以利用shell脚本把结果成html代码,这样发送到邮件里就更直观的去看监控数据了。

       这里写一个简单的案例:

       把监控数据写入一个文件中,例如mail.txt,在文件的的最前部分加入以下内容

  1. From: Admin <admin@test.com>
  2. To: Luxiaok <luxiaok@abc.com>
  3. Content-type: text/html;charset=UTF-8 
  4. Subject: Alter Mail
  5. <table bgcolor=red><tr><td>Warning:VPS seems shut down</td></tr> 
  6. <tr><td>IP address: 

      上面代码的意思就不解释了(From和To字段可以直接写邮件地址,可以不用加发件人名字Admin,当然尖括号也就不需要了),我这里是做了一个服务器是否在线的监控(代码就省略了,重点讲sendmail),然后再把监控数据写入到上面代码的下面就可以了,然后再做一个收尾工作:

  1. echo "</td></tr></table>" >> mail.txt

      最后就可以发送了:

  1. cat mail.txt | sendmail -t 

      可以去尝试一下,当然要记得启动sendmail服务呀,否则邮件是发送不出去的。

2013年3月8日补充:

在Shell终端发送含有中文收件人名称、中文发件人名称以及中文标题的邮件

可以直接在From,To,Subject中写中文,这在腾讯、163邮箱系统是可以正常识别出来的,新浪识别出来为乱码,当然邮件内容不会乱码。

来看看怎么解决,看一个脚本内容:

  1. sendmail -t << EOF 
  2. From: =?UTF-8?B?566h55CG5ZGY?= <webmaster@luxiaok.com> 
  3. To: =?UTF-8?B?6ZmG5bCPSw==?= <me@luxiaok.com> 
  4. Content-type: text/html;charset=utf-8 
  5. Subject: =?UTF-8?B?5rWL6K+V6YKu5Lu2?= 
  6. <table bgcolor=red><tr><td>这是一封测试邮件</td></tr> 
  7. <tr><td>测试,Test! 
  8. </td></tr></table> 
  9. EOF 

执行这个脚本,看看效果:

可以从上图看出来,主题、发件人、收件人、内容都正常显示了中文,新浪的测试就不给图了。

解释下代码的含义:

可以看到在From、To、Subject三个字段的中文都进行了特殊处理,都是以=?UTF-8?B?开头,以?=结束,而在这两者之间的内容就是中文,进行了转码,可以到这个网站进行转换和查询:

http://www.base64encode.org/

这样进行了转码之后,就在新浪、QQ、以及网易163邮箱能正常显示中文了。注意只是特殊处理了From,To,Subject三个字段的内容,而主题内容的内容是不会乱码,并且上面的代码里也指定了邮件内容的编码为UTF-8,建议这样指定。