Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой при отправке имэйла из pl-sql / 11 сообщений из 11, страница 1 из 1
08.12.2020, 12:23
    #40025547
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
Отправляю письма с помощью хр. процедуры на Pl-sql. Письма приходят исправно, но в некоторых случаях когда на телефоне у получателя не установлен родной почтовый клиент, а настроен универсальный, который на андроидах предустановлен, да и на любых смартфонах, то в теме письма вместо русских букв отображаются либо вопросики либо абракадабра.
Вот текст самой процедуры:

Код: plsql
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.
create or replace procedure P_SEND_EMAIL (
   smtp_server IN VARCHAR2,
   smtp_port IN INTEGER,
   smtp_auth IN VARCHAR2,
   smtp_login IN VARCHAR2,
   smtp_password IN VARCHAR2,
   sender IN VARCHAR2,
   recipient IN VARCHAR2,
   subject IN VARCHAR2,
   message IN VARCHAR2
)
as
   position NUMBER;
   position_old NUMBER;
   recipient_item VARCHAR2(100);
   mail_conn utl_smtp.connection;   
   raw_subject RAW(1000) := utl_raw.cast_to_raw(substr(convert(subject,'CL8MSWIN1251'),1,1000));
   raw_message RAW(32000) := utl_raw.cast_to_raw(convert(message,'CL8MSWIN1251'));
begin

  if recipient is not null then

  -- установка соединения
  mail_conn := utl_smtp.open_connection(smtp_server, smtp_port);
  -- подтверждение установки связи
  utl_smtp.helo(mail_conn, smtp_server);
  -- авторизация
  if smtp_auth is not null then
    utl_smtp.command(mail_conn, smtp_auth);
    utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(smtp_login)))); 
    utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(smtp_password)))); 
  end if;
  
  -- установка адреса отправителя
  utl_smtp.mail(mail_conn,'<' || sender || '>');
  
  -- установка адреса получателя      
  position := 0;
  position_old := 0;         
  LOOP
     position := INSTR(recipient, ',', position + 1, 1);
     IF (position = 0)
     THEN
        IF (position_old > 0)
        THEN
           recipient_item := SUBSTR(recipient, position_old + 1);
           utl_smtp.rcpt(mail_conn,'<' || LTRIM(recipient_item) || '>');
        END IF;
        EXIT;
     ELSE
        recipient_item := SUBSTR(recipient, position_old + 1, position - position_old - 1);
        utl_smtp.rcpt(mail_conn,'<' || LTRIM(recipient_item) || '>');
     END IF;
     position_old := position;
  END LOOP;
  IF (position_old = 0)
  THEN
     recipient_item := recipient;
     utl_smtp.rcpt(mail_conn,'<' || LTRIM(recipient_item) || '>');
  END IF;
        
  -- отправка команды data, после которой можно начать передачу письма 
  utl_smtp.open_data(mail_conn);
  -- отправка заголовков письма: дата, "от", "кому", "тема"
  utl_smtp.write_data(mail_conn, 'From:' || sender || utl_tcp.CRLF);
  utl_smtp.write_data(mail_conn, 'To:' || recipient || utl_tcp.CRLF);
  utl_smtp.write_raw_data(mail_conn, utl_raw.cast_to_raw('Content-Type: text/html; charset="windows-1251"'||utl_tcp.CRLF));
  utl_smtp.write_data(mail_conn, 'Subject:');
  utl_smtp.write_raw_data(mail_conn, raw_subject);
   
  -- текст письма для почтового сервера
  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, raw_message);
  
  -- передача сигнала о завершении передачи сообщения
  utl_smtp.close_data(mail_conn);
  -- завершение сессии и закрытие соединения с сервером
  utl_smtp.quit(mail_conn);
  
  end if;
    
  EXCEPTION
  -- Если SMTP сервер недоступен, соединение с сервером отсутствует.
  WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
     utl_smtp.quit(mail_conn);
     raise_application_error(-20000, 'Failed to send mail due to the following error: ' || sqlerrm);
  WHEN OTHERS THEN
     raise_application_error(-20001, 'The following error has occured: ' || sqlerrm);
     
end P_SEND_EMAIL;
...
Рейтинг: 0 / 0
08.12.2020, 12:38
    #40025551
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
verter,

КМК, проблема в клиенте
Попробуйте вместо CL8MSWIN1251 кодировать в UTF-8
Только message тоже придется в mime заворачивать
...
Рейтинг: 0 / 0
08.12.2020, 13:11
    #40025561
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
Vadim Lejnin
verter,

КМК, проблема в клиенте
Попробуйте вместо CL8MSWIN1251 кодировать в UTF-8
Только message тоже придется в mime заворачивать


т.е. написать вот так?

Код: plsql
1.
2.
   raw_subject RAW(1000) := utl_raw.cast_to_raw(substr(convert(subject,'AL32UTF8'),1,1000));
   raw_message RAW(32000) := utl_raw.cast_to_raw(convert(message,'AL32UTF8'));
