在以前的《利用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的基礎用法,在裏面加上一個附件並不成問題,趕快實踐一下吧。