powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача письма с вложением. Готовое решение
25 сообщений из 274, страница 2 из 11
Передача письма с вложением. Готовое решение
    #36704154
chameleon82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Ildar_andrey_anonymous_Ildar_Обойти бы это ограничение по размеру тела письма и все было бы ОК!
Шлите письма html-аттачем, как поступают все современные спамеры :)
Это мысль. Надо попробовать.
Все верно, создаете аттач, делаете его типом html или txt, прикрепляете первым, затем остальные атачи. Работает безотказно. Я таким образом посылал хтмлки с картинками.
Еще, если позволите, вопрос. В каком типе переменной у Вас хранится письмо такого размера? В Clob?
По идее можно дописать пакет, на вход подавая CLOB, т.е. два метода SEND, один с варчар, второй с клоб, кому как удобнее )
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36708919
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chameleon82,

Автору выражаю огромную благодарность !
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36710052
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chameleon82Вот моя последняя версия )

Код: plaintext
1.
2.
3.
4.
5.
6.
...
    utl_smtp.Mail(v_Mail_Conn, sndr.rcptmail);
    FOR rcpts IN  1  .. rcptlist.count
	LOOP
	  utl_smtp.Rcpt(v_Mail_Conn, rcptlist(rcpts).rcptmail);
	END LOOP;


Рекомендую перечитать в RFC 2822 раздел, касающийся синтаксиса адреса (3.4). То, что некоторые SMTP-серверы проглотят reverse-path и forward-path без обрамляющих < и >, вовсе не означает, что так сделают все.

Для пробы попробуйте отправить письмо Вашим пакетом через SMTP-сервер GMail. Получите:
Код: plaintext
555 5.5.2 Syntax error.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36835740
Glum1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автору огромное спасибо!
давно хотел разобраться с этой темой, но как всегда руки не доходили.
доработал для blob и пошагового заполнения текста сообщения, работает действительно безотказно!

но появился такой вопрос:
возможно ли отправлять сообщения на виндусовый msn messenger ?
ситуация такая что не на всех компах настроен outlook express, а необходимость оповещения не уменьшилась.

буду благодарен любой полезной информации
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36840989
stalker_cop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Если кому интересно могу отписать как отправить вложение больше чем 32К!
Прикол заключается в том что необходимо закодировать в base64 blob
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36841076
stalker_cop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используйте следующие процедуры для кодирования и декодирования в base64

{src}

PROCEDURE Encode_Base64(p_Src IN OUT NOCOPY BLOB
,p_Dst IN OUT NOCOPY BLOB) IS
c_Max_Length_Base64 CONSTANT PLS_INTEGER := 22848;
/*
c_Max_Length_Base64 НЕ МЕНЯТЬ
Она подобранна специальным образом
Исходя из следующих соображений
32767 - максимальный размер буфера что оракл может сконвертить (на выходе)
поэтому на входе необходимо подать 32767*0.7 = 22936 байт
(особенности base64 (три байта конвертятся в четыре))
Другой особенностью является то что сконвертированный текст режится на строки по 64 символа
Так как алгоритм построен просто на склейке выходных данных (после кодирования)
то необходимо основные данные резать так чтоб длинна была кратна 3 чтоб в конце не было
символов "="
Но и этого не достаточно когда обрабатываются куски входного потока то
размер обрабобтанного куска должен быть кратен 64
поэтому получаем следующее 64*3*n < 22936
путем не сложных вычислений получаем что n = 119
64*3*119 = 22848
вот так получена эта цифра
можно былобы по другому (вырезать переводы корретки а потом резать по 64 и добавлять
переводу коретки по моему это лишнее)
*/
i_Pos INTEGER := 1;
n_Amount BINARY_INTEGER := c_Max_Length_Base64;
i_Pos_w INTEGER := 1;
n_Amount_w BINARY_INTEGER;
a_Raw RAW(32767);
n_Length_Src INTEGER;
BEGIN
IF p_Src IS NOT NULL
AND Dbms_Lob.Getlength(p_Src) != 0 THEN
Dbms_lob.Createtemporary(p_Dst,FALSE);
n_Length_Src := Dbms_Lob.Getlength(p_Src);
LOOP
IF i_Pos + c_Max_Length_Base64 - 1 <= n_Length_Src THEN
n_Amount := c_Max_Length_Base64;
ELSE
n_Amount := n_Length_Src - i_Pos + 1;
END IF;
a_Raw := Utl_Encode.Base64_Encode(Dbms_Lob.Substr(p_Src, n_Amount, i_Pos));
n_Amount_w := Utl_Raw.Length(a_Raw);
Dbms_lob.Write(p_Dst, n_Amount_w, i_Pos_w, a_Raw);
i_Pos_w := n_Amount_w + i_Pos_w;
i_Pos := n_Amount + i_Pos;
EXIT WHEN i_Pos >= n_Length_Src;
END LOOP;
END IF;
END;

