UNIX/Linux:使用mail命令进行Shell脚本编写

时间:2020-01-09 10:42:05  来源:igfitidea点击:

如何从包含文件附件的Shell脚本发送电子邮件?
最简单的解决方案是从shell脚本中通过mail命令发送电子邮件,如下所示。
要向一个或者多个人发送消息,可以使用参数(这些参数是要向其发送消息的人的名字)来调用邮件:

mail -s 'subject' username
mail -s 'subject' [email protected]
mail -s 'Duplicate ip detected' -c [email protected]  [email protected] </var/log/ipscan.log
mail -s 'yum update failed' -c [email protected] -b  [email protected] </var/log/yum.log
mail -s 'Disk failure'  [email protected] < /tmp/message

其中:

  • -s word1 word2:在命令行上指定主题。
  • -c:将复本发送到用户列表。
  • -b:发送盲目抄送至列表。 List应该是逗号分隔的名称列表。
  • > /path/to/file:使用此/path/to/file读取电子邮件正文。

方法1:发送文件附件

mail命令将不起作用。
您需要使用uuencode命令发送一个名为reports.tar.gz的二进制文件:

uuencode reports.tar.gz reports.tar.gz | mail -s "Weekly Reports for $(date)" [email protected]

您可以使用相同的格式通过电子邮件发送镜像或者任何文件:

uuencode file1.png file1.png | mail -s "Funny" [email protected]

方法2:使用mutt命令进行文件附件

mutt是MUA(邮件用户代理),是基于文本会话的电子邮件客户端。
它可用于在unix之类的操作系统下阅读电子邮件,包括支持彩色终端,MIME(附件)和线程排序模式。
您可以按以下方式使用mutt命令发送电子邮件附件:

mutt -s "Filewall logs" -a /tmp/fw.logs.gz [email protected] < /tmp/emailmessage.txt

技巧1:空邮件正文

要将空行用作邮件正文,请使用特殊文件/dev/null或者echo命令,如下所示:

echo | mutt -s 'Subject' -a attachment.tar.gz [email protected]
mutt -s 'Subject' -a attachment.tar.gz [email protected] </dev/null
mail -s "Disk failed @ $(hostname)" [email protected] </dev/null

技巧2:使用"Here"文档编写邮件正文

此处的文档(重定向)告诉shell程序从当前源(HERE)读取输入,直到看到仅包含单词(HERE)的行:

#!/bin/bash
...
....
mail -s "Disk Failed" [email protected]<<EOF
NAS server [ mounted at $(hostname) ] is running out of disk space!!!
Current allocation ${_SPACE} @ $(date)
EOF
...
..

技巧3:根据条件发送邮件

使用if else if和命令的退出状态,如下所示:

[ $(grep -c -i "hardware error" /var/log/mcelog) -gt 0 ] && { echo "Hardware errors found on $(hostname) @ $(date). See log file for the details /var/log/mcelog." | mail -s "HW Errors" [email protected] ;}

或者

#!/bin/bash
....
.....
# backup dirs using gnu/tar
/usr/bin/tar --exclude "*/proc/*" --exclude "*/dev/*" --exclude '*/cache/*' -zcvf /nas05/backup.tar.gz /var/www/html /home/Hyman
 
# send an email if backup failed
if [ $? -ne 0 ] 
then
/usr/bin/mail -s "GNU/TAR Backup Failed" [email protected]<<EOF
GNU/Tar backup failed @ $(date) for $(hostname)
EOF
else
/usr/bin/logger "Backup done"        
fi
....
..
# clean up
rm $_filename