如何让Bash脚本中PostgreSQL查询结果在邮件中正确格式化?
解决PostgreSQL查询结果邮件格式化问题
问题核心是邮件客户端默认使用比例字体显示内容,而记事本用等宽字体,你用rpad基于等宽字体做的对齐,在比例字体里自然会乱。结合你用的Heirloom Mail 12.5,给你几个实用的解决方法:
方法1:用HTML格式强制等宽显示(最可靠)
Heirloom Mail支持发送HTML邮件,用<pre>标签包裹查询结果,强制邮件客户端用等宽字体渲染:
#!/bin/bash # 执行PostgreSQL查询,保留原始对齐格式 QUERY_RESULT=$(psql -U 你的用户名 -d 你的数据库 -t -c "SELECT rpad(col1, 20), rpad(col2, 15), rpad(col3, 10) FROM 你的表;") # 构造HTML内容,用<pre>标签确保等宽 MAIL_CONTENT="<html><body><pre style='font-family: monospace;'>$QUERY_RESULT</pre></body></html>" # 发送邮件,指定内容类型为HTML echo "$MAIL_CONTENT" | mail -s "查询结果" -a "Content-Type: text/html" 收件人邮箱@xxx.com
方法2:用psql内置格式化替代手动rpad
psql自带对齐格式化功能,比手动rpad更灵活准确,配合纯文本邮件的提示:
#!/bin/bash # 用psql的aligned模式自动对齐列,无需手动rpad QUERY_RESULT=$(psql -U 你的用户名 -d 你的数据库 -t --pset format=aligned -c "SELECT col1, col2, col3 FROM 你的表;") # 添加提示,引导收件人用等宽字体查看 MAIL_CONTENT="--- 以下内容请切换到等宽字体查看 ---\n\n$query_result" # 发送纯文本邮件 echo -e "$MAIL_CONTENT" | mail -s "查询结果" 收件人邮箱@xxx.com
方法3:给纯文本邮件指定等宽格式标记
通过设置邮件头,提示客户端用等宽字体渲染纯文本内容(部分客户端支持):
echo "$QUERY_RESULT" | mail -s "查询结果" -a "Content-Type: text/plain; charset=utf-8; format=fixed" 收件人邮箱@xxx.com
为什么记事本里显示正常?
记事本默认使用等宽字体(如Consolas、Courier New),每个字符宽度一致,rpad添加的空格能精准对齐;而邮件客户端默认用比例字体(如Arial),不同字符宽度不同(比如w比i宽),导致空格的对齐效果失效。
内容的提问来源于stack exchange,提问作者Mano
相关产品推荐
相关产品推荐

