UTL_SMTP不提供添加附件接口,Excel附件须手动构造MIME多部分结构、Base64编码、正确设置Content-Disposition及边界符;UTL_MAIL.send_attach_raw因RAW限长、不支持multipart/mixed和RFC 5987编码,无法可靠发送中文名Excel附件。

直接说结论:UTL_SMTP 本身不提供“添加附件”接口,Excel附件必须手动构造 MIME 多部分结构、Base64 编码、正确设置 Content-Disposition 和边界符,稍有错位(比如少一个 CRLF、附件名未 RFC 5987 编码、boundary 冲突)就会导致附件显示为 ATT00001.dat 或根本收不到。
为什么不能用 UTL_MAIL.send_attach_raw 发 Excel?
UTL_MAIL.send_attach_raw 看似支持附件,但它只接受 RAW 类型参数,且内部强制使用 text/plain 作为邮件主体 MIME 类型,无法嵌套 multipart/mixed 结构。Excel 是二进制文件,RAW 变量在 PL/SQL 中最大仅 32767 字节,而一个实际的 .xlsx 文件通常远超该限制——直接传入会截断或报 ORA-06502。更关键的是,它不支持设置 filename*=UTF-8''...,中文附件名在 Outlook/iOS Mail 中必然乱码或丢失。
附件数据必须分块读取 + Base64 编码
Excel 文件一般来自 BLOB(如报表导出结果),不能整块转 RAW。必须用 DBMS_LOB.READ 分批读取,每次最多 32767 字节,再逐段 UTL_ENCODE.BASE64_ENCODE 并按 76 字符换行(RFC 2045 要求)。否则某些企业网关(如 Symantec Email Security)会截断长行,导致附件损坏。
Excel 数据可视化图表生成器 - 把 Excel/表格数据一键转为柱状图、折线图、饼图、雷达图、堆叠柱状图、散点图、面积图、环形图、气泡图、极坐标图、水平柱状图、柱+线组合双轴图。支持数据透视后绘图(--pivot),输出交互式 HTML(可悬停查看数值、一键下载 PNG)与静态 PNG(可嵌入文档/PPT)。提供两套配色方案: cn-stock(涨红跌绿, 金融财报默认) 与 vibrant(明亮风格, 适合演示报告)。当用户提到数据可视化、画图、图表、走势图、占比图、趋势图、对比图、透视表、Exc
- 别用
UTL_RAW.CAST_TO_RAW(my_blob)——BLOB不能直接转RAW - 每次
DBMS_LOB.READ后,对读出的RAW调用UTL_ENCODE.BASE64_ENCODE,再用UTL_RAW.CAST_TO_VARCHAR2转字符串,并每 76 字符插入UTL_TCP.CRLF - 边界符(如
--BOUNDARY_123)必须全局唯一,且在附件段开头、结尾、HTML 段之间严格使用CRLF包裹
中文附件名必须用 filename*=UTF-8''xxx 格式
只写 filename="报表.xlsx" 在绝大多数客户端(Outlook、Apple Mail、Foxmail、微信邮箱)里都会失效,显示为随机 DAT 文件。RFC 5987 强制要求:中文名必须 URL 编码后放在 filename*=UTF-8'' 后,两个单引号 '' 缺一不可。
- 正确写法:
Content-Disposition: attachment; filename*=UTF-8''%E6%8A%A5%E8%A1%A8.xlsx - 生成方式:
'filename*=UTF-8''' || UTL_URL.ESCAPE('报表.xlsx', TRUE)(注意第三个单引号是字面量) - 别漏掉
Content-Transfer-Encoding: base64和Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet -
Content-Type值不能简写成application/xlsx—— iOS Mail 会拒识
最易被忽略的一点:整个邮件体第一行必须是 MIME-Version: 1.0,紧接着是 Content-Type: multipart/mixed; boundary="BOUNDARY_123",且这两个头与后续所有段落之间**必须空一行**(即两个 CRLF)。这个空行一旦缺失,Gmail 直接丢弃 HTML 段,Outlook 当纯文本渲染——你看到的“空白邮件”,往往就卡在这儿。

















