You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unix邮件正文发送CSV文件内容列重叠错位问题求助

问题根源

你当前生成的.csv文件并非标准逗号分隔格式,而是sqlplus输出的固定宽度对齐纯文本,出现列重叠是两个原因导致:

  1. 你对name列设置的格式化规则为a10,字段长度不足10位时sqlplus会自动补半角空格填充对齐,而绝大多数邮件客户端渲染纯文本时默认使用比例字体,不同字符宽度不一致会直接破坏对齐结构;部分客户端还会自动将连续多个半角空格合并为单个空格,进一步导致格式错乱。
  2. 直接用mailx发送纯文本时未指定格式规则,部分客户端会自动调整空格、换行的渲染逻辑。

解决方案

方案1:保留正文对齐显示(推荐)

将内容包裹在HTML的<pre>标签中发送,强制客户端用等宽字体渲染,不会合并空格:

  1. 先修改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;
  1. 拼接HTML格式的邮件内容:
echo "<html><body><pre>" > mail_content.html
cat filename.csv >> mail_content.html
echo "</pre></body></html>" >> mail_content.html
  1. 调整mailx发送命令,指定HTML格式:
mailx -s "subject" -a "Content-Type: text/html; charset=utf-8" receiver@mail.com < mail_content.html

方案2:生成标准CSV作为附件发送

如果不需要在正文直接显示表格,可生成标准逗号分隔的CSV文件作为附件发送,用户下载后用表格工具打开格式完全正常:

  1. 修改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;
  1. 用mailx发送附件:
mailx -s "subject" -a filename.csv receiver@mail.com < /dev/null

其他注意事项

原脚本中数据库连接的写法有误,正确格式为用户名/密码@数据库实例名,需补全@符号否则会连接失败。

内容的提问来源于stack exchange,提问作者Nani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:48:02