|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
_Ildar_andrey_anonymous_Ildar_Обойти бы это ограничение по размеру тела письма и все было бы ОК! Шлите письма html-аттачем, как поступают все современные спамеры :) Это мысль. Надо попробовать. Все верно, создаете аттач, делаете его типом html или txt, прикрепляете первым, затем остальные атачи. Работает безотказно. Я таким образом посылал хтмлки с картинками. Еще, если позволите, вопрос. В каком типе переменной у Вас хранится письмо такого размера? В Clob? По идее можно дописать пакет, на вход подавая CLOB, т.е. два метода SEND, один с варчар, второй с клоб, кому как удобнее ) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2010, 18:29 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
chameleon82, Автору выражаю огромную благодарность ! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2010, 18:05 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
chameleon82Вот моя последняя версия ) Код: plaintext 1. 2. 3. 4. 5. 6.
Рекомендую перечитать в RFC 2822 раздел, касающийся синтаксиса адреса (3.4). То, что некоторые SMTP-серверы проглотят reverse-path и forward-path без обрамляющих < и >, вовсе не означает, что так сделают все. Для пробы попробуйте отправить письмо Вашим пакетом через SMTP-сервер GMail. Получите: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2010, 05:29 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
автору огромное спасибо! давно хотел разобраться с этой темой, но как всегда руки не доходили. доработал для blob и пошагового заполнения текста сообщения, работает действительно безотказно! но появился такой вопрос: возможно ли отправлять сообщения на виндусовый msn messenger ? ситуация такая что не на всех компах настроен outlook express, а необходимость оповещения не уменьшилась. буду благодарен любой полезной информации ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2010, 13:09 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Всем привет! Если кому интересно могу отписать как отправить вложение больше чем 32К! Прикол заключается в том что необходимо закодировать в base64 blob ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2010, 17:40 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Используйте следующие процедуры для кодирования и декодирования в 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} ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2010, 18:26 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2010, 18:29 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Glum1111 автору огромное спасибо! давно хотел разобраться с этой темой, но как всегда руки не доходили. доработал для blob и пошагового заполнения текста сообщения, работает действительно безотказно! Спасибо. А Вы могли бы выложить код, который получился? Glum1111 но появился такой вопрос: возможно ли отправлять сообщения на виндусовый msn messenger ? ситуация такая что не на всех компах настроен outlook express, а необходимость оповещения не уменьшилась. буду благодарен любой полезной информации Если протокол открытый, то можно, хотя с почтой мне кажется здесь мало общего. Можно также уведомления слать в icq, тут только проблема в том, что вроде никто еще не делал заготовок для работы с протоколом оскар на оракле, но вот на пхп очень много поделок, например http://wip.asminog.com, поэтому у кого есть силы и желание, можете переложить код на оракл, было бы клево. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2010, 20:21 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
stalker_copВсем привет! Если кому интересно могу отписать как отправить вложение больше чем 32К! Прикол заключается в том что необходимо закодировать в base64 blob Спасибо за код. А Вы могли бы привести пример работы с Вашим кодом? Я так понял изначальный блоб должен храниться в бд? Как вариант в таком случае можно блоб сохранить во временный файл, тогда пакет его скушает без особых проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2010, 20:24 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Автору для размышлений. Бинарники и архивы содержат специфичные символы (например, с кодом 0). Естественно, данный пакет работать с ними не будут. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 03:56 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
ПредлагающийАвтору для размышлений. Бинарники и архивы содержат специфичные символы (например, с кодом 0). Естественно, данный пакет работать с ними не будут. Прикрепляемые файлы переводятся в base64, в чем проблема то? Все работает, бинарники и архивы отправляются без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2010, 08:22 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
chameleon82stalker_copВсем привет! Если кому интересно могу отписать как отправить вложение больше чем 32К! Прикол заключается в том что необходимо закодировать в base64 blob Спасибо за код. А Вы могли бы привести пример работы с Вашим кодом? Я так понял изначальный блоб должен храниться в бд? Как вариант в таком случае можно блоб сохранить во временный файл, тогда пакет его скушает без особых проблем. Всем привет Я просто предоставил три процедурки которые кодируют и раскодируют блоб в/из base64. В последнем варианте отправки писем отредактировать вызов utl_smtp.write_raw_data(v_Mail_Conn, UTL_ENCODE.base64_encode(vRAW)); На то что я представил (но не в лоб там начитка из файла для начала файл в blob а потом нарезать на кусочки и отправить) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2010, 09:57 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Всем привет. Скажите, а как обстоят дела с отправкой в русской кодировке? пробовал варианты типа: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2010, 11:29 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
iceFRпробовал варианты типа: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2010, 15:39 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Друзья! пытаюсь воспользоваться предложенным "готовым решением". Сервер БД: 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.
всё работает (отсылаются и большие файлы.. пробовал вложений на ~5 мб), но ровным счётом до момента пока не попадётся хитрый файл, который изначально полностью не вычитывается из БД и стопорится на одном и том же месте с ошибкой ORA-29285 - Ошибка записи в файл .. поиском по гуглу обнаружил, что это некий bug 2883782 on MetaLink . внимание, вопрос: кто либо сталкивался с подобным и есть ли решение данной проблемы? Спасибо! вот одна из ссылок на эту тему c указанием сути проблемы http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_10.shtml ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 12:43 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
longman, Возможно utl_file пользуется функциями stdio с контролем utf8. Не все комбинации допустимы при записи текстовыми функциями. На 11g utl_file.fopen имеет параметр open_mode => 'wb'. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 12:57 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
longman, Ты не поверишь.... Но это именно из-за твоей замены longmanрежим работы utl_file.fopen с WB на W В некоторых случаях, последовательность строк, записываемых в текстовый файл при использовании обычного вызова Код: plaintext 1. 2. 3. 4. 5. 6. 7.
под Linux/*nix вызывает ошибку записи в файл (получается "неправильная" для utf-8 последовательность символов) и процедура завершается с ошибкой ORA-29285: file write error Чтобы избежать этой ошибки, запись следует производить в файл, открываемый как двоичный, и в коде формировать окончания строк Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 13:09 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
-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? кто подскажет? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 13:11 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
Возможно лучше будет просто не заморачиваться с файлами, и формировать вложения напрямую из блобов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 13:14 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
env, а несколько подробнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 13:28 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
longman, пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 14:12 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
longman, Попробуй перезапустить инстанс с неустановленными переменными окружения LC_xxx и LANG=en_US.iso885915 (или что-то еще 8-битное). Запись лоба без выкладки в файловую систему - первый пост, просто вместо dbms_lob.fileopen(bfile) -> dbms_lob.open(blob) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 14:14 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
А зачем тебе вообще BLOB записывать на файловую систему? В данном случаи тебе нужно BLOB просто перекодировать в base64 в данном топике есть все необходимое чтоб переделать "готовое решение" под себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 15:15 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
-2- , ничего перезапустить не могу, т.к. БД производственная и мной не управляется) stalker_cop , переписал код первого поста, а точнее добавил получение Blob на уровне процедуры Send. Всё получилось как нельзя лучше! сейчас опробую пакетные вложения.. на одном файле всё отправилось и доставилось! Спасибо за мысль! Кстати и env так же высказываю благодарность.. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2010, 15:37 |
|
Передача письма с вложением. Готовое решение
|
|||
---|---|---|---|
#18+
и снова здравствуйте! ситуация такова) всё отправляется, практически все требования реализованы.. но при получении письмо содержит порцию кракозябров.. по одной на каждый вложенный файл.. причём на некоторых веб-почтовиках они отображаются, на некоторых нет.. в The Bat! также присутствуют.. (оттуда скриншот не делал.. если нужно - сделаю) во вложении к посту скриншот с почты Mail.ru и Gmail.com .. кто в курсе природы этих символов? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2010, 09:37 |
|
|
start [/forum/topic.php?fid=52&msg=36835740&tid=1879549]: |
0ms |
get settings: |
26ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
526ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 905ms |
0 / 0 |