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

在以前的《利用utl_smtp从oracle数据库发送电子邮件》一文中,咱们讨论了如何利用utl_smtp代码从oraclepl/sql应用程序中发送超文本模式的电子邮件。本文将继续深刻探讨如何利用另一种方法扩展这个程序包,使之可以在发送的电子邮件中加载二进制大对象(blob)附件。这里以最经常使用的pdf文件为例,看看如何把存储在数据库中的pdf文件发送给不一样的收信人。sql

  首先,须要把方法函数添加到包头说明里,以便其余的程序包可以调用:数据库

 

  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,oracle

      p_subject varchar2,tcp

      p_filename varchar2,函数

      p_blob blob) is     oop

 

    c utl_smtp.connection;ui

    v_raw raw(57);code

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

相关文章
相关标签/搜索