PROCEDURE Decode_Base64(p_Src IN OUT NOCOPY BLOB
,p_Dst IN OUT NOCOPY BLOB) IS
c_Max CONSTANT PLS_INTEGER := 32736;
/*
c_Max НЕ МЕНЯТЬ
Она подобранна специальным образом
Исходя из следующих соображений
32767 - максимальный размер буфера что оракл может сконвертить (на входе)
на выходе получится примерно 32767*0.7 = 22936 байт
(особенности base64 (три байта конвертятся в четыре))
Другой особенностью является то что сконвертированный текст режится на строки по 64 символа
Так как алгоритм построен просто на склейке выходных данных (после декодирования)
то необходимо основные данные резать так чтоб длинна была кратна 4
Но и этого не достаточно когда обрабатываются куски входного потока
они порезаны по строчкам длинной 66 символов (64 основных и 2 символа перевода корректки 13+10)
поэтому получаем следующее 66*4*n < 32767
путем не сложных вычислений получаем что n = 119
66*4*124 = 32736
вот так получена эта цифра
*/

a_Part RAW(32764);
i_Pos INTEGER := 1;
n_Amount BINARY_INTEGER := c_Max;
i_Pos_w INTEGER := 1;
n_Amount_w BINARY_INTEGER;
n_Length_Src INTEGER;
BEGIN
IF p_Src IS NOT NULL
AND Dbms_Lob.Getlength(p_Src) != 0 THEN
Dbms_lob.Createtemporary(p_Dst,FALSE);
n_Length_Src := Dbms_Lob.Getlength(p_Src);
LOOP
IF i_Pos + c_Max - 1 <= n_Length_Src THEN
n_Amount := c_Max;
ELSE
n_Amount := n_Length_Src - i_Pos + 1;
END IF;
a_Part := Utl_Encode.Base64_Decode(Dbms_Lob.Substr(p_Src, n_Amount, i_Pos));
n_Amount_w := Utl_raw.Length(a_Part);
Dbms_lob.Write(p_Dst, n_Amount_w, i_Pos_w, a_Part);
i_Pos_w := n_Amount_w + i_Pos_w;
i_Pos := n_Amount + i_Pos;
EXIT WHEN i_Pos >= n_Length_Src;
END LOOP;
END IF;
END;


PROCEDURE Parse_Blob(p_Blob IN BLOB
,t_Raw_Tab IN OUT NOCOPY Raw_Table) IS
c_Cr CONSTANT RAW(2) := Utl_Raw.Cast_To_Raw(Chr(13)||chr(10));
i_Blob_Length INTEGER;
Part_Blob RAW(100);
i PLS_INTEGER := 1;
Pos_CR PLS_INTEGER := 1;
BEGIN
t_Raw_Tab.DELETE();
IF p_Blob IS NOT NULL THEN
i_Blob_Length := dbms_lob.GetLength(p_Blob);
LOOP
Pos_CR := dbms_lob.instr(p_Blob, c_Cr, i);
IF Pos_CR != 0 THEN
Part_Blob := dbms_lob.substr(p_Blob,Pos_CR-i,i);
i := Pos_CR + 2;
ELSE
Part_Blob := dbms_lob.substr(p_Blob,i_Blob_Length-i,i);
i := i_Blob_Length;
END IF;
t_Raw_Tab(t_Raw_Tab.Count()+1) := Part_Blob;
EXIT WHEN i >= i_Blob_Length;
END LOOP;
END IF;
END;
{/src}
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36841079
stalker_cop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
 PROCEDURE Encode_Base64(p_Src IN OUT NOCOPY BLOB
                        ,p_Dst IN OUT NOCOPY BLOB) IS
 c_Max_Length_Base64  CONSTANT PLS_INTEGER :=  22848 ;
/*  
 c_Max_Length_Base64 НЕ МЕНЯТЬ 
 Она подобранна специальным образом
 Исходя из следующих соображений
 32767 - максимальный размер буфера что оракл может сконвертить (на выходе)
 поэтому на входе необходимо подать 32767*0.7 = 22936 байт
 (особенности base64 (три байта конвертятся в четыре))
 Другой особенностью является то что сконвертированный текст режится на строки по 64 символа 
 Так как алгоритм построен просто на склейке выходных данных (после кодирования)
 то необходимо основные данные резать так чтоб длинна была кратна 3 чтоб в конце не было 
 символов "="
 Но и этого не достаточно когда обрабатываются куски входного потока то 
 размер обрабобтанного куска должен быть кратен 64 
 поэтому получаем следующее 64*3*n < 22936 
 путем не сложных вычислений получаем что n = 119
 64*3*119 = 22848 
 вот так получена эта цифра
 можно былобы по другому (вырезать переводы корретки а потом резать по 64 и добавлять
 переводу коретки по моему это лишнее)
*/
 i_Pos                INTEGER :=  1 ;
 n_Amount             BINARY_INTEGER := c_Max_Length_Base64;
 i_Pos_w              INTEGER :=  1 ;
 n_Amount_w           BINARY_INTEGER;
 a_Raw                RAW( 32767 );
 n_Length_Src         INTEGER;
BEGIN
 IF p_Src IS NOT NULL
    AND Dbms_Lob.Getlength(p_Src) !=  0  THEN
  Dbms_lob.Createtemporary(p_Dst,FALSE);
  n_Length_Src := Dbms_Lob.Getlength(p_Src);
  LOOP
   IF i_Pos + c_Max_Length_Base64 -  1  <= n_Length_Src THEN
     n_Amount := c_Max_Length_Base64;
    ELSE
     n_Amount := n_Length_Src - i_Pos +  1 ;
   END IF;
   a_Raw := Utl_Encode.Base64_Encode(Dbms_Lob.Substr(p_Src, n_Amount, i_Pos));
   n_Amount_w := Utl_Raw.Length(a_Raw);
   Dbms_lob.Write(p_Dst, n_Amount_w, i_Pos_w, a_Raw);
   i_Pos_w := n_Amount_w + i_Pos_w;
   i_Pos := n_Amount + i_Pos;
   EXIT WHEN i_Pos >= n_Length_Src;
  END LOOP;
 END IF;
END;

PROCEDURE Decode_Base64(p_Src IN OUT NOCOPY BLOB
                       ,p_Dst IN OUT NOCOPY BLOB) IS
 c_Max                CONSTANT PLS_INTEGER :=  32736 ;
/*  
 c_Max НЕ МЕНЯТЬ 
 Она подобранна специальным образом
 Исходя из следующих соображений
 32767 - максимальный размер буфера что оракл может сконвертить (на входе)
 на выходе получится примерно 32767*0.7 = 22936 байт
 (особенности base64 (три байта конвертятся в четыре))
 Другой особенностью является то что сконвертированный текст режится на строки по 64 символа 
 Так как алгоритм построен просто на склейке выходных данных (после декодирования)
 то необходимо основные данные резать так чтоб длинна была кратна 4 
 Но и этого не достаточно когда обрабатываются куски входного потока 
 они порезаны по строчкам длинной 66 символов (64 основных и 2 символа перевода корректки 13+10) 
 поэтому получаем следующее 66*4*n < 32767 
 путем не сложных вычислений получаем что n = 119
 66*4*124 = 32736 
 вот так получена эта цифра
*/

 a_Part               RAW( 32764 );
 i_Pos                INTEGER :=  1 ;
 n_Amount             BINARY_INTEGER := c_Max;
 i_Pos_w              INTEGER :=  1 ;
 n_Amount_w           BINARY_INTEGER;
 n_Length_Src         INTEGER;
BEGIN
 IF p_Src IS NOT NULL
    AND Dbms_Lob.Getlength(p_Src) !=  0  THEN
  Dbms_lob.Createtemporary(p_Dst,FALSE);
  n_Length_Src := Dbms_Lob.Getlength(p_Src);
  LOOP
   IF i_Pos + c_Max -  1  <= n_Length_Src THEN
     n_Amount := c_Max;
    ELSE
     n_Amount := n_Length_Src - i_Pos +  1 ;
   END IF;
   a_Part := Utl_Encode.Base64_Decode(Dbms_Lob.Substr(p_Src, n_Amount, i_Pos));
   n_Amount_w := Utl_raw.Length(a_Part);
   Dbms_lob.Write(p_Dst, n_Amount_w, i_Pos_w, a_Part);
   i_Pos_w := n_Amount_w + i_Pos_w;
   i_Pos := n_Amount + i_Pos;
   EXIT WHEN i_Pos >= n_Length_Src;
  END LOOP;
 END IF;
END;


 PROCEDURE Parse_Blob(p_Blob IN BLOB
                     ,t_Raw_Tab IN OUT NOCOPY Raw_Table) IS
  c_Cr          CONSTANT RAW( 2 ) := Utl_Raw.Cast_To_Raw(Chr( 13 )||chr( 10 ));
  i_Blob_Length INTEGER;
  Part_Blob     RAW( 100 );
  i             PLS_INTEGER :=  1 ;
  Pos_CR        PLS_INTEGER :=  1 ;
  BEGIN
   t_Raw_Tab.DELETE();
   IF p_Blob IS NOT NULL THEN
    i_Blob_Length := dbms_lob.GetLength(p_Blob);
    LOOP
     Pos_CR := dbms_lob.instr(p_Blob, c_Cr, i);
     IF Pos_CR !=  0  THEN
       Part_Blob := dbms_lob.substr(p_Blob,Pos_CR-i,i);
       i := Pos_CR +  2 ;
      ELSE
       Part_Blob := dbms_lob.substr(p_Blob,i_Blob_Length-i,i);
       i := i_Blob_Length;
     END IF;
     t_Raw_Tab(t_Raw_Tab.Count()+ 1 ) := Part_Blob;
     EXIT WHEN i >= i_Blob_Length;
    END LOOP;
   END IF;
 END;
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36854393
chameleon82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glum1111 автору огромное спасибо!
давно хотел разобраться с этой темой, но как всегда руки не доходили.
доработал для blob и пошагового заполнения текста сообщения, работает действительно безотказно!


Спасибо. А Вы могли бы выложить код, который получился?

Glum1111
но появился такой вопрос:
возможно ли отправлять сообщения на виндусовый msn messenger ?
ситуация такая что не на всех компах настроен outlook express, а необходимость оповещения не уменьшилась.

буду благодарен любой полезной информации

Если протокол открытый, то можно, хотя с почтой мне кажется здесь мало общего. Можно также уведомления слать в icq, тут только проблема в том, что вроде никто еще не делал заготовок для работы с протоколом оскар на оракле, но вот на пхп очень много поделок, например http://wip.asminog.com, поэтому у кого есть силы и желание, можете переложить код на оракл, было бы клево.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36854394
chameleon82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stalker_copВсем привет!
Если кому интересно могу отписать как отправить вложение больше чем 32К!
Прикол заключается в том что необходимо закодировать в base64 blob
Спасибо за код. А Вы могли бы привести пример работы с Вашим кодом? Я так понял изначальный блоб должен храниться в бд? Как вариант в таком случае можно блоб сохранить во временный файл, тогда пакет его скушает без особых проблем.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36854607
Автору для размышлений.
Бинарники и архивы содержат специфичные символы (например, с кодом 0).
Естественно, данный пакет работать с ними не будут.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36854660
chameleon82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПредлагающийАвтору для размышлений.
Бинарники и архивы содержат специфичные символы (например, с кодом 0).
Естественно, данный пакет работать с ними не будут.
Прикрепляемые файлы переводятся в base64, в чем проблема то? Все работает, бинарники и архивы отправляются без проблем.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36861562
stalker_cop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chameleon82stalker_copВсем привет!
Если кому интересно могу отписать как отправить вложение больше чем 32К!
Прикол заключается в том что необходимо закодировать в base64 blob
Спасибо за код. А Вы могли бы привести пример работы с Вашим кодом? Я так понял изначальный блоб должен храниться в бд? Как вариант в таком случае можно блоб сохранить во временный файл, тогда пакет его скушает без особых проблем.

Всем привет
Я просто предоставил три процедурки которые кодируют и раскодируют блоб в/из base64. В последнем варианте отправки писем отредактировать вызов utl_smtp.write_raw_data(v_Mail_Conn, UTL_ENCODE.base64_encode(vRAW)); На то что я представил (но не в лоб там начитка из файла для начала файл в blob а потом нарезать на кусочки и отправить)
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36869516
iceFR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Скажите, а как обстоят дела с отправкой в русской кодировке? пробовал варианты типа:
Код: plaintext
 'content-type: text/plain; charset="koi8-r"'
и прочие варианты кодировок, но ничего из этого путного не вышло.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36870240
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iceFRпробовал варианты типа:
Код: plaintext
 'content-type: text/plain; charset="koi8-r"'
и прочие варианты кодировок, но ничего из этого путного не вышло.А то, что вы отправляете действительно в koi8-r или вы наивно полагаете, что "кто-то" перекодирует отправляемое из неизвестно чего в то, что нужно?
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882098
longman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья! пытаюсь воспользоваться предложенным "готовым решением".
Сервер БД: Solaris
СУБД: Oracle 9ir2
Цель: отправлять почту c вложениями (txt, pdf, xls, doc), взятыми из таблицы БД (blob).
При этом сначала вычитываю необходимые файлы в каталог на файловой системе сервера БД. Для этого дописал пакет процедурой (код взят из инета.. неоднократно фигурирует, одно что изменил режим работы utl_file.fopen с WB на W ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
-------------------------------------------------------------------------------------------------------
-- Extract_File
-------------------------------------------------------------------------------------------------------
PROCEDURE Extract_File (l_table in varchar2, 
  				l_pkey_field in varchar2, 
                                l_blob_field in varchar2, 
                                l_pkey_value in varchar2,
				l_dir in varchar2,                        
				l_filename in varchar2) IS
    vblob BLOB;
    vstart NUMBER :=  1 ;
    bytelen NUMBER :=  32000 ;
    len NUMBER:= 0 ;
    my_vr RAW( 32000 );
    x NUMBER;

    query_string varchar2( 500 )  :='select '||l_blob_field||
                                  ' from '||l_table||
                                  ' where '||l_pkey_field||
                                  ' = '''||l_pkey_value||'''';

    l_output utl_file.file_type;
BEGIN
    -- define output directory
    l_output := utl_file.fopen(l_dir, l_filename, 'W',  32760 );

    vstart :=  1 ;
    bytelen :=  32000 ;

    -- get length of blob
    len := lob_client_operations.get_lob_size(l_table, l_pkey_field, l_blob_field, to_char(l_pkey_value));

    -- save blob length
    x := len;
    
    -- select blob into variable
    execute immediate query_string into vblob;
      
    -- if small enough for a single write
    IF len <  32760  THEN
		    utl_file.put_raw(l_output,vblob);
    		utl_file.fflush(l_output);
    ELSE -- write in pieces
		    vstart :=  1 ;

        WHILE vstart < len and bytelen >  0 
        LOOP
            dbms_lob.read(vblob,bytelen,vstart,my_vr);

            utl_file.put_raw(l_output,my_vr);
            utl_file.fflush(l_output);

            -- set the start position for the next cut
            vstart := vstart + bytelen;

            -- set the end position if less than 32000 bytes
            x := x - bytelen;
            IF x <  32000  THEN
	              bytelen := x;
            END IF;
        end loop;
    END IF;

    utl_file.fclose(l_output);
    
exception
  	when others then
      	raise_application_error(- 20501 , 'Procedure MAIL_PKG.Extract_File: '||sqlerrm);
end;

всё работает (отсылаются и большие файлы.. пробовал вложений на ~5 мб), но ровным счётом до момента пока не попадётся хитрый файл, который изначально полностью не вычитывается из БД и стопорится на одном и том же месте с ошибкой ORA-29285 - Ошибка записи в файл .. поиском по гуглу обнаружил, что это некий bug 2883782 on MetaLink . внимание, вопрос: кто либо сталкивался с подобным и есть ли решение данной проблемы? Спасибо!

вот одна из ссылок на эту тему c указанием сути проблемы http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_10.shtml
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882162
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
longman,

Возможно utl_file пользуется функциями stdio с контролем utf8. Не все комбинации допустимы при записи текстовыми функциями. На 11g utl_file.fopen имеет параметр open_mode => 'wb'.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882207
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
longman,

Ты не поверишь....

Но это именно из-за твоей замены longmanрежим работы utl_file.fopen с WB на W

В некоторых случаях, последовательность строк, записываемых в текстовый файл при использовании обычного вызова

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 f  utl_file.file_type;
 ...
 f := utl_file.fopen('SOME_DATA_DIR',fname,'W');
 ...
 utl_file.put_line(f,fdata);
 ...
 utl_file.fclose(f);

под Linux/*nix вызывает ошибку записи в файл (получается "неправильная" для utf-8 последовательность символов) и процедура завершается с ошибкой
ORA-29285: file write error

Чтобы избежать этой ошибки, запись следует производить в файл, открываемый как двоичный, и в коде формировать окончания строк
Код: plaintext
1.
2.
3.
4.
5.
 f  utl_file.file_type;
 line_end char( 2 ) := chr( 13 )||chr( 10 ); --ежели отдаём под винду
 ...
 f := utl_file.fopen('SOME_DATA_DIR',fname,'WB');
 ...
 utl_file.put_raw(f, utl_raw.cast_to_raw(r.fdata || line_end));
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882214
longman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2- ,
Bug : UTL_FILE.PUT_RAW RESULTS IN ORA-29285 DUMPING LARGE AMOUNT OF TABLE DATA

почитал на металинке.. баг тебе и всё.. если добавить команду utl_file.new_line(f_descr) после utl_file.fflush(f_descr), то ошибки нет, но естественно файлы битыми приходят. ну и в итоге как отправить почту с вложениями, чтоб эта процедура могла запускаться через Job? кто подскажет?
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882223
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно лучше будет просто не заморачиваться с файлами, и формировать вложения напрямую из блобов.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882291
longman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
а несколько подробнее?
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882453
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
longman,

пожалуйста
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882460
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
longman,

Попробуй перезапустить инстанс с неустановленными переменными окружения LC_xxx и LANG=en_US.iso885915 (или что-то еще 8-битное).

Запись лоба без выкладки в файловую систему - первый пост, просто вместо dbms_lob.fileopen(bfile) -> dbms_lob.open(blob)
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882688
stalker_cop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем тебе вообще BLOB записывать на файловую систему?
В данном случаи тебе нужно BLOB просто перекодировать в base64
в данном топике есть все необходимое чтоб переделать "готовое решение" под себя.
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36882772
longman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2- , ничего перезапустить не могу, т.к. БД производственная и мной не управляется)
stalker_cop , переписал код первого поста, а точнее добавил получение Blob на уровне процедуры Send. Всё получилось как нельзя лучше! сейчас опробую пакетные вложения.. на одном файле всё отправилось и доставилось! Спасибо за мысль! Кстати и env так же высказываю благодарность..
...
Рейтинг: 0 / 0
Передача письма с вложением. Готовое решение
    #36888521
longman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и снова здравствуйте! ситуация такова) всё отправляется, практически все требования реализованы.. но при получении письмо содержит порцию кракозябров.. по одной на каждый вложенный файл.. причём на некоторых веб-почтовиках они отображаются, на некоторых нет.. в The Bat! также присутствуют.. (оттуда скриншот не делал.. если нужно - сделаю) во вложении к посту скриншот с почты Mail.ru и Gmail.com .. кто в курсе природы этих символов?
...
Рейтинг: 0 / 0
25 сообщений из 274, страница 2 из 11
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача письма с вложением. Готовое решение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]