powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой при отправке имэйла из pl-sql
11 сообщений из 11, страница 1 из 1
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025547
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отправляю письма с помощью хр. процедуры на 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
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025551
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter,

КМК, проблема в клиенте
Попробуйте вместо CL8MSWIN1251 кодировать в UTF-8
Только message тоже придется в mime заворачивать
...
Рейтинг: 0 / 0
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025561
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'));
...
Рейтинг: 0 / 0
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025564
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, так совсем плохо стало - всё в абрекадабре.
...
Рейтинг: 0 / 0
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025571
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут на форуме есть хороший пакет по рассылке почты
У нас работает корректно около 10 лет
...
Рейтинг: 0 / 0
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025729
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025734
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
Тут на форуме есть хороший пакет по рассылке почты
У нас работает корректно около 10 лет

А вот это правильно
8834046
...
Рейтинг: 0 / 0
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025742
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чарсет правил?
Код: 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
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025795
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025800
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблемы с кодировкой при отправке имэйла из pl-sql
    #40025802
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с кодировкой при отправке имэйла из pl-sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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