利用utl_smtp从oracle数据库发送带blob附件的电子邮件

本文介绍如何使用Oracle数据库中的utl_smtp包发送带有Blob附件的电子邮件,包括添加方法函数到包头,以及在包体中实现具体发送过程。

在之前的《利用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的基础用法,在里面加上一个附件并不成问题,赶快实践一下吧。

转载于:https://my.oschina.net/u/2893/blog/804426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值