先上整体代码
bash
#!/bin/bash
# 设置收件人邮箱
to="123456@qq.com"
# 设置发件人邮箱
from="21331@qq.com"
# 设置邮件主题
subject="Test Email"
# 设置邮件内容
body="This is a test email."
# 发送邮件
echo "${body}" | mail -s "${subject}" -r "${from}" "${to}"
再说详细配置,以及思路
一.配置qq邮箱(需要生成授权码)
QQ邮箱-POP服务开启步骤:
1、使用电脑登录mail.qq.com,进入【设置】;
2、换到【账户】选项;
3、在POP3/IMAP... CalDAV服务下,将【POP3/SMTP服务】开启;
4、通过扫一扫/一键验证/手机令牌/短信验证方式获取授权码,并记住此授权码
(注:若POP3/SMTP已开启,直接点击生成授权码,使用授权码登录第三方客户端。用于登录TIM);
5、将收取选项从最近30天改为全部,并勾选以下四个选项;
6、点击【保存更改】完成设置,使用授权码登录邮箱。
二.配置linux环境
1.直接运行以下命令自动追加内容
bash
#未加密的发送方式通过25端口,会被公有云封掉.
cat >>/etc/mail.rc <<EOF
set from=12121@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=12121@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
EOF
#加密的方式465端口
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/ #加密方式配置
set smtp-user-starttls #加密方式配置
set ssl-verify=ignore #加密方式配置
set from=12121@qq.com #配置发件人
set smtp=smtps://smtp.qq.com:465 #配置使用qq邮箱发送邮件,不加密方式参考上面
set smtp-auth-user=12121@qq.com #邮箱名
set smtp-auth-password=授权码 #授权码
set smtp-auth=login #认证形式
EOF
2.或者在根目录下找到/etc/mail.rc文件
在最后添加(未加密采用未加密的,想用加密采用加密的)
bash
#采用未加密:
set from=12121@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=12121@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
#采用加密
set nss-config-dir=/etc/pki/nssdb/ #加密方式配置
set smtp-user-starttls #加密方式配置
set ssl-verify=ignore #加密方式配置
set from=12121@qq.com #配置发件人
set smtp=smtps://smtp.qq.com:465 #配置使用qq邮箱发送邮件,不加密方式参考上面
set smtp-auth-user=12121@qq.com #邮箱名
set smtp-auth-password=授权码 #授权码
set smtp-auth=login
三.运行text.sh(三种方式都可以运行)
bash
1. bash text.sh
指明先用bash解析器解析
如果bash不存在 才会使用默认解析器
2. ./text.sh
./xxx.sh :先按照 文件中#!指定的解析器解析
如果#!指定指定的解析器不存在 才会使用系统默认的解析器
3. . text.sh
直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的
(注意:脚本文件权限问题)
如果此时成功了,便可以收到邮件,如果没有继续往下(一般是不会发送成功)
四.报错
#发送完邮件后报错
Error in certificate: Peer's certificate issuer is not recognized.
或者是其他的(其他的一般是账号,授权码不一致的问题导致的)
如果报错:Error in certificate: Peer's certificate issuer is not recognized.
说明是证书没有配置导致的
此时需要配置证书
1.检查系统是否安装mailx,一般centos都会自带,如果没有运行yum -y install mail
bash
[root@catchfires ~]# rpm -qa |grep mailx
mailx-12.4-10.el6_10.x86_64
2./etc/pki/nssdb 目录查看证书,没有放qq.crt的证书,解决方法如下
bash
[root@catchfires ~]# cd /etc/pki/nssdb/
[root@catchfires nssdb]# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./qq.crt
[root@catchfires nssdb]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt //添加一个证书到证书数据库中
[root@catchfires nssdb]# echo "test" |mail -s test 123456@qq.com
// 如果没有certutil命令,可以运行yum install -y nss-tools
3.再次运行shell脚本,发现成功并且没有报错
4.下面开始添加网络监控系统及时报警,大致的逻辑是1分钟一次统计网络丢包情况,如果丢包> 2%时,发送邮件。
bash
[root@catchfires ~]# cat /etc/crontab |grep moniter
*/1 * * * * root /root/moniter.sh #添加一分钟一次的网络监控程序
[root@catchfires ~]# cat /root/moniter.sh
#!/bin/bash
ping 223.5.5.5 -n -i 0.5 -q -w 50 -W 1|xargs|awk '{echo -e "\n";printf("%-10s %-15s %6s %s/%s %40s\n",strftime("%F %H:%M:%S"),$2, $18, $13, $16, $26)}' >>/tmp/moniter.log
ping1=`tail /tmp/moniter.log|grep -v " 0%"|grep -v " 1%"|grep -v " 2%"|awk '{print $4" "$3" "$2" "$1}'|tail -n1`
ping2=`tail /tmp/moniter.log|grep -v " 0%"|grep -v " 1%"|grep -v " 2%"|awk '{print $4}'|cut -f1 -d%|tail -n1`
if [ $ping2 -gt 3 ] #bash的判断相当恶心,if前后,[]前后都必须有空格
then
echo $ping1 |mail -s "$ping1" 123456qq.com
fi