Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 UTL_SMTP "режет" вложения, мальца забодался. гляньте, кому не лень  [new]
badhead
Guest
CREATE OR REPLACE procedure albinos as

  sender varchar2(80) := '<sender@box.ru>';
  recipient1 varchar2(80) := '<sender@box.ru>';
  recipient2 varchar2(80) := '<sender1@box.ru>';
  smtpHost varchar2(80) := '10.10.10.10';
  smtpUser varchar2(256) := 'sender';
  smtpPassword varchar2(256) := 'psw';
  file_name1 varchar2(12) := 'file1.txt';
  file_name2 varchar2(12) := 'file2.txt';
  
 fid UTL_FILE.FILE_TYPE;
 mail_conn utl_smtp.connection;
 subject_letter varchar2(50);
 id_letter varchar2(50);
 date_letter varchar2(50);
 content_charset varchar2(20) := 'Windows-1251';--'CL8ISO8859P5' ; --'CL8MSWIN1251';
 mail_header varchar2(2000);
 len_str number;
 buf varchar2(2000);
 file_name varchar2(12);
 boundary varchar2(50) := '---Factor Dimail---';
 MAX_BASE64_LINE_WIDTH CONSTANT PLS_INTEGER   := 76 / 4 * 3;
 i PLS_INTEGER;
 cnt_str PLS_INTEGER := 0;
 tmp_str varchar2(2000);
 file_exists BOOLEAN;
 file_length NUMBER;
 block_size  NUMBER;

BEGIN

--==========================================================================================
  subject_letter := 'town'; 
  select ' Message-ID: <'||to_char((trunc(sysdate,'DD') - to_date('01011970','DDMMYYYY'))*24*60*60 +
        to_number(to_char(sysdate,'SSSSS')) - 3*60*60)||'_000@box.ru>' into id_letter from dual;
  select 'Date: '||to_char(sysdate,'Dy, DD Mon YYYY HH24:MI:SS')||' +0300' into date_letter  from dual;        
  mail_conn := utl_smtp.open_connection(smtpHost, 25);
  utl_smtp.helo(mail_conn, smtpHost);
  utl_smtp.command(mail_conn, 'AUTH LOGIN');
  utl_smtp.command(
      mail_conn
    , utl_raw.cast_to_varchar2(
        utl_encode.base64_encode(utl_raw.cast_to_raw(smtpUser))
      )
  );
  utl_smtp.command(
      mail_conn
    , utl_raw.cast_to_varchar2(
        utl_encode.base64_encode(utl_raw.cast_to_raw(smtpPassword))
      )
  );

  utl_smtp.mail(mail_conn, sender);
  utl_smtp.rcpt(mail_conn, recipient1);
  utl_smtp.open_data(mail_conn);
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw(id_letter||utl_tcp.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw(date_letter||utl_tcp.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('From: '||sender||utl_tcp.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('To:   '||recipient1||','||utl_tcp.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('      '||recipient2||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Return-Receipt-To: '||recipient1||utl_tcp.CRLF));      
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('X-Confirm-Reading-To: '||recipient1||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Subject:'||subject_letter||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('X-Priority: 3'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('X-Mailer: Dipost (v3.00.05)'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Mime-Version: 1.0'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Type: multipart/mixed; boundary="'||boundary||'"'||UTL_TCP.CRLF));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);

-- если нужно письмо, то вставь его сюда
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('--'||boundary||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Type: text/plain; charset="windows-1251"'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Transfer-Encoding: base64'||UTL_TCP.CRLF));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  utl_smtp.write_raw_data(mail_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(convert('мой славный город','CL8MSWIN1251')||UTL_TCP.CRLF)));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('--'||boundary||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Type: application/octet-stream; name="'||file_name1||'"'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Transfer-Encoding: base64'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Disposition: inline; filename="'||file_name1||'"'||UTL_TCP.CRLF));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);

 UTL_FILE.FGETATTR('DIR_SEND', file_name1, file_exists, file_length, block_size);
 fid := UTL_FILE.FOPEN('DIR_SEND', file_name1, 'r',2000);
 while cnt_str < file_length loop
   UTL_FILE.FSEEK(fid, cnt_str);
   UTL_FILE.GET_LINE(fid, buf,2000);
   len_str := nvl(length(buf),0);
   i   := 1;
     WHILE (i < len_str) LOOP
        IF (i + MAX_BASE64_LINE_WIDTH < len_str) THEN
          utl_smtp.write_raw_data(mail_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(substr(buf, i, MAX_BASE64_LINE_WIDTH))));
        ELSE
          utl_smtp.write_raw_data(mail_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(substr(buf||utl_tcp.CRLF, i))));
        END IF;
       utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
       i := i + MAX_BASE64_LINE_WIDTH;
     END LOOP;
   cnt_str := cnt_str+len_str+2 -1; -- + CRLF - начальное значение cnt_str
  end loop;
  UTL_FILE.fCLOSE(fid);
  
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('--'||boundary||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Type: application/octet-stream; name="'||file_name2||'"'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Transfer-Encoding: base64'||UTL_TCP.CRLF));
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('Content-Disposition: inline; filename="'||file_name2||'"'||UTL_TCP.CRLF));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);

 cnt_str := 0;
 UTL_FILE.FGETATTR('DIR_SEND', file_name2, file_exists, file_length, block_size);
 fid := UTL_FILE.FOPEN('DIR_SEND', file_name2, 'r',2000);
 while cnt_str < file_length loop
   UTL_FILE.FSEEK(fid, cnt_str);
   UTL_FILE.GET_LINE(fid, buf,2000);
   len_str := nvl(length(buf),0);
   i   := 1;
     WHILE (i < len_str) LOOP
        IF (i + MAX_BASE64_LINE_WIDTH < len_str) THEN
          utl_smtp.write_raw_data(mail_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(substr(buf, i, MAX_BASE64_LINE_WIDTH))));
        ELSE
          utl_smtp.write_raw_data(mail_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(substr(buf||utl_tcp.CRLF, i))));
        END IF;
       utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
       i := i + MAX_BASE64_LINE_WIDTH;
     END LOOP;
   cnt_str := cnt_str+len_str+2 -1; -- + CRLF - начальное значение cnt_str
  end loop;
    UTL_FILE.fCLOSE(fid);

  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  utl_smtp.write_raw_data(mail_conn, UTL_RAW.cast_to_raw('--'||boundary||'--'||UTL_TCP.CRLF));
  utl_smtp.write_data(mail_conn, utl_tcp.CRLF);
  utl_smtp.close_data(mail_conn);
  utl_smtp.quit(mail_conn);

EXCEPTION
  WHEN OTHERS
    THEN
    DBMS_OUTPUT.PUT_LINE (CONCAT('UTL_FILE error: ', SQLERRM));
    UTL_FILE.FCLOSE (fid);
    utl_smtp.close_data(mail_conn);
    utl_smtp.quit(mail_conn);
END albinos;
/
Первый файл приблизительно 2 кБайт проходит весь, а второй, размером 8 кБайт обрезается до 6077 байт.
Что не так, подскажите, пожалуйста.
Спасибо за внимание.
30 июл 09, 12:24    [7478338]     Ответить | Цитировать Сообщить модератору
 Re: UTL_SMTP "режет" вложения, мальца забодался. гляньте, кому не лень  [new]
ERROR MESSAGE
Member

Откуда: Москва
Сообщений: 376
Смотреть лень, друже.
Почитай RFC про почту, мож тама что понадыбаешь
Попроверь точно что-где режется. Мабуть ето у тебя UTL_FILE не дочитывает чего-то тама

постскрипт. Мальца не режь, он ещщё пригодится. Пусть растет ))
30 июл 09, 13:15    [7478825]     Ответить | Цитировать Сообщить модератору
 Re: UTL_SMTP "режет" вложения, мальца забодался. гляньте, кому не лень  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
badhead,

имхо, utl_smtp тут не при чем.
посмотрите где сколько символов/байт читаете-пишите.
сложить можно (хотя бы и в столбик) - сразу найдёте течь
30 июл 09, 13:33    [7478952]     Ответить | Цитировать Сообщить модератору
 Re: UTL_SMTP "режет" вложения, мальца забодался. гляньте, кому не лень  [new]
badhead
Guest
разобрался. сам накосячил
30 июл 09, 17:07    [7480610]     Ответить | Цитировать Сообщить модератору
 Re: UTL_SMTP "режет" вложения, мальца забодался. гляньте, кому не лень  [new]
ERROR MESSAGE
Member

Откуда: Москва
Сообщений: 376
badhead
разобрался. сам накосячил
И кто же тваво мальца-то резал? ))
4 авг 09, 13:34    [7495465]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить