Кодировка UTF-8 тела письма idSMTP

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Кодировка UTF-8 тела письма idSMTP

Сообщение jsa » 03.07.2020 09:42:01

Здравствуйте.
Использую indy10
Не могу разобраться как отсылать почту в кодировке UTF-8

Сделал процедуру. Работает.
Когда указана кодировка windows-1251 то тело письма отображается нормально.
Но если указать utf-8 то приходят кракозябры.
при этом "тема" письма, всегда отображается нормально.

Подскажите пожалуйста, что не так.

Код: Выделить всё
procedure Send_mail_SMTP();
var clSMTP : TIdSMTP;
    sTXT : string;
begin
     clSMTP := TIdSMTP.Create(nil);                                             
     clSMTP.Host := MsgOper.smtp;
     clSMTP.Port := MsgOper.smtp_port;
     clSMTP.Username := MsgOper.login;
     clSMTP.Password := MsgOper.Password;
     clSMTP.AuthType := satDefault;

     if MsgOper.smtp_encryption='SSL/TLS' then
        begin
        clSMTP.IOHandler := sOpenSSL;
        clSMTP.UseTLS := utUseExplicitTLS;                                     
        end;

     sMessage.From.Address := FromAddress;                                     
     sMessage.Recipients.EMailAddresses := Msg.dest_email;                     
     sMessage.Subject := UTF8Encode(Msg.msg_subject);                           
     sMessage.ContentType := 'text/plain';
     sMessage.CharSet := MsgOper.charset;
     if MsgOper.charset='windows-1251'
        then sTXT := UTF8ToWinCP(Msg.msg_text)
        else if MsgOper.charset='utf-8'
             then sTXT := UTF8Encode(Msg.msg_text)
             else sTXT := Msg.msg_text;                                       
     sMessage.Body.Text := sTXT;                                               
     sMessage.Date:= now;                                                     
     sMessage.IsEncoded:=true;

     try
        clSMTP.Connect();                                                     
        clSMTP.Send(sMessage);                                                 
        Msg.msg_id:=0;
        Msg.msg_cnt_part:=1;
        Msg.msg_cost:=0;
        Msg.msg_status:='отправлено';
        Msg.msg_done:=1;
     except
        writelog.WrLog( 'ОШИБКА!!! Подключение к SMTP серверу не удалось. ');
        Msg.msg_id:=0;
        Msg.msg_cnt_part:=0;
        Msg.msg_cost:=0;
        Msg.msg_status:='Нет подключения';
        Msg.msg_done:=0;
        exit;
     end;
     sleep(10);                                                               
     clSMTP.Disconnect;                                                         
     clSMTP.Destroy;                                                         

end;                                                             
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Снег Север » 03.07.2020 11:36:27

Никогда не устанавливал indy в лазарь, а в делфи TIdSMTP использовал много раз, там никакой перекодировки для utf-8 не требовалось в sMessage.Subject и sMessage.Body.
А sTXT ваш, случайно, не html со своим CharSet?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение jsa » 03.07.2020 12:23:58

Нет, там тестовое сообщение

так приходит в widows-1251
ТЕСТ--БОНУС Первый Иванович Это тестовая смска 15.

так в utf-8
ТЕСТ--БОНУС Первый Иванович Это тестовая смска 15.

без указания кодировки тоже делал, получается 2й вариант.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Снег Север » 03.07.2020 13:38:04

Хм... как-то влом ставить indy для проверки... А с synapse такая же проблема?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение jsa » 16.07.2020 14:51:40

не использую synapse
пока обхожусь кодировкой win1251
Но вопрос остается открытым
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Seenkao » 17.07.2020 00:26:34

Всё в норме, выводить сообщение так же надо в UTF-8.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Снег Север » 17.07.2020 09:20:18

test_smtp1.zip

У меня всё работает. Лазарь 2.0.10, indy ставил через OPM. Письма отправлял на gmail через smtp.mail.ru
ЗЫ. У меня всюду основная кодировка utf-8, поэтому для теста я перекодировал из неё в windows-1251, а не наоборот, как у топикстартера.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение jsa » 21.07.2020 16:18:20

Снег Север писал(а):ЗЫ. У меня всюду основная кодировка utf-8, поэтому для теста я перекодировал из неё в windows-1251,


Так и у меня работает. Проект по умолчанию в utf-8, а письмо посылаю в windows-1251.
а не наоборот, как у топикстартера.

Я такого не писал.
Нигде не упоминал про кодировку по умолчанию. А она таковая какую ставит по умолчанию Lazarus
Выше я писал только про кодировку указываемую в письме.
"Сделал процедуру. Работает.
Когда указана кодировка windows-1251 то тело письма отображается нормально.
Но если указать utf-8 то приходят кракозябры."
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Снег Север » 21.07.2020 17:23:59

jsa, я вас перестал понимать. Вы отправляете текст в windows-1251, а кодировку указываете utf-8??? И что, кроме кракозябр, вы рассчитываете получить???
Посмотрите мой пример - там можно выбирать кодировку, тест с заголовком будут отправлены именно в выбранной кодировке, и обе отправляются и показываются правильно.

"По умолчанию" - это кодировка файла модуля в лазарусе и кодировка винды 10.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение wwswowsogon » 30.11.2022 23:33:40

Как ни смешно, столкнулся сейчас с той же проблемой, отправляя письма через idSMTP на SMTP Майла. Тема приходит в нормальном виде, а текст письма - кракозябками. При этом онлайн-определитель кодировки сообщает, что она является Windwows-1251/1252, независимо от того, выставляешь ли CharSet как 'utf-8' или как 'windows-1251'. Кодировку выставлял как в тестовом примере уважаемого Снег Север.

Есть идеи?

Думаю, возможно, проблема решится, если обновить Lazarus/Indy. Но хотелось бы понимать сущность происходящего, помимо желания избежать большого объёма работы при обновлении. :)
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Sergei I. Gorelkin » 01.12.2022 07:50:42

Надо смотреть в заголовки приходящих писем. Кодировки темы и тела независимы друг от друга.
И, если строка уже в utf-8, то utf8encode для нее - не нужно...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение wwswowsogon » 01.12.2022 12:25:44

Sergei I. Gorelkin писал(а):Кодировки темы и тела независимы друг от друга.


Да, это понятно. Кодировка темы в свойствах письма, кстати, стоит KOI8-R... А кодировка тела - та, что указана в Content.

В Notepad ++ для этого текста указана кодировка UTF-8. А если выполнить преобразование UTF-8 -> Ansi, а потом просмотреть полученное как UTF-8, то происходит чудо, и кракозябки превращаются в прекрасный понятный текст. :)

Причём этот приём работает почти независимо от манипуляций с кодировками в коде программы.

Что бы это могло значить?
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение Sergei I. Gorelkin » 01.12.2022 13:33:12

Да приходит вполне нормальный utf-8, только программа просмотра не может понять, что это он.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Кодировка UTF-8 тела письма idSMTP

Сообщение wwswowsogon » 01.12.2022 21:44:34

Sergei I. Gorelkin писал(а):Да приходит вполне нормальный utf-8, только программа просмотра не может понять, что это он.


Тоже об этом подумал. Программа-то ладно. Почему почта Яндекса не может понять, что это он? )

Добавлено спустя 1 час 28 минут 44 секунды:
Хм, проблема решилась просто:

Код: Выделить всё
emmsg.Body.Text := UTF8ToWinCP(emtext);


При этом работает с указанием в charset как UTF-8, так и Windows-1251.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 40

Рейтинг@Mail.ru