Shell脚本中用sendemail发送双SQL结果HTML表格邮件的问题
解决Shell脚本中sendemail发送双SQL表格邮件排版问题
核心问题排查方向
大多数情况是HTML结构不规范、sendemail未正确指定HTML格式,或SQL转HTML时的格式错误导致的,按以下步骤逐一修复:
1. 强制sendemail按HTML解析邮件
发送时必须添加-o content-type=text/html参数,否则邮件会把HTML代码当纯文本显示,或解析错乱。如果有中文,再加-o message-charset=UTF-8避免乱码:
sendemail ... -o content-type=text/html -o message-charset=UTF-8 ...
2. 确保两个表格的HTML结构独立且完整
每个SQL查询的输出必须用完整的<table>标签包裹,且两个表格之间加分隔元素(比如换行标签<br>、标题或间距样式),避免挤在一起。
示例:SQL转HTML表格的处理逻辑
假设用MySQL查询,用sed把制表符分隔的查询结果转成HTML表格:
# 处理第一个SQL结果 sql1_table=$(mysql -u 用户名 -p'密码' -D 数据库名 -e "SELECT 列1,列2 FROM 表1" | \ sed '1s/^/<tr><th>/; s/\t/<\/th><th>/g; s/$/<\/th><\/tr>/; 2,$s/^/<tr><td>/; s/\t/<\/td><td>/g; s/$/<\/td><\/tr>/') sql1_html="<table border='1' cellpadding='4' cellspacing='0'>$sql1_table</table>" # 处理第二个SQL结果,逻辑同上 sql2_table=$(mysql -u 用户名 -p'密码' -D 数据库名 -e "SELECT 列3,列4 FROM 表2" | \ sed '1s/^/<tr><th>/; s/\t/<\/th><th>/g; s/$/<\/th><\/tr>/; 2,$s/^/<tr><td>/; s/\t/<\/td><td>/g; s/$/<\/td><\/tr>/') sql2_html="<table border='1' cellpadding='4' cellspacing='0'>$sql2_table</table>"
3. 组装规范的完整HTML邮件内容
给邮件加基础样式,让表格排版更清晰,同时用标题区分两个查询结果:
full_html=" <html> <head> <meta charset='UTF-8'> <style> table { border-collapse: collapse; margin: 15px 0; width: 90%; } th { background: #f5f5f5; padding: 8px; border: 1px solid #ddd; } td { padding: 8px; border: 1px solid #ddd; } h3 { color: #333; margin-top: 20px; } </style> </head> <body> <h3>第一组查询结果</h3> $sql1_html <h3>第二组查询结果</h3> $sql2_html </body> </html> "
4. 完整的sendemail发送命令
把上面的变量整合到发送命令中:
sendemail -f 发件人邮箱 -t 收件人邮箱 \ -s smtp服务器地址:端口 -o tls=yes \ -u "SQL查询结果汇总" -o content-type=text/html -o message-charset=UTF-8 \ -m "$full_html" \ -xu SMTP用户名 -xp SMTP密码
常见坑点修复
- 如果SQL输出的分隔符不是制表符(比如逗号),要把sed里的
s/\t/...改成对应分隔符,比如s/,/...。 - 转义SQL结果中的特殊字符:如果查询结果包含
<、>、&,要提前用sed转成HTML实体,避免破坏结构:sed 's/&/\&/g; s/</\</g; s/>/\>/g' - 确保sendemail版本支持HTML格式,部分旧版本可能需要额外参数,可通过
sendemail --help查看。
内容的提问来源于stack exchange,提问作者Geeme
相关产品推荐
相关产品推荐

