UNIX / Linux:使用 mail 命令编写 Shell 脚本
如何从 shell 脚本发送包含文件附件的电子邮件?
最简单的解决方案是从 shell 脚本中发送电子邮件,即 mail 命令,如下所示。要向一人或多人发送消息,可以使用参数调用 mail,这些参数是要向其发送邮件的人员的姓名:
mail -s 'subject' username mail -s 'subject' vivek@example.net.in mail -s 'Duplicate ip detected' -c vivek@example.net.in ipadmin@example.net.in </var/log/ipscan.log mail -s 'yum update failed' -c vivek@example.net.in -b sysadins@groups.example.net.in </var/log/yum.log mail -s 'Disk failure' vivek@example.net.in < /tmp/message
在哪里,
- -s ‘word1 word2’:在命令行上指定主题。
- -c:将副本发送给用户列表。
- -b:将密件抄送至列表。列表应为以逗号分隔的名称列表。
- < /path/to/file:使用此 /path/to/file 读取电子邮件正文。
方法一:发送文件附件
mail 命令不起作用。您需要使用uuencode 命令发送一个名为 reports.tar.gz 的二进制文件:
uuencode reports.tar.gz reports.tar.gz | mail -s "Weekly Reports for $(date)" admin@groups.mgmt.example.net.in
您可以使用相同的格式通过电子邮件发送图像或任何文件:
uuencode filexfcolrxrvkjutidsbhbcqexuvunyawhv.png filexfcolrxrvkjutidsbhbcqexuvunyawhv.png | mail -s "Funny" users@groups.example.net.in
方法 #2:使用 mutt 命令添加文件附件
mutt 是一个 MUA(邮件用户代理)——一个基于文本会话的电子邮件客户端。它可用于在类 UNIX 操作系统下阅读电子邮件,包括支持彩色终端、MIME(附件)和线程排序模式。您可以使用mutt 命令发送电子邮件附件,如下所示:
mutt -s "Filewall logs" -a /tmp/fw.logs.gz vivek@example.net.in < /tmp/emailmessage.txt
提示 # 1:清空邮件正文
要使用空行作为邮件正文,请使用特殊文件 /dev/null 或 echo 命令,如下所示:
echo | mutt -s 'Subject' -a attachment.tar.gz vivek@example.net.in mutt -s 'Subject' -a attachment.tar.gz vivek@example.net.in </dev/null mail -s "Disk failed @ $(hostname)" mobilenumber@services.api.example.net.in </dev/null
提示 #2:使用此处的文档撰写邮件正文
此处的文档(重定向)告诉 shell 从当前源(HERE)读取输入,直到看到仅包含单词 (HERE) 的行:
#!/bin/bash ... .... mail -s "Disk Failed" vivek@example.net.in<<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" mobilephone@api.example.net.in ;}
或者
#!/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/vivek # send an email if backup failed if [ $? -ne 0 ] then /usr/bin/mail -s "GNU/TAR Backup Failed" vivek@example.net.in<<EOF GNU/Tar backup failed @ $(date) for $(hostname) EOF else /usr/bin/logger "Backup done" fi .... .. # clean up rm $_filename