在之前的《利用utl_smtp从oracle数据库发送电子邮件》一文中,我们讨论了如何利用utl_smtp代码从oraclepl/sql应用程序中发送超文本模式的电子邮件。本文将继续深入探讨如何利用另外一种方法扩展这个程序包,使之能够在发送的电子邮件中加载二进制大对象(blob)附件。这里以最常用的pdf文件为例,看看如何把存储在数据库中的pdf文件发送给不同的收信人。
首先,需要把方法函数添加到包头说明里,以便其他的程序包能够调用:
procedure send_blob ( p_sender varchar2, p_recipient varchar2, p_subject varchar2, p_filename varchar2, p_blob blob); |
接下来把实际的方法函数插入到包体里:
procedure send_blob ( p_sender varchar2, p_recipient varchar2, p_subject varchar2, p_filename varchar2, p_blob blob) is
c utl_smtp.connection; v_raw raw(57); v_length integer := 0; v_buffer_size integer := 57; v_offset integer := 1;
begin
common(p_sender, p_recipient, p_subject, c);
utl_smtp.write_data( c, 'content-disposition: attachment; filename="' || p_filename || '"' || utl_tcp.crlf); utl_smtp.write_data( c, 'content-transfer-encoding: base64' || utl_tcp.crlf ); utl_smtp.write_data( c, utl_tcp.crlf );
v_length := dbms_lob.getlength(p_blob);
<<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;
utl_smtp.write_data( c, utl_tcp.crlf ); utl_smtp.close_data( c ); utl_smtp.quit( c );
exception when utl_smtp.transient_error or utl_smtp.permanent_error then utl_smtp.quit( c ); raise; when others then raise; end send_blob; |
利用utl_smtp从oracle数据库发送带blob附件的电子邮件第2部分:(电脑编程网整理,请尊重作者权益,转载注明出处;)
代码注释
上述代码要求必须为实际上传的blob对象添加一个文件名(filename),而且必须确认该文件名扩展名正确,这样在网络另一端的电子邮件客户才有可能正确地打开这个对象文件。也就是说,在本例中blob对象是一份pdf文件,所以其上传的文件名必须是abc.pdf这种格式才行。
你可能发现,在上面的方法函数中,没有发送主体部分(body)。这里只是为了把大家的视线集中在blob附件的发送上面,所以吧邮件主体部分省略掉。如果你需要发送邮件主体部分,完全可以把包含邮件主体的代码添加进去。
方法函数中奇怪的while loop语句
<<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; |
为了使utl_encode包运行,缓冲区的大小必须是57,这就是为什么我们要使用loop循环执行,并把blob文件截断称57字节大小片断。这个过程把blob对象转换成原始二进制格式,然后把这些57字节长短的片断发送到电子邮件流中,并在每个57字节片断后添加一个行尾符。
只要你掌握了utl_smtp的基础用法,在里面加上一个附件并不成问题,赶快实践一下吧。