вот процедура, которую я использую, чтобы сделать это
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;
Я использую это для добавления нескольких вложений к одному письму. работает как чемпион для меня.
одна вещь, p_boundary передается как
l_boundary raw (32): = sys_guid ();
Я вижу, что у вас уже есть l_boundary, и это то, что вы должны использовать.
это основано на http://christopherbeck.wordpress.com/category/plsql/, а также http://www.oracle -base.com / article / misc / EmailFromOraclePLSQL.php # attachment
.
затем в своем коде просто передайте соединение SMTP, l_boundary (то есть RAW sys_guid или что вы используете, имя файла (как оно будет отображаться во вложении электронной почты) и BLOB.
* РЕДАКТИРОВАТЬ -> дополнительная информация *
Наши те же с предположением:
-> предположим, v_offset начинается с 1
-> v_buffer_size предполагает 57
Но Я заметил, что есть порядок, которому вы должны следовать, чтобы заставить его работать (в частности, поместите вложения рядом с END после тела !!!
- Подключить ЛОГИКУ
- добавить всех получателей
- ЛОГИКА Заголовка: "ОТ", Тема
- Логика тела (основной текст и т. Д.)
- Вложения
- затем после вложений закройте письмо (именно это у меня после вложений:
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 );