Кодировка indy10 под Linux

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

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

san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Кодировка indy10 под Linux

Сообщение san7667 »

Добрый день!
Есть программка где сообщение отправляется по SMTP на mail.ru почту из под Linux.
Но имеется проблема с кодировкой в IdMessage1.Subject

Если я указывают тему письма на кириллице, то письмо приходит <без темы>? если же на латинице, то все нормально.

пробовал различные варианты:

Код: Выделить всё

idMessage1.СharSet:='windows-1251'
...
idMessage1.Subject:=UTF8ToAnsi('ТемаПисьма');
...
IdMessage1.ContentType:='text/plain; charset=windows-1251';
Все безуспешно, проблема только при компиляции и запуске в Linux

на windows все нормально..

Подскажите пожалуйста, в чем может быть проблема?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Довольно странно говорить о "кодировке indy". Кодировки есть у лазаруса и у мейлсервера. Чтобы избежать проблем, используйте чарсет в письмах UTF8 и никогда не перекодируйте их в Ansi.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):Довольно странно говорить о "кодировке indy". Кодировки есть у лазаруса и у мейлсервера. Чтобы избежать проблем, используйте чарсет в письмах UTF8 и никогда не перекодируйте их в Ansi.
Подскажите куда копать?
факт в том, что тот же самый проект скомпилированный на windows дружит с кириллицей
компилирую этот проект на линуксе - в теме письма кириллицу не распознает

В чем может быть причина, может в библиотеках openssl?
Если в них, то где найти библиотеки поддерживающие кириллицу?
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

поднимал похожую тему http://www.freepascal.ru/forum/viewtopi ... =5&t=43051
посмотрите может там на мысль какую-нибудь наткнетесь
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Что вы называете "кирилицой"? В старом виндовс это была кодировка 1251, в старом линуксе - koi8. Сейчас всюду - кодировка UTF8. Не понимаю вашей проблемы. У вас что, текст письма из консоли читается??? Что именно не распознаёт кирилицу у вас? openssl наверняка ни при чем, она шифрует побайтово, ей любые кодировки фиолетовы.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):Что вы называете "кирилицой"? В старом виндовс это была кодировка 1251, в старом линуксе - koi8. Сейчас всюду - кодировка UTF8. Не понимаю вашей проблемы. У вас что, текст письма из консоли читается??? Что именно не распознаёт кирилицу у вас? openssl наверняка ни при чем, она шифрует побайтово, ей любые кодировки фиолетовы.
Скажу проще говоря
Один и тот же проект компилирую на win и линукс
c виндны запускаю exe пишу в теме письма : "тема письма", на почту приходит все нормально - "тема письма"
запускаю с линукса пишу в теме письма: "тема письма", на почту приходит <без темы>
запускаю с линукса пишу в теме письма: "tema pisma", на почту приходит <tema pisma>

Добавлено спустя 3 минуты 37 секунд:
jsa писал(а):поднимал похожую тему http://www.freepascal.ru/forum/viewtopi ... =5&t=43051
посмотрите может там на мысль какую-нибудь наткнетесь
дело в том, что на винде у меня все хорошо отпарвляется)
Проблема с linux :(

Добавлено спустя 7 секунд:
jsa писал(а):поднимал похожую тему http://www.freepascal.ru/forum/viewtopi ... =5&t=43051
посмотрите может там на мысль какую-нибудь наткнетесь
дело в том, что на винде у меня все хорошо отпарвляется)
Проблема с linux :(
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Если всюду выставить charset в utf8 что получите? В винде и линухе? Что может быть проще - проверить, чем гадать что в каком месте криво перекодируется.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):Если всюду выставить charset в utf8 что получите? В винде и линухе? Что может быть проще - проверить, чем гадать что в каком месте криво перекодируется.
Не работает...
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Код: Выделить всё

    IdMessage1 : TIdMessage;
    IdSMTP1 : TIdSMTP;
    IdSSLIOHandlerSocketOpenSSL1 : TIdSSLIOHandlerSocketOpenSSL; 
...
var
  subj, body :RawByteString;

// только для windows-1251 
      subj := UTF8ToCP1251(subj, true);
       body := UTF8ToCP1251(body, true);  
       IdMessage1.From.Address := ****;
       IdMessage1.Recipients.EMailAddresses := ****;
       IdMessage1.Subject := subj;
       IdMessage1.Body.Text := body;
       IdMessage1.CharSet := 'windows-1251'; 
       IdMessage1.ContentTransferEncoding := 'base64';
       IdMessage1.ContentType := 'text/plain'+'; charset='+IdMessage1.CharSet;
       IdMessage1.Date := Now();
Всё. Назначайте данные коннекта к вашему SMTP серверу и отправляйте - всё будет работать. Для utf8, разумеется, ничего перекодировать не надо и чарсет ставите utf8.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):Всё. Назначайте данные коннекта к вашему SMTP серверу и отправляйте - всё будет работать. Для utf8, разумеется, ничего перекодировать не надо и чарсет ставите utf8.
Тоже самое....(((
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

У меня - работает... Что я делаю не так? Может быть еще косяк в настройках вашего SMTP сервера. Уж и не знаю... Кстати, на вашем скрине не увидел строчки
IdMessage1.ContentTransferEncoding := 'base64';
А она принципиально важна.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):У меня - работает... Что я делаю не так? Может быть еще косяк в настройках вашего SMTP сервера. Уж и не знаю... Кстати, на вашем скрине не увидел строчки
IdMessage1.ContentTransferEncoding := 'base64';
А она принципиально важна.
Она там присутствует..
Не могли бы вы скинуть библиотеки openssl? Может в них косяк, виндовые и линуксоидные же разные библиотеки..
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Линуксовые - те, что в дистрибутиве и в обновлениях, у меня wattOS х64 (на основе дебиан) сомневаюсь, что подойдет вам. виндовые - последние с сайта openssl.
san7667
новенький
Сообщения: 42
Зарегистрирован: 18.06.2023 16:57:37

Сообщение san7667 »

Снег Север писал(а):Линуксовые - те, что в дистрибутиве и в обновлениях, у меня wattOS х64 (на основе дебиан) сомневаюсь, что подойдет вам. виндовые - последние с сайта openssl.
И все же, может быть произойдет чудо)
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

san7667 писал(а):И все же, может быть произойдет чудо)
Чудо произошло? :roll:

Код: Выделить всё

uses IdCoderMIME;
...
function EncodeSubj(instr:string):string;
var
  IdEncoderMIME: TIdEncoderMIME;
begin
  IdEncoderMIME := TIdEncoderMIME.Create;
  Result := '=?'+'Windows-1251'+'?B?'+IdEncoderMIME.Encode(instr)+'?=';
  IdEncoderMIME.Free;
end;
...
IdMessage1.Subject :='';
 IdMessage1.ExtraHeaders.Add('Subject: '+EncodeSubj('Тема письма на русском или английском языке'));
...
Но это касалось проблем с неправильной кодировкой, а не с полным отсутствием заголовка.
Но это "костыль", как я понял, а правильный способ с обработкой OnInitISO включен в этот пример
Ответить