Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Отправка письма посредством UTL_SMTP  [new]
Linuxod
Member

Откуда:
Сообщений: 15
Добрый день.

Столкнулся с проблемой следующего характера. На БД Oracle могу отправить письмо без вложения с текстом в формате HTML и письмо с вложением, но без самого тела сообщения. Коды обоих операций прилагаю. Проблема моя в том, что я не могу совместить одновременно посылку в одном письме, чтобы у него было тело сообщения и вложение. Помогите пожалуйста. Заранее благодарен.

--Скрипт для оправки письма с телом сообщения, но без вложения

declare
  mail_conn utl_smtp.connection;
  boundary VARCHAR2(50) := '-----7D81B75CCC90DFRW4F7A1CBD';
  bmes clob;
  bb blob;
  amt CONSTANT BINARY_INTEGER := 48; -- 48bytes binary convert to 128bytes of base64.
  v_amt BINARY_INTEGER;
  ps BINARY_INTEGER := 1;
  vRAW varchar2(48);
  sel varchar2(150);
  recipient varchar2(50);
  
  v_length      NUMBER :=0;
  v_offset      NUMBER := 1;  
  v_buffer_size NUMBER := 10240;
  v_raw         RAW(10240);  

  PROCEDURE send_header(NAME   IN  VARCHAR2,
                        header IN  VARCHAR2) AS
  BEGIN
    utl_smtp.write_data(mail_conn, name || ': ' || header || utl_tcp.crlf);
  END ;

BEGIN
  mail_conn := utl_smtp.open_connection('mx.domen.ru', 25);
  utl_smtp.helo(mail_conn, 'mx.domen.ru');
  utl_smtp.mail(mail_conn, 'web_serv@domen.ru');
  recipient := 'user'||'@domen.ru';
  utl_smtp.rcpt(mail_conn, recipient);
  utl_smtp.open_data(mail_conn);

  send_header('Content-Type', 'text/html;charset=windows-1251');
  send_header('To',      '"Specially for you" ');


  utl_smtp.write_raw_data(mail_conn,
                          utl_raw.cast_to_raw('subject: ' || 'Thema'|| utl_tcp.crlf));
   UTL_SMTP.WRITE_RAW_DATA(mail_conn,
                          UTL_RAW.CAST_TO_RAW(UTL_TCP.CRLF));
  select t.html into bb from tmp_t1 t where t.name = 't8';
  dbms_lob.open(bb, dbms_lob.file_readonly);
  v_length := dbms_lob.getlength(bb);                           
  WHILE v_offset < v_length 
  LOOP 
       dbms_lob.read(bb, v_buffer_size, v_offset, v_raw );
       utl_smtp.write_raw_data(mail_conn, v_raw);
       v_offset := v_offset + v_buffer_size;
  END LOOP;
  dbms_lob.close(bb);  


  utl_smtp.close_data(mail_conn);
  utl_smtp.quit(mail_conn);
  rollback;
  
  EXCEPTION WHEN OTHERS THEN
            begin
            dbms_output.put_line('postman err send_mail SQLERRM= '||substr(SQLERRM,1,200));
            dbms_lob.close(bmes);
            dbms_lob.close(bb);
            end;

END;
-----------------------
--Скрипт для оправки письма с вложением, но без тела письма

declare
  mail_conn utl_smtp.connection;
  boundary VARCHAR2(50) := '-----7D81B75CCC90DFRW4F7A1CBD';
  bmes clob;
  bb blob;
  amt CONSTANT BINARY_INTEGER := 48; -- 48bytes binary convert to 128bytes of base64.
  v_amt BINARY_INTEGER;
  ps BINARY_INTEGER := 1;
  vRAW varchar2(48);
  sel varchar2(150);
  recipient varchar2(50);
  
  v_length      NUMBER :=0;
  v_offset      NUMBER := 1;  
  v_buffer_size NUMBER := 10240;
  v_raw         RAW(10240);  

  PROCEDURE send_header(NAME   IN  VARCHAR2,
                        header IN  VARCHAR2) AS
  BEGIN
    utl_smtp.write_data(mail_conn, name || ': ' || header || utl_tcp.crlf);
  END ;
  


FUNCTION ENCODE(str IN VARCHAR2, tp IN VARCHAR2 DEFAULT 'Q') RETURN VARCHAR2 IS
 BEGIN
   IF tp='B' THEN
     RETURN '=?utf-8?b?'|| UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw (CONVERT (SUBSTR(str,1,24), 'UTF8'))))|| '?='
       || CASE WHEN SUBSTR(str,25) IS NOT NULL THEN utl_tcp.crlf || ' '|| ENCODE(SUBSTR(str,25),tp) END;
   ELSIF tp='Q' THEN
     RETURN '=?utf-8?q?' || UTL_RAW.cast_to_varchar2(utl_encode.QUOTED_PRINTABLE_ENCODE(utl_raw.cast_to_raw(CONVERT (SUBSTR(str,1,8), 'UTF8') ))) || '?='
       || CASE WHEN SUBSTR(str,9) IS NOT NULL THEN utl_tcp.crlf || ' '|| ENCODE(SUBSTR(str,9),tp) END;
   ELSE
     RETURN str;
   END IF;
 END;

BEGIN
  sel := 'insert into web_serv_cache 
    select 
      c.result, c.task_name 
    from i_s.web_serv_detail_1@dblink c
    where c.task_name = ''T19''';
  execute immediate sel;
  sel := 'select result from web_serv_cache where task_name = ''T19''';
  execute immediate sel into bmes;
  mail_conn := utl_smtp.open_connection('mx.domen.ru', 25);
  utl_smtp.helo(mail_conn, 'mx.domen.ru');
  utl_smtp.mail(mail_conn, 'web_serv@domen.ru');
  recipient := 'user'||'@domen.ru';
  utl_smtp.rcpt(mail_conn, recipient);
  utl_smtp.open_data(mail_conn);

  utl_smtp.write_data(mail_conn, 'MIME-version: 1.0' || UTL_TCP.CRLF );
  utl_smtp.write_data(mail_conn, 'Content-Type: multipart/mixed;'|| UTL_TCP.CRLF );
  utl_smtp.write_data(mail_conn, ' boundary="'||boundary||'"'|| UTL_TCP.CRLF );
  utl_smtp.write_data(mail_conn, UTL_TCP.CRLF );

  utl_smtp.write_data(mail_conn, '--'|| boundary || utl_tcp.crlf );
  utl_smtp.write_data(mail_conn, 'Content-Type:application/excel;'|| utl_tcp.crlf );
  utl_smtp.write_data(mail_conn, ' name="');
  utl_smtp.write_raw_data(mail_conn,utl_raw.cast_to_raw('T19.csv'));
  utl_smtp.write_data(mail_conn, '"' || utl_tcp.crlf);
  utl_smtp.write_data(mail_conn, 'Content-Disposition: attachment;'|| utl_tcp.crlf );  
  utl_smtp.write_data(mail_conn, ' filename="' || ENCODE('T19.csv') || '"' || utl_tcp.crlf);
  utl_smtp.write_data(mail_conn, utl_tcp.crlf );
  dbms_lob.open(bmes, dbms_lob.file_readonly);
  ps:=1; v_amt:=amt;
  LOOP
    BEGIN
      dbms_lob.read (bmes, v_amt, ps, vRAW);
      ps := ps + v_amt;
      utl_smtp.write_raw_data(mail_conn, UTL_RAW.CAST_TO_RAW(vRAW));
      EXCEPTION WHEN no_data_found THEN EXIT;
    END;
  END LOOP;
  dbms_lob.close(bmes);
  utl_smtp.write_data(mail_conn, utl_tcp.crlf );
  utl_smtp.write_data(mail_conn, utl_tcp.crlf );
  utl_smtp.write_data(mail_conn, '--' || boundary || '--');

  utl_smtp.close_data(mail_conn);
  utl_smtp.quit(mail_conn);
  rollback;
  
  EXCEPTION WHEN OTHERS THEN
            begin
            dbms_output.put_line('postman err send_mail SQLERRM= '||substr(SQLERRM,1,200));
            dbms_lob.close(bmes);
            dbms_lob.close(bb);
            end;

END;
20 июн 11, 10:21    [10838640]     Ответить | Цитировать Сообщить модератору
 Re: Отправка письма посредством UTL_SMTP  [new]
Ден
Member

Откуда: Москва
Сообщений: 2076
Linuxod,

я на Java сделал.. гдето на сайте был пример. Но у меня была проблема с размером отправляемого файла, у utl_smtp вроде ограничение 32Кб
20 июн 11, 11:02    [10838914]     Ответить | Цитировать Сообщить модератору
 Re: Отправка письма посредством UTL_SMTP  [new]
stalker_cop
Member

Откуда:
Сообщений: 92
https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=729238&pg=1&hl=utl_smtp
21 июн 11, 17:22    [10849186]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить