本文目录导读:

- 使用
mail命令(最常用) - 使用
sendmail命令(Linux自带) - 使用
mutt(支持HTML、附件) - 完整的Shell报告脚本示例
- 使用
ssmtp(轻量级SMTP转发) - 使用
curl调用邮件API(推荐) - 常见问题
在Shell脚本中发送邮件报告,主要有以下几种常用方法,推荐使用 mail 或 sendmail 命令,或结合 mutt 发送带附件的HTML邮件。
使用 mail 命令(最常用)
安装
# CentOS/RHEL yum install mailx -y # Ubuntu/Debian apt-get install mailutils -y
基础用法
# 发送纯文本邮件 echo "这是邮件内容" | mail -s "邮件主题" user@example.com # 从文件读取内容 mail -s "报告" user@example.com < /tmp/report.txt # 发送给多人 echo "内容" | mail -s "主题" user1@example.com,user2@example.com
配置SMTP(使用外部邮箱)
编辑 /etc/mail.rc,添加:
set from=yourname@gmail.com
set smtp=smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=yourname@gmail.com
set smtp-auth-password=your_app_password
set smtp-use-starttls=yes
使用 sendmail 命令(Linux自带)
( echo "Subject: 系统报告" echo "To: user@example.com" echo "Content-Type: text/plain" echo "" echo "这是报告内容" echo "日期: $(date)" ) | sendmail -t
使用 mutt(支持HTML、附件)
安装
apt-get install mutt # Ubuntu yum install mutt # CentOS
发送HTML邮件
echo "<h1>报告</h1><p>内容</p>" | mutt -e "set content_type=text/html" -s "HTML报告" user@example.com
发送带附件
echo "请查收附件" | mutt -s "报告附件" -a /path/to/file.txt -- user@example.com
多个附件
echo "多个附件" | mutt -s "附件" -a file1.log -a file2.csv -- user@example.com
完整的Shell报告脚本示例
#!/bin/bash
# 配置
TO="admin@example.com"
SUBJECT="每日系统报告 - $(date '+%Y-%m-%d')"
# 生成报告内容
REPORT="/tmp/report_$(date '+%Y%m%d').txt"
{
echo "====== 系统报告 ======"
echo "主机名: $(hostname)"
echo "日期: $(date)"
echo ""
echo "--- 磁盘使用 ---"
df -h
echo ""
echo "--- 内存使用 ---"
free -h
echo ""
echo "--- 运行时间 ---"
uptime
} > $REPORT
# 发送邮件
mail -s "$SUBJECT" "$TO" < $REPORT
# 或使用 mutt 发送附件
# echo "请查收每日报告" | mutt -s "$SUBJECT" -a $REPORT -- $TO
# 清理
rm -f $REPORT
使用 ssmtp(轻量级SMTP转发)
安装配置
apt-get install ssmtp
编辑 /etc/ssmtp/ssmtp.conf:
mailhub=smtp.gmail.com:587
AuthUser=yourname@gmail.com
AuthPass=your_app_password
UseSTARTTLS=YES
发送邮件
echo -e "Subject: 测试\n\n邮件内容" | ssmtp user@example.com
使用 curl 调用邮件API(推荐)
如果使用邮件服务API(如SendGrid、Mailgun、AWS SES等):
# SendGrid 示例
curl -X POST "https://api.sendgrid.com/v3/mail/send" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"personalizations": [{"to": [{"email": "user@example.com"}]}],
"from": {"email": "noreply@yourdomain.com"},
"subject": "系统报告",
"content": [{"type": "text/plain", "value": "报告内容"}]
}'
常见问题
邮件被标记为垃圾邮件
- 配置反向DNS(PTR记录)
- 使用SPF/DKIM/DMARC
- 避免使用免费邮箱发重要通知
中文乱码
添加编码声明:
echo "Subject: =?UTF-8?B?$(echo -n '测试主题' | base64)?="
调试邮件发送
# 测试SMTP连接 openssl s_client -starttls smtp -connect smtp.gmail.com:587 # 查看邮件日志 tail -f /var/log/maillog
推荐组合:开发环境用 mail 命令,生产环境用 mutt 或调用邮件API,确保可靠性。