我们在前面几章已经学习了一些常用的用法,有时候我们需要在监控出现异常情况时给管理员发送邮件。
本章学习 在shell脚本中 发送邮件通知。
我们在实战六的 示例代码上 增加发送邮件的功能 实现每次检查完目录空间备份后 就发送邮件。
checkSpace.sh如下: 检查目录的占用磁盘 并把结果文件备份
#!/bin/bash
function GetDiskSpc
{
if [ $# -ne 1 ]
then
return 1
fi
Folder="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'`
echo $DiskSpace
}
function CheckDiskSpc
{
DiskSpace=`GetDiskSpc $1`
echo "The system $Folder disk space is $DiskSpace%"
echo "The system $Folder disk space is $DiskSpace%" >> space.txt
if [ $DiskSpace -gt 90 ]
then
{
echo "The usage of system disk($Folder) is larger than 90%"
echo "The usage of system disk($Folder) is larger than 90%" >> space.txt
}
else
{
echo "The usage of system disk($Folder) is normal"
echo "The usage of system disk($Folder) is normal" >> space.txt
}
fi
}
CheckDiskSpc /boot
time=`date +%F`
tar cvf - /data/shell/space.txt > /data/shell/${time}space.tar
rm space.txt
不需要注册公网域名和MX记录(不需要架设公网邮件服务器),通过linux系统自带的mail命令即可对公网邮箱发送邮件。不过mail命令是依赖sendmail的,所以我们需要先检查安装和配置sendmail。
一般系统都自带sendmail,但是只能给内网的邮箱发邮件。如果想给公网的邮箱发邮件(比如qq邮箱)就需要配置sendmail.
这里记录sendmail的安装启动配置,各取所需。
下载安装mailutils
wget ftp://ftp.gnu.org/gnu/mailutils/mailutils-2.2.tar.gz
tar -xvf mailutils-2.2.tar.gz
cd ./mailutils-2.2
./configure
make && make install
yum install -y sendmail
yum install sharutils # 使用带附件功能
service sendmail start
查看sendmail启动没:
ps aux |grep sendmail
测试: echo 'content test' | mail -s "title test" -t [email protected]vi /etc/mail/sendmail.mc
找到包含Addr的这一行: 这时候测试 这里[email protected]修改成自己的邮箱,能发送到就通了。
echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe" [email protected]
如果邮件被拒绝,请移步文章末尾的 可能遇到的问题---根据步骤把linux域名加入qq邮箱白名单。
我们学习一下mail命令。
mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ... [--sendmail -options ...]
mail [-iInNv] -f [name]
mail [-iInNv] [-u user]
i 忽略 tty 的中断讯号。 (interrupt)
I 强迫设成互动模式。 (Interactive)
v 列印出讯息,例如送信的地点、状态等等。 (verbose)n 不读入 mail.rc 设定档。
s 邮件标题。
c cc 邮件地址。
b bcc 邮件地址。
CC 英文全称是 Carbon Copy(抄送);
BCC英文全称是 Blind CarbonCopy(暗抄送)。
这两个的区别是什么呢? cc:每个收件人都能看到抄送人的地址。 bcc:秘密抄送的邮件地址,其他收件人是看不到的 如果你想将邮件一次发给多人,而又不想让别人知道你一次发给多人,那就使用秘密抄送了
mail -s "Hello from mzone.cc by shell" [email protected]
hello,this is the content of mail.
welcome to www.mzone.cc
echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe" [email protected]
使用管道直接敲入这行命令即可完成邮件的发送,其中echo后的是邮件正文。
mail -s "Hello from mzone.cc by file" [email protected] < mail.txt
使用上面的命令后,我们就可以把mail.txt文件的内容作为邮件的内容发送给[email protected]了。
但第3种方式,我们可以在window下编辑好邮件内容后,放到linux下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。
这里我主要介绍的是在CentOS下使用mail发送电子邮件的一些使用方法,需要的要求是你的linux必须安装了sendmail并开启了,同时保证可以连接外网。
mail -s "Hello from mzone.cc with sender" [email protected] -- -f [email protected]
上面的命令中,我们使用了– -f [email protected]这样的参数,这是sendmail的选项,其中-f表示邮件的发送人邮件地址。更多sendmail参数请查看这里http://www.courier-mta.org/sendmail.html,或者在shell中man sendmail进行帮助获取。
很多情况下,我们也需要使用邮件来发送附件,在linux下使用mail命令发送附件也很简单,不过首先需要安装uuencode软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在CentOS上安装该软件包如下:
yum install sharutils
安装完成后我们就可以来进行附件的发送了,使用如下命令:
uuencode test.txt testfilename | mail -s "hello,see the attachement" [email protected] < mail.txt
完成后就可以把text.txt文件作为邮件的附件发送出去了。uuencode有两个参数,第一个是要发送的文件,第二个是显示的文件名称。
/usr/lib/sendmail -bp
若屏幕显示为“Mail queue is empty” 的信息,表示mail 已送出。系统收到邮件都会保存在“/var/spool/mail/[linux用户名]”文件中。
在linux中输入mail回车 ,就进入了收件箱,并显示二十封邮件列表。
此时命令提示符为”&”:(可以输入以下命令对邮件进行相关操作)
& help //如果不会使用或者忘记了什么命令,就输入 help 或者 ? 来获取帮助
Mail Commands
t 打印出信息 【注意】多个信息用空格分开,如 t 1 7
n 打印出下一条信息
e 编辑信息
f 输出信息的头行
d 删除信息
s file 追加信息到文件file
u 不删除某信息
R 回复发件人
r 回复发件人和本信息所有的收件人
pre 保留信息在 /usr/spool/mail 1*
m 发邮件,多个收件人用空格分开【需要sendmail支持】
x 退出mail命令平台,并不保存之前的操作,比如删除邮件
q 退出mail命令平台,保存之前的操作,比如删除已用d删除的邮件,已阅读邮件会转存到当前用户家目录下的 mbox文件中。如果在mbox中删除文件才会彻底删除。
! 让shell执行某命令,如 !ls 输出ls命令结果
cd [directory] 改变目录,这里不用 !cd,但打印当前目录需要 !pwd
我们现在把mail命令和实战六的脚本结合起来,我们这里使用管道方法。
我这里发送到我的邮箱[email protected]
echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe" [email protected]
最终脚本checkSpace.sh如下:
#!/bin/bash
function GetDiskSpc
{
if [ $# -ne 1 ]
then
return 1
fi
Folder="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'`
echo $DiskSpace
}
function CheckDiskSpc
{
DiskSpace=`GetDiskSpc $1`
echo "The system $Folder disk space is $DiskSpace%"
echo "The system $Folder disk space is $DiskSpace%" >> space.txt
if [ $DiskSpace -gt 90 ]
then
{
echo "The usage of system disk($Folder) is larger than 90%"
echo "The usage of system disk($Folder) is larger than 90%" >> space.txt
}
else
{
echo "The usage of system disk($Folder) is normal"
echo "The usage of system disk($Folder) is normal" >> space.txt
}
fi
}
CheckDiskSpc /boot
time=`date +%F`
tar cvf - /data/shell/space.txt > /data/shell/${time}space.tar
rm space.txt
echo "hello,this is the content of mail.welcome to www.mzone.cc" | mail -s "Hello from mzone.cc by pipe" [email protected]
运行结果:
成功收到邮件
有时候会发送不出去,特别是qq邮箱,遇到的问题可能有以下这些:
550 Mailbox unavailable or access denied出错原因:您要发送的收件人短时间内收到大量邮件,为避免受到恶意攻击,暂时禁止向该收件人发信。改善建议:暂停向该收件人发信,稍后重新尝试。
501 Bad address syntax出错原因:您所填写的收件人地址格式不正确。您可以按照以下步骤检查您填写的收件人地址:1、请检查域名是否包含有不允许被使用的字符,如 / , * ? ; 等。这些字符有可能是您在敲击键盘时无意间输入的错误字符;2、请检查域名格式是否合法,一般来说,域名格式为 domain.com;3、请检查您输入的收件人地址中是否有不该出现的空格;4、再次核对您输入的收件人地址,检查地址中是否存在一些容易混淆的字符造成您输入错。例如:大写字母 O 与数字 0 ,小写字母 l 与数字 1 ,小写字母 g 与数字 9 ,小写字母 l 与大写字母 I 。改善建议:经过以上检查后您还是无法找到收件人地址的错误原因,请您联系对方,确认该邮件地址是否正确。
552 Message too large出错原因:您所发送的邮件大小超出腾讯邮箱限制。改善建议:缩减邮件大小,避免夹带超大附件。
550 Mailbox not found出错原因:您要发送的收件人不存在。 改善建议:请与您的收件人确认正确的邮件地址。
550 Mail content denied出错原因:该邮件内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件。对于具有群发性质的邮件,如果出现用户普遍表示反感或集中投诉的情况,腾讯邮箱将禁止类似此邮件内容继续发送。改善建议:如果您是此群发邮件的管理员,请停止群发对用户造成骚扰的广告及推广类邮件。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Connection denied出错原因:该服务器IP的发信频率大幅度超过QQ邮箱限制。QQ邮箱对来自相同IP的外部发信服务器有一定的频率限制:1、超过每分钟发信量限制,此IP地址被禁止发信若干分钟。2、超过每小时发信量限制,此IP地址被禁止发信若干小时。3、超过每日发信量限制,此IP地址本日内禁止再发信。4、以上频率限制数值属于QQ邮箱保密数据,恕不公开。改善建议:如果您是该服务器IP的管理员,请暂停该服务器IP的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Mail content denied出错原因:该邮件内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件。对于具有群发性质的邮件,如果出现用户普遍表示反感或集中投诉的情况,腾讯邮箱将禁止类似此邮件内容继续发送。改善建议:如果您是此群发邮件的管理员,请停止群发对用户造成骚扰的广告及推广类邮件。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Ip frequency limited出错原因:该服务器IP的发信频率超过腾讯邮箱限制。腾讯邮箱对来自相同IP的外部发信服务器有一定的频率限制:1、超过每分钟发信量限制,此IP地址被禁止发信若干分钟。2、超过每小时发信量限制,此IP地址被禁止发信若干小时。3、超过每日发信量限制,此IP地址本日内禁止再发信。4、以上频率限制数值属于腾讯邮箱保密数据,恕不公开。改善建议:如果您是该服务器IP的管理员,请暂停该服务器IP的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Domain frequency limited出错原因:该发件人域名的发信频率超过腾讯邮箱限制。腾讯邮箱对相同的发件人域名有一定的频率限制:1、超过每分钟发信量限制,此发件人域名被禁止发信若干分钟。2、超过每小时发信量限制,此发件人域名被禁止发信若干小时。3、超过每日发信量限制,此发件人域名本日内禁止再发信。4、以上频率限制数值属于腾讯邮箱保密数据,恕不公开。改善建议:如果您是该发件人域名的管理员,请暂停该发件人域名的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Sender frequency limited出错原因:该发件人的发信频率超过腾讯邮箱限制。腾讯邮箱对相同的发件人有一定的频率限制:1、超过每分钟发信量限制,此发件人被禁止发信若干分钟。2、超过每小时发信量限制,此发件人被禁止发信若干小时。3、超过每日发信量限制,此发件人本日内禁止再发信。4、以上频率限制数值属于腾讯邮箱保密数据,恕不公开。改善建议:如果您是该发件人域名的管理员,请暂停该发件人的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
550 Connection frequency limited出错原因:该服务器IP的发信频率超过腾讯邮箱限制。腾讯邮箱对来自相同IP的外部发信服务器有一定的频率限制:1、超过每分钟发信量限制,此IP地址被禁止发信若干分钟。2、超过每小时发信量限制,此IP地址被禁止发信若干小时。3、超过每日发信量限制,此IP地址本日内禁止再发信。4、以上频率限制数值属于腾讯邮箱保密数据,恕不公开。改善建议:如果您是该服务器IP的管理员,请暂停该服务器IP的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。
如下图
域名可在拒绝邮件中找到。
成功收到邮件!