在Shell脚本中设置邮件通知,可以通过系统自带的邮件工具(如mail、sendmail)或第三方SMTP服务(如Gmail)实现。以下是详细配置方法及示例:
一、使用系统自带邮件工具
1. 安装邮件客户端
Ubuntu/Debian:
sudo apt install mailutils
CentOS/RHEL:
sudo yum install mailx
2. 发送邮件示例
在脚本中直接调用mail命令发送通知:
# 发送简单文本
echo "这是邮件正文" | mail -s "邮件标题" your-email@example.com
# 发送文件内容
mail -s "日志报告" admin@example.com < /var/log/system.log
# 在脚本中使用(CPU监控示例)
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "CPU使用率: ${cpu_usage}%" | mail -s "CPU警报" admin@example.com
fi
二、通过外部SMTP服务(如Gmail)
1. 安装并配置SSMTP
# Ubuntu/Debian
sudo apt install ssmtp
# 编辑配置文件 /etc/ssmtp/ssmtp.conf
root=your-email@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=your-email@gmail.com
AuthPass=your-app-password # 使用Gmail应用专用密码
UseSTARTTLS=YES
2. 发送邮件脚本
# 发送带正文的邮件
echo "这是邮件内容" | mail -s "来自Gmail的测试" recipient@example.com
# 发送带附件的邮件(需借助mutt)
sudo apt install mutt
echo "日志见附件" | mutt -s "带附件的邮件" -a /var/log/syslog -- recipient@example.com
三、使用CURL直接调用SMTP API
通过HTTP API发送邮件(如Mailgun、SendGrid等):
# 示例:使用Mailgun API
API_KEY="your-api-key"
DOMAIN="your-domain.mailgun.org"
curl -s --user "api:$API_KEY" \
https://api.mailgun.net/v3/$DOMAIN/messages \
-F from="Alert System <alert@example.com>" \
-F to="admin@example.com" \
-F subject="系统警报" \
-F text="CPU使用率超过阈值!"
四、高级配置:加密与安全
1. 避免在脚本中暴露密码
使用环境变量或加密文件:
# 将密码保存在~/.mailpass(权限设为600)
echo 'export SMTP_PASS="your-password"' >> ~/.mailpass
chmod 600 ~/.mailpass
# 在脚本中引用
source ~/.mailpass
echo "警报" | mail -s "标题" \
-r "alert@example.com" \
-S smtp="smtp.gmail.com:587" \
-S smtp-use-starttls \
-S smtp-auth=login \
-S smtp-auth-user="your-email" \
-S smtp-auth-password="$SMTP_PASS" admin@example.com
2. 使用GPG加密敏感信息
# 加密密码文件
gpg --output secret.gpg --encrypt --recipient admin@example.com ~/.mailpass
# 在脚本中解密使用
gpg --quiet --decrypt secret.gpg | while read -r pass; do
echo "邮件内容" | mail -s "标题" -S smtp-auth-password="$pass" admin@example.com
done
五、调试邮件发送
1. 查看邮件队列
mailq # 查看待发送邮件
2. 检查日志
tail -f /var/log/mail.log # Ubuntu/Debian
tail -f /var/log/maillog # CentOS/RHEL
3. 测试SMTP连通性
telnet smtp.gmail.com 587
EHLO example.com
STARTTLS
AUTH LOGIN
# 输入Base64编码的用户名和密码
六、完整示例:监控+邮件通知
#!/bin/bash
# 监控CPU、内存、磁盘,异常时发送邮件
EMAIL="admin@example.com"
THRESHOLD_CPU=80
THRESHOLD_MEM=90
THRESHOLD_DISK=85
# CPU检查
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if (( $(echo "$cpu_usage > $THRESHOLD_CPU" | bc -l) )); then
echo "CPU使用率: ${cpu_usage}%" | mail -s "CPU警报" $EMAIL
fi
# 内存检查
mem_usage=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
if [ $mem_usage -gt $THRESHOLD_MEM ]; then
echo "内存使用率: ${mem_usage}%" | mail -s "内存警报" $EMAIL
fi
# 磁盘检查
disk_usage=$(df / | awk '/\//{printf("%d"), $5}')
if [ $disk_usage -gt $THRESHOLD_DISK ]; then
echo "磁盘使用率: ${disk_usage}%" | mail -s "磁盘警报" $EMAIL
fi
七、推荐工具
1、mutt - 更强大的邮件客户端(支持附件、HTML等)
2、swaks - 命令行SMTP测试工具
swaks --to admin@example.com --server smtp.gmail.com:587
--auth LOGIN
--from your-email@gmail.com
--auth-user your-email
--auth-password your-pass
3、msmtp - 轻量级SMTP客户端
通过以上方法,你可以灵活地在Shell脚本中集成邮件通知功能,及时接收系统状态、任务结果等关键信息!