公司动态
Linux定时发送HTML邮件报告:crontab+mailx实战
1. 项目概述最近在做一个服务器监控项目时需要每天定时发送包含统计数据的邮件报告。经过反复测试最终用crontabmailxHTML表格的方案完美解决了这个问题。这个方案特别适合需要定期发送格式化数据的场景比如每日服务器状态报告周报数据汇总监控系统告警自动化测试结果通知2. 环境准备2.1 安装mailx工具在Ubuntu/Debian系统上sudo apt-get install mailutils在CentOS/RHEL系统上sudo yum install mailx注意不同Linux发行版的邮件工具包名称可能不同如果遇到问题可以尝试搜索你的发行版 安装mailx2.2 配置邮件发送编辑/etc/mail.rc文件添加SMTP配置set fromyour_emailexample.com set smtpsmtp.example.com set smtp-auth-userusername set smtp-auth-passwordpassword set smtp-authlogin3. 创建HTML邮件模板3.1 基础HTML结构创建一个report.html文件!DOCTYPE html html head title每日报告/title style table {border-collapse: collapse; width: 100%;} th, td {border: 1px solid #ddd; padding: 8px; text-align: left;} th {background-color: #f2f2f2;} tr:nth-child(even) {background-color: #f9f9f9;} /style /head body h2服务器状态日报/h2 p生成时间$(date)/p table tr th指标/th th数值/th th状态/th /tr tr tdCPU使用率/td td$(top -bn1 | grep Cpu(s) | awk {print $2})%/td td正常/td /tr !-- 更多行... -- /table /body /html3.2 动态数据填充使用shell脚本动态生成HTML内容#!/bin/bash CPU_USAGE$(top -bn1 | grep Cpu(s) | awk {print $2}) MEM_USAGE$(free -m | awk /Mem:/ {print $3}) DISK_USAGE$(df -h | awk /\/$/ {print $5}) cat /tmp/report.html EOF !DOCTYPE html html !-- 同上省略... -- tr tdCPU使用率/td td${CPU_USAGE}%/td td$( [ $(echo $CPU_USAGE 90 | bc) -eq 1 ] echo 警告 || echo 正常 )/td /tr EOF4. 设置crontab定时任务4.1 创建发送脚本创建send_report.sh#!/bin/bash # 生成报告 ./generate_report.sh # 发送邮件 mailx -a Content-type: text/html -s 每日服务器报告 recipientexample.com /tmp/report.html4.2 配置crontab编辑crontabcrontab -e添加每天8点发送的定时任务0 8 * * * /path/to/send_report.sh5. 常见问题解决5.1 邮件发送失败检查点确保mailx配置正确检查SMTP服务器是否需要特殊端口查看/var/log/mail.log日志5.2 HTML显示不正常解决方案确保邮件头包含Content-type: text/html避免使用复杂的CSS某些邮件客户端支持有限测试不同邮件客户端的显示效果5.3 时区问题如果crontab执行时间与预期不符# 查看系统时区 timedatectl # 设置时区 sudo timedatectl set-timezone Asia/Shanghai6. 高级技巧6.1 添加附件在mailx命令中添加附件mailx -a Content-type: text/html -a /path/to/attachment.pdf -s 报告 recipientexample.com report.html6.2 多收件人发送用逗号分隔多个收件人mailx -a Content-type: text/html -s 报告 user1example.com,user2example.com report.html6.3 邮件优先级设置添加重要级别头mailx -a Content-type: text/html -a X-Priority: 1 -s 重要服务器告警 recipientexample.com alert.html7. 实际应用案例7.1 服务器监控日报#!/bin/bash # 获取系统信息 HOSTNAME$(hostname) LOAD$(uptime | awk -Fload average: {print $2}) DISK$(df -h | grep -vE ^Filesystem|tmpfs | awk {print $1 $5}) # 生成HTML cat /tmp/server_report.html EOF !DOCTYPE html html head title服务器日报 - ${HOSTNAME}/title style /* 样式省略 */ /style /head body h2${HOSTNAME} 服务器状态/h2 p生成时间$(date %Y-%m-%d %H:%M:%S)/p h3系统负载/h3 p${LOAD}/p h3磁盘使用/h3 ul EOF echo $DISK | while read line; do echo li${line}/li /tmp/server_report.html done cat /tmp/server_report.html EOF /ul /body /html EOF # 发送邮件 mailx -a Content-type: text/html -s ${HOSTNAME} 服务器日报 adminexample.com /tmp/server_report.html7.2 数据库备份报告#!/bin/bash # 执行备份 mysqldump -u root -pPASSWORD database /backups/db_$(date %Y%m%d).sql # 生成报告 cat /tmp/db_report.html EOF !DOCTYPE html html head title数据库备份报告/title /head body h2数据库备份完成/h2 p备份时间$(date)/p p备份文件大小$(du -h /backups/db_$(date %Y%m%d).sql | awk {print $1})/p /body /html EOF # 发送邮件 mailx -a Content-type: text/html -a /backups/db_$(date %Y%m%d).sql -s 数据库备份报告 dbaexample.com /tmp/db_report.html8. 安全注意事项不要在脚本中硬编码密码使用环境变量或配置文件设置适当的文件权限chmod 700 send_report.sh chmod 600 /etc/mail.rc定期清理临时HTML文件使用加密连接SMTP如果服务器支持9. 性能优化建议对于复杂的报告考虑先用Python等语言生成HTML再用shell调用如果报告数据量大可以压缩后作为附件发送设置邮件发送重试机制MAX_RETRY3 COUNT0 while [ $COUNT -lt $MAX_RETRY ]; do mailx -a Content-type: text/html -s 报告 recipientexample.com report.html break COUNT$((COUNT1)) sleep 60 done10. 扩展应用10.1 与监控系统集成结合Prometheus等监控系统#!/bin/bash # 从Prometheus API获取数据 CPU_LOAD$(curl -s http://localhost:9090/api/v1/query?querynode_load1 | jq -r .data.result[0].value[1]) # 生成HTML报告...10.2 多服务器汇总报告收集多台服务器数据后生成综合报告#!/bin/bash # 收集各服务器数据 ssh server1 top -bn1 | grep Cpu(s) | awk {print \$2} /tmp/server1_cpu ssh server2 free -m | awk /Mem:/ {print \$3} /tmp/server2_mem # 生成汇总HTML...10.3 交互式报告在HTML中加入简单的JavaScript交互script function toggleDetails(id) { var elem document.getElementById(id); elem.style.display elem.style.display none ? block : none; } /script button onclicktoggleDetails(details)显示详情/button div iddetails styledisplay:none !-- 详细内容 -- /div注意不是所有邮件客户端都支持JavaScript需要测试目标客户端的兼容性