...
Рейтинг: 0 / 0
08.12.2020, 13:21
    #40025564
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
нет, так совсем плохо стало - всё в абрекадабре.
...
Рейтинг: 0 / 0
08.12.2020, 13:39
    #40025571
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
Тут на форуме есть хороший пакет по рассылке почты
У нас работает корректно около 10 лет
...
Рейтинг: 0 / 0
08.12.2020, 18:19
    #40025729
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
verter
Vadim Lejnin
verter,

КМК, проблема в клиенте
Попробуйте вместо CL8MSWIN1251 кодировать в UTF-8
Только message тоже придется в mime заворачивать


т.е. написать вот так?

Код: plsql
1.
2.
   raw_subject RAW(1000) := utl_raw.cast_to_raw(substr(convert(subject,'AL32UTF8'),1,1000));
   raw_message RAW(32000) := utl_raw.cast_to_raw(convert(message,'AL32UTF8'));



Чарсет правил?
Код: plsql
1.
2.
3.
4.
...
utl_smtp.write_raw_data(mail_conn, utl_raw.cast_to_raw('Content-Type: text/html; charset="windows-1251"'||utl_tcp.CRLF));

...


Ну и звернуть message в mime text секцию надо, smtp ,без MIME поддерживает только ASCII, все остальное по желанию.
могут добавить поддержку, но не обязаны.
...
Рейтинг: 0 / 0
08.12.2020, 18:23
    #40025734
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
andreymx
Тут на форуме есть хороший пакет по рассылке почты
У нас работает корректно около 10 лет

А вот это правильно
8834046
...
Рейтинг: 0 / 0
08.12.2020, 18:46
    #40025742
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
Чарсет правил?
Код: plsql
1.
2.
3.
4.
...
utl_smtp.write_raw_data(mail_conn, utl_raw.cast_to_raw('Content-Type: text/html; charset="windows-1251"'||utl_tcp.CRLF));

...


Ну и звернуть message в mime text секцию надо, smtp ,без MIME поддерживает только ASCII, все остальное по желанию.
могут добавить поддержку, но не обязаны.[/quit]
так не править его что ли просто?
...
Рейтинг: 0 / 0
08.12.2020, 21:45
    #40025795
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
verter,

Можно долго читать RFC, а можно

вместо тысячи словЯ поправил на codeset на utf-8 в вашей процедуре
Результат Вашей процедуры
Код: plsql
1.
2.
3.
4.
5.
6.
...
Content-Type: text/html; charset="UTF-8"
Subject:test
Content-Length: 13

привет




Потом, отправил аналогичное письмо используя outlook
результат outlook
Код: plsql
1.
2.
3.
4.
5.
6.
7.
...
Content-Type: text/plain; charset="utf-8"
Content-ID: <XXXXXXXXXXXXXXXXXXXXXXX>
Content-Transfer-Encoding: base64
MIME-Version: 1.0

0L/RgNC+0LLQtdGA0LrQsA0KDQo=





как говорится почувствуйте разницу
...
Рейтинг: 0 / 0
08.12.2020, 22:18
    #40025800
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
verter,

Вот результат письма в html + text
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Content-Type: multipart/alternative;
	boundary="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
MIME-Version: 1.0

--_000_74d3a4fcacd8fc22acc5a0b8b47e2909forsru_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

0L/RgNC40LLQtdGCDQo=

--_000_74d3a4fcacd8fc22acc5a0b8b47e2909forsru_
Content-Type: text/html; charset="utf-8"
Content-ID: <xxxxxxxxxxxxxxxxxxxxxxx>
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjwvaGVhZD4NCjxib2R5Pg0KPHA+0L/RgNC40LLQ
tdGCPGJyPg0KPC9wPg0KPC9ib2R5Pg0KPC9odG1sPg0K

--xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_--



Смотрим что такое закодировано в text/html

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$ cat test.m64 
PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjwvaGVhZD4NCjxib2R5Pg0KPHA+0L/RgNC40LLQ
tdGCPGJyPg0KPC9wPg0KPC9ib2R5Pg0KPC9odG1sPg0K
$
$
$ base64 -d test.m64 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>привет<br>
</p>
</body>
</html>



p.s.
xxxxxxxxxxxxxx - забиты id из готорых можно получить домен
...
Рейтинг: 0 / 0
08.12.2020, 22:31
    #40025802
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с кодировкой при отправке имэйла из pl-sql
verter,

ну и последний вариант кодирования, без упаковки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
## тело письма
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

=EF=F0=E8=E2=E5=F2

И пример кодирования слов в разных кодировках
$ echo привет|iconv -t cp1251|qprint -e
=EF=F0=E8=E2=E5=F2

$ echo привет|iconv -t utf-8|qprint -e
=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D1=82
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой при отправке имэйла из pl-sql / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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