linux实战(七)----发送邮件通知----实例运用


我们在前面几章已经学习了一些常用的用法,有时候我们需要在监控出现异常情况时给管理员发送邮件。


本章学习  在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  




安装和配置sendmail

不需要注册公网域名和MX记录(不需要架设公网邮件服务器),通过linux系统自带的mail命令即可对公网邮箱发送邮件。不过mail命令是依赖sendmail的,所以我们需要先检查安装和配置sendmail。

一般系统都自带sendmail,但是只能给内网的邮箱发邮件。如果想给公网的邮箱发邮件(比如qq邮箱)就需要配置sendmail.

这里记录sendmail的安装启动配置,各取所需。

下载安装mailutils

wget ftp://ftp.gnu.org/gnu/mailutils/mailutils-2.2.tar.gz

linux实战(七)----发送邮件通知----实例运用_第1张图片

linux实战(七)----发送邮件通知----实例运用_第2张图片
下载完成后在当前目录中可以看到压缩文件,解压进入,执行安装命令。

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]
此时发觉只能给公司内部发邮件, 如果需要还能给外面的邮箱(比如我的qq邮箱)发邮件则还需要

vi  /etc/mail/sendmail.mc
找到包含Addr的这一行:    
DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl
修改Addr=0.0.0.0  ,表明可以连接到任何服务器
End

这时候测试 这里[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邮箱白名单。

linux系统邮件mail命令

我们学习一下mail命令。

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:秘密抄送的邮件地址,其他收件人是看不到的 如果你想将邮件一次发给多人,而又不想让别人知道你一次发给多人,那就使用秘密抄送了

使用实例

直接使用shell当编辑器

mail -s "Hello from mzone.cc by shell"    [email protected]
hello,this is the content of mail.
welcome to www.mzone.cc


第一行是输入的命令,-s表示邮件的主题,后面的[email protected]则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D结束输入,此时会提示你输入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]了。





总结分析

使用上述三种方式都可以给外部邮箱进行邮件发送,但因为前面2种都是直接在shell中敲入邮件内容,因此无法输入中文,即使我们使用粘贴的方式输入了中文,那么收到的邮件也是乱码的。

但第3种方式,我们可以在window下编辑好邮件内容后,放到linux下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。
这里我主要介绍的是在CentOS下使用mail发送电子邮件的一些使用方法,需要的要求是你的linux必须安装了sendmail并开启了,同时保证可以连接外网。


设置发件邮箱


 因为mail程序本身就是调用sendmail来进行邮件发送的,因此我们可以在mail命令中使用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]


运行结果:

成功收到邮件

linux实战(七)----发送邮件通知----实例运用_第3张图片






可能遇到的问题

情况分析

有时候会发送不出去,特别是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的发信,稍后降低频率重新尝试发信。如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。



解决方法

方法一:不用qq邮箱

方法二:把linux域名加入qq邮箱白名单

如下图

域名可在拒绝邮件中找到。

linux实战(七)----发送邮件通知----实例运用_第4张图片


linux实战(七)----发送邮件通知----实例运用_第5张图片


成功收到邮件!

你可能感兴趣的:(linux,linux基础与shell编程)