これがまさにそれを行うために私が使用する手順です
PROCEDURE StreamAttachmentToConn( p_conn IN OUT utl_smtp.connection
,p_boundary IN raw
,p_FileName IN VARCHAR2
,p_FileData IN BLOB) PARALLEL_ENABLE
AS
l_len integer := 0 ;
l_idx integer := 1 ;
l_buff_size integer := 57 ;
l_raw raw(57) ;
BEGIN
-- Attachment
utl_smtp.write_data( p_conn, '--' || p_boundary || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Type: application/octet-stream' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Disposition: attachment; ' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, ' filename="' || p_FileName || '"' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, utl_tcp.crlf );
-- Loop through the blob
-- chuck it up into 57-byte pieces
-- and base64 encode it and write it into the mail buffer
l_len := dbms_lob.getlength(p_FileData);
-- force reinit on this may change
l_buff_size := 57 ;
l_idx := 1;
while l_idx < l_len loop
dbms_lob.read( p_FileData , l_buff_size, l_idx, l_raw );
utl_smtp.write_raw_data( p_conn, utl_encode.base64_encode(l_raw) );
utl_smtp.write_data( p_conn, utl_tcp.crlf );
l_idx := l_idx + l_buff_size;
end loop;
END StreamAttachmentToConn;
これを使用して、1つのメールに複数の添付ファイルを追加します。私にとってはチャンピオンのように機能します。
1つは、p_boundaryが次のように渡されることです。
l_boundary raw(32):= sys_guid();
あなたはすでにl_boundaryを持っているので、それを使用する必要があります。
これは、 http://christopherbeck.wordpress.com/category/plsql/およびhttp://www.oracle-base.com/articles/misc/EmailFromOraclePLSQL.php#attachmentに基づいています
。
次に、コードで、SMTP接続、l_boundary(つまり、RAW sys_guidまたは使用しているもの、ファイルの名前(電子メールの添付ファイルに表示される)、およびBLOB)を渡すだけです。
*編集->追加情報*
私たちのものは、次の仮定と同じです:
->v_offsetが1-で始まると仮定します->v_buffer_sizeは57と仮定します
しかし、私はそれを機能させるためにあなたが従わなければならない順序があることに気づきました(特に、ボディの後にENDの隣にアタッチメントを置いてください!!!
- LOGICを接続する
- すべての受信者を追加します
- ヘッダーロジック: "FROM"、件名
- 本文ロジック(本文など)
- 添付ファイル
- 次に、添付ファイルの後で電子メールを閉じます(これは特に添付ファイルの後にあるものです:
utl_smtp.write_data( l_conn, utl_tcp.crlf );
-- Close Email
utl_smtp.write_data( l_conn, '--' || l_boundary || '--' || utl_tcp.crlf );
utl_smtp.write_data( l_conn, utl_tcp.crlf || '.' || utl_tcp.crlf );
utl_smtp.close_data( l_conn );
utl_smtp.quit( l_conn );