Unix邮件正文发送CSV文件内容列重叠错位问题求助
问题根源
你当前生成的.csv文件并非标准逗号分隔格式,而是sqlplus输出的固定宽度对齐纯文本,出现列重叠是两个原因导致:
- 你对
name列设置的格式化规则为a10,字段长度不足10位时sqlplus会自动补半角空格填充对齐,而绝大多数邮件客户端渲染纯文本时默认使用比例字体,不同字符宽度不一致会直接破坏对齐结构;部分客户端还会自动将连续多个半角空格合并为单个空格,进一步导致格式错乱。 - 直接用mailx发送纯文本时未指定格式规则,部分客户端会自动调整空格、换行的渲染逻辑。
解决方案
方案1:保留正文对齐显示(推荐)
将内容包裹在HTML的<pre>标签中发送,强制客户端用等宽字体渲染,不会合并空格:
- 先修改sqlplus脚本,新增去行尾空格的配置,避免冗余内容:
sqlplus username/pwd@dbname<<EOF Set feedback off; Set linesize 32767; Set pagesize 1000; Set wrap off; -- 新增以下两行配置,去掉行尾多余空格 Set trimspool on; Set trimout on; Spool filename.csv; Column name format a10; Column initdate format a10; Column lastdate format a10; Select name,initdate,lastdate,amout from table; Spool off; EOF;
- 拼接HTML格式的邮件内容:
echo "<html><body><pre>" > mail_content.html cat filename.csv >> mail_content.html echo "</pre></body></html>" >> mail_content.html
- 调整mailx发送命令,指定HTML格式:
mailx -s "subject" -a "Content-Type: text/html; charset=utf-8" receiver@mail.com < mail_content.html
方案2:生成标准CSV作为附件发送
如果不需要在正文直接显示表格,可生成标准逗号分隔的CSV文件作为附件发送,用户下载后用表格工具打开格式完全正常:
- 修改sqlplus的查询语句,直接拼接逗号分隔的列:
sqlplus username/pwd@dbname<<EOF Set feedback off; Set linesize 32767; Set pagesize 0; -- 去掉表头、分隔线等冗余内容 Set trimspool on; Set trimout on; Spool filename.csv; -- 直接输出逗号分隔的内容,不需要列格式化规则 Select name||','||initdate||','||lastdate||','||amout from table; Spool off; EOF;
- 用mailx发送附件:
mailx -s "subject" -a filename.csv receiver@mail.com < /dev/null
其他注意事项
原脚本中数据库连接的写法有误,正确格式为用户名/密码@数据库实例名,需补全@符号否则会连接失败。
内容的提问来源于stack exchange,提问作者Nani
相关产品推荐
相关产品推荐

