2015-09-23 2 views
0

Мне нужно отправить электронное письмо с вложением и текстом в Oracle. Раньше я использовал UTL_MAIL, но с этой функцией вложения не могут иметь размер больше, чем (я думаю) 32K. Поэтому я попытался отправить его с помощью UTL_SMTP, который лучше работает для вложений.Вложение UTL_SMTP с почтовым текстом

Это мой код до сих пор:

c := UTL_SMTP.OPEN_CONNECTION(mailserver); 
    UTL_SMTP.helo (c, mailserver); 
    UTL_SMTP.MAIL(c, sFrom); 
    UTL_SMTP.RCPT(c, sTo); 
    UTL_SMTP.OPEN_DATA(c); 


    UTL_SMTP.write_data(c, 'From: ' || sFrom || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'To: ' || sTo || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'Subject: ' || REPLACE(crec.descr, '[DATE]',TO_CHAR(sDATE,'DD.MM.YYYY')) || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'MIME-Version: 1.0' || UTL_TCP.crlf); 

    UTL_SMTP.write_data(c, 'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'This is a multi-part message in MIME format.' || UTL_TCP.crlf); 

    UTL_SMTP.write_data(c, '--' || c_mime_boundary || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'Content-Type: text/plain' || UTL_TCP.crlf); 

    -- Set up attachment header 
    UTL_SMTP.write_data(c, 'Content-Disposition: attachment; filename="' || 'your_file_name.csv' || '"' || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, UTL_TCP.crlf); 

    -- Write attachment contents 

    v_len := DBMS_LOB.getlength(cREPORT); 
    v_index := 1; 

    WHILE v_index <= v_len 
    LOOP 
    UTL_SMTP.write_data(c, DBMS_LOB.SUBSTR(cREPORT, 32000, v_index)); 
    v_index := v_index + 32000; 
    END LOOP; 

    -- 
    -- End attachment 
    UTL_SMTP.write_data(c, UTL_TCP.crlf); 
    -- MY TEXT: 
    UTL_SMTP.write_data(c, 'This is a text.' || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, '--' || c_mime_boundary || '--' || UTL_TCP.crlf); 

    UTL_SMTP.CLOSE_DATA(c); 
    UTL_SMTP.QUIT(c); 

Так электронная почта с приложением работает как шарм, но текст письма не были отправить в электронной почте. Можно ли отправить его с помощью вложения + текста?

+0

В каком коде вы пытаетесь отправить основной текст сообщения электронной почты? Мне кажется, что вы просто отправляете одно приложение, за которым следует маркер границы. – Ben

+0

@Ben обновил код. В моей процедуре PLSQL в SQL Navigator я уже пытался отправить текстовое тело в электронном письме. Но без успеха – ZerOne

ответ

1

Итак, я уже ответил на свой вопрос. Вы должны использовать c_mime_boundary как разделитель между содержимым почты и содержимым вложения. Это означает следующее:

c := UTL_SMTP.OPEN_CONNECTION(mailserver); 

    UTL_SMTP.helo (c, mailserver); 
    UTL_SMTP.MAIL(c, sFrom); 
    UTL_SMTP.RCPT(c, sTo); 
    UTL_SMTP.OPEN_DATA(c); 


    UTL_SMTP.write_data(c, 'From: ' || sFrom || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'To: ' || sTo || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'Subject: ' || REPLACE(crec.descr, '[DATE]',TO_CHAR(sDATE,'DD.MM.YYYY')) || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'MIME-Version: 1.0' || UTL_TCP.crlf); 

    UTL_SMTP.write_data(c, 'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf); 

    -- Mail body: 
    UTL_SMTP.write_data(c, '--' || c_mime_boundary || UTL_TCP.crlf); //new 
    UTL_SMTP.write_data(c, 'Content-Type: text/plain' || UTL_TCP.crlf); //new 
    UTL_SMTP.write_data(c, 'Text' || UTL_TCP.crlf); //new 

    -- Set up attachment header 
    UTL_SMTP.write_data(c, '--' || c_mime_boundary || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'Content-Type: text/plain' || UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, 'Content-Disposition: attachment; filename="' || 'your_file_name.csv' || '"' || UTL_TCP.crlf); 

    -- Write attachment contents 
    v_len := DBMS_LOB.getlength(cREPORT); 
    v_index := 1; 

    WHILE v_index <= v_len 
    LOOP 
    UTL_SMTP.write_data(c, DBMS_LOB.SUBSTR(cREPORT, 32000, v_index)); 
    v_index := v_index + 32000; 
    END LOOP; 

    -- End attachment 
    UTL_SMTP.write_data(c, UTL_TCP.crlf); 
    UTL_SMTP.write_data(c, '--' || c_mime_boundary || '--' || UTL_TCP.crlf); 

    UTL_SMTP.CLOSE_DATA(c); 
    UTL_SMTP.QUIT(c); 
0

Я думаю, вам нужно скопировать

UTL_SMTP.write_data(c, 'Content-Type: text/plain' || UTL_TCP.crlf); 

вверх над

UTL_SMTP.write_data(c, 'This is a multi-part message in MIME format.' || UTL_TCP.crlf); 

Это должно позволить ему знать, какой тип текста он ожидает.

Cheers

+0

Где я должен поставить первую строку? Я попытался вставить его после вложения, но это не работает – ZerOne