PL / SQL отправить письмо с вложением? - PullRequest
4 голосов
/ 13 октября 2011

у нас есть таблица с файлами, сохраненными как BLOB

Я пишу код, который отправляет эти файлы по электронной почте в виде вложений!

пока все работает нормально, но файлы (EXCEL, PDF, ... что угодно) не читаются программами, открываются только текстовые файлы и Excel, но после некоторого сообщения об ошибке, когда все PDF-файлы не открываются в все!

вот часть кода, о которой идет речь!

utl_smtp.write_data( l_connection, '--'|| l_boundary || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Type: application/octet-stream' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Disposition: attachment; filename="' || V_NAME || '"' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data( l_connection, utl_tcp.crlf );   

v_length := dbms_lob.getlength(V_BLOB_CONTENT);     

while v_offset < v_length loop
       dbms_lob.read( V(i).BLOB_CONTENT, v_buffer_size, v_offset, v_raw );
       utl_smtp.write_raw_data( l_connection, utl_encode.base64_encode(v_raw) );
       utl_smtp.write_data( l_connection, utl_tcp.crlf );
       v_offset := v_offset + v_buffer_size;
end loop while_loop;     

utl_smtp.write_data( l_connection, utl_tcp.crlf );

есть предложения?

Ответы [ 2 ]

7 голосов
/ 13 октября 2011

вот процедура, которую я использую, чтобы сделать это

  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 после тела !!!

  1. Подключить ЛОГИКУ
  2. добавить всех получателей
  3. ЛОГИКА Заголовка: "ОТ", Тема
  4. Логика тела (основной текст и т. Д.)
  5. Вложения
  6. затем после вложений закройте письмо (именно это у меня после вложений:

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 );
5 голосов
/ 13 октября 2011

У Тим Холла есть отличный сайт ( oracle-base ), в котором есть то, что вы ищете.Обратите внимание, в частности, как выполняется кодировка.

Я использовал аналогичный код для отправки писем через pl / sql без проблем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...