使用 utl_smtp 包的 PL/SQL 中的多个附件问题

Posted

技术标签:

【中文标题】使用 utl_smtp 包的 PL/SQL 中的多个附件问题【英文标题】:Multiple Attachment problems in PL/SQL using utl_smtp package 【发布时间】:2011-03-24 20:30:09 【问题描述】:

我正在使用此链接中的代码在我们系统的电子邮件通知中发送附件;

http://www.builderau.com.au/program/oracle/soa/Sending-blob-attachments-in-e-mail-with-utl-smtp/0,339028441,339284536,00.htm

问题是第二个附件有编码问题。因此,如果我发送一个文本文件,则 txt 文件中的文本将全部混合在一起。就像正确打印前 23 个字符一样,会有一个混合文本,例如 'B•Ú]\ÈØ]\‹[ÝH ' 然后它继续文本,同样的事情在 23 个字符后再次发生......

对于第一个附件,我打印 MIME 边界;

    utl_smtp.write_data(g_mail_conn, chr(13)||chr(10)||chr(13)||chr(10)||'--' || l_boundary ||
                chr(13) || chr(10));

utl_smtp.write_data( g_mail_conn, 'Content-Disposition: attachment; filename="test2.txt"' || chr(13) || chr(10));
utl_smtp.write_data( g_mail_conn, 'Content-Transfer-Encoding: base64' || chr(13) || chr(10) );

然后我运行我从链接中获取的while循环(也在下面复制),然后在循环之后,我重置 v_offset 变量,然后我在上面为附件的第二个边界放置相同的代码。然后我在结尾处关闭了 MIME 边界

utl_smtp.write_data(g_mail_conn,chr(13) || chr(10) || '--' ||  l_boundary || '--' || chr(13)); 

知道为什么会出现这个问题吗?

While 循环;

<<while_loop>>
while v_offset < v_length loop
  dbms_lob.read( p_blob, v_buffer_size, v_offset, v_raw );
  utl_smtp.write_raw_data( c, utl_encode.base64_encode(v_raw) );
  utl_smtp.write_data( c, utl_tcp.crlf );
  v_offset := v_offset + v_buffer_size;
end loop while_loop;

【问题讨论】:

【参考方案1】:

我刚刚找到了解决方案...

v_buffer_size 变量在 dbms_lob.read() 过程中被修改,因此在附加新文件之前,我只需将其重置为 57,同时将 v_offset 设置为 1..

【讨论】:

hmm...看起来如果你让 v_buffer_size := 57 和 v_offset := 1 那么每个大小为 (x*58)+1 的文件都将被最后一个字符截断

以上是关于使用 utl_smtp 包的 PL/SQL 中的多个附件问题的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 包的概念及创建使用

PL-SQL 包的创建和应用

Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)

PL/SQL,如何将包的通用代码行放在共享包中

utl_smtp 中的邮件正文大小限制

oracle PL/SQL 包的介绍