Кодировка принятых и отправленных писем. Synapse.

Форум для изучающих FPC и их учителей.

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

Кодировка принятых и отправленных писем. Synapse.

Сообщение isckatel » 21.05.2012 18:49:51

Учусь на заочке, пишу курсовой проект - почтовый клиент. Использую для работы с почтой Synapse.
Когда письмо приходит в utf-8, все отлично! Когда же имеем кодировку входящего koi8-r, не могу понять как раскодировать.
Код: Выделить всё
//Пытаемся организовать автоматическую смену кодировки
if  (Mess.Header.CharsetCode=KOI8_R)    then
  begin
  Memo1.Lines.Add('Сообщение было преобразовано из KOI8 в UTF8');
  Memo1.Lines.Add(KOI8ToUTF8(Mess.MessagePart.PartBody.Text));//вывели тело сообщения
  end
else Memo1.Lines.Add(Mess.MessagePart.PartBody.Text);

Mess.Free;
Memo2.Lines.Assign(POP.FullResult);
end
Последний раз редактировалось isckatel 08.06.2012 15:27:42, всего редактировалось 2 раз(а).
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых писем

Сообщение Ism » 21.05.2012 22:03:16

Я использую утилиты enca(определяет кодировку) в паре с iconv (конвертирует) , но можно с помощью enconv перекодировать файл на месте в любую кодировку
В качестве примера мой проект http://code.google.com/p/price-vampire/
Под линукс утилиты по умолчанию в системе, под windows надо искать, но тоже есть у меня в проекте
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Кодировка принятых писем

Сообщение isckatel » 22.05.2012 05:36:19

Ism, спасибо!
Но хотелось бы сделать это с помощью модуля LConvEncoding и понять в чем же я ошибся. Есть подозрение, что ошибся в постановке условия.

Добавлено спустя 4 часа 17 минут 10 секунд:
Ну точно же условие не правильное написал, проверяю кодировку заголовка, а преобразую тело сообщения.
Надо вместо:
Код: Выделить всё
if  (Mess.Header.CharsetCode=KOI8_R)    then

написать и все заработало.
Код: Выделить всё
if (Mess.MessagePart.CharsetCode=KOI8_R) then
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых писем

Сообщение Ism » 22.05.2012 14:56:43

Вы через какие компоненты с почтой работаете ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Кодировка принятых писем

Сообщение isckatel » 26.05.2012 10:22:05

Ism писал(а):Вы через какие компоненты с почтой работаете ?

Synapse использую.
С кодировкой текста письма разобрался, а вот с заголовком и отправителем нет. Что нашел в сети:
АИСБП писал(а):Сам разработчик (Lukas Gebauer) написал, что Header.CharsetCode указывает на исходную кодировку, а не на ту в которую нужно перевести заголовки.
А выходная кодировка выбирается автоматически из IdealCharsets (synachar.pas):

IdealCharsets: TMimeSetChar =
[ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5,
ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10,
KOI8_R, KOI8_U
{$IFNDEF CIL} //error URW778 ??? :-O
, GB2312, EUC_KR, ISO_2022_JP, EUC_TW
{$ENDIF}
];

Так кастрировать исходники я не стал, мало ли что и когда понадобится потом ищи где что исправил учитывая, что IdealCharsets это переменная – значит ей можно присвоить то что нам надо. Что собственно и сделали сразу после создания :IdealCharsets:=[CP1251];

http://adm.rayfin.aksay.ru/otpravka-pis ... rovki.html
Пока еще не понял как эту информацию использовать.
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых писем. Synapse.

Сообщение Nik » 29.05.2012 08:41:39

Можно примерно так:

Код: Выделить всё
var
...
xCharset: TMimeChar;
begin
...
     // Кодировка
     xCharset:=FMimeMsg.Header.CharsetCode;
     // Заголовок сообщения
     case xCharset of
      UTF_8: ListBox2.Items.Add(FMimeMsg.Header.Subject+' от ' + FMimeMsg.Header.From);
      CP1251: ListBox2.Items.Add(AnsiToUtf8(FMimeMsg.Header.Subject)+' от ' + AnsiToUtf8(FMimeMsg.Header.From));
      KOI8_R: ListBox2.Items.Add(KOI8ToUTF8(FMimeMsg.Header.Subject)+' от ' + KOI8ToUTF8(FMimeMsg.Header.From));
     else ListBox2.Items.Add('Неизвестная кодировка: '+GetIconvIDFromCP(xCharset));
     end;
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Кодировка принятых писем. Synapse.

Сообщение isckatel » 31.05.2012 13:50:36

Nik писал(а):Можно примерно так:

Код: Выделить всё
var
...
xCharset: TMimeChar;
begin
...
     // Кодировка
     xCharset:=FMimeMsg.Header.CharsetCode;
     // Заголовок сообщения
     case xCharset of
      UTF_8: ListBox2.Items.Add(FMimeMsg.Header.Subject+' от ' + FMimeMsg.Header.From);
      CP1251: ListBox2.Items.Add(AnsiToUtf8(FMimeMsg.Header.Subject)+' от ' + AnsiToUtf8(FMimeMsg.Header.From));
      KOI8_R: ListBox2.Items.Add(KOI8ToUTF8(FMimeMsg.Header.Subject)+' от ' + KOI8ToUTF8(FMimeMsg.Header.From));
     else ListBox2.Items.Add('Неизвестная кодировка: '+GetIconvIDFromCP(xCharset));
     end;

Выглядит хорошо, но наверное это не поможет так как "Сам разработчик (Lukas Gebauer) написал, что Header.CharsetCode указывает на исходную кодировку, а не на ту в которую нужно перевести заголовки."
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых писем. Synapse.

Сообщение Ism » 31.05.2012 15:16:51

Товарищи , в synapse давно встроен собственный перекодировщик
Lukas Gebauer немного врал
Код: Выделить всё
TmimeMess.Header.CharsetCode:=UTF_8;   

Возвращает все хедеры в utf8 , по умолчанию в windows 1251


Код: Выделить всё
TMimePart.DefaultCharset:='UTF-8';
TMimePart.TargetCharset:=UTF_8;
TMimePart.ConvertCharset:=true;


Возвращает все содержимое , кроме имен файлов аттачей в utf8 не зависимо от исходной кодировки
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Кодировка принятых писем. Synapse.

Сообщение isckatel » 31.05.2012 16:48:57

Ism писал(а):Товарищи , в synapse давно встроен собственный перекодировщик
Lukas Gebauer немного врал
Код: Выделить всё
TmimeMess.Header.CharsetCode:=UTF_8;   

Возвращает все хедеры в utf8 , по умолчанию в windows 1251


Код: Выделить всё
TMimePart.DefaultCharset:='UTF-8';
TMimePart.TargetCharset:=UTF_8;
TMimePart.ConvertCharset:=true;


Возвращает все содержимое , кроме имен файлов аттачей в utf8 не зависимо от исходной кодировки

Я только недавно начал пробовать работать с вложениями. Когда писал первый пост еще не пользовался классом TMimePart. А сегодня попробовал, ниже то, что у меня вышло без учета Вашей информации, Ism. Получилось, что CharsetCode хранит исходную кодировку и при перекодировании получается - не чего не получается, даже там где исходная кодировка письма была UTF-8.
Код: Выделить всё
procedure TForm1.GetParts(const part: TMimepart);
var
s: string;
i: integer;
xCharset: TMimeChar;
begin
if (LowerCase(part.Primary)='text') and (LowerCase(part.FileName)='') then //часть сообщения - текст?
begin
part.DecodePart;
xCharset:=part.CharsetCode;
Memo1.Lines.LoadFromStream(part.DecodedLines);
s:=Memo1.Lines.Text;
Memo1.Lines.Clear;
case xCharset of
      UTF_8:  Memo1.Lines.Add(s + 'Кодировка: UTF-8');
      CP1251: Memo1.Lines.Add(AnsiToUtf8(s) + 'Кодировка: CP1251');
      KOI8_R: Memo1.Lines.Add(KOI8ToUTF8(s)+ 'Кодировка: KOI8-R');
     else Memo1.Lines.Add('Неизвестная кодировка');
  end;
end;
if LowerCase(part.FileName)<>'' then begin // вложение?
part.DecodePart;
part.DecodedLines.SaveToFile('d:\'+part.FileName) ;
Memo1.Lines.Add('Сохранено в '+'d:\'+part.FileName)
end;
for i := 0 to part.GetSubPartCount - 1 do
GetParts( part.getsubpart(i)); // проверяем наличие следующего блока
end;

Nik, спасибо за часть кода! Правда который по видимому вовсе и не нужен.
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых писем. Synapse.

Сообщение Ism » 31.05.2012 17:11:15

TmimeMess.Header.From возвращает по умолчанию в win кодировке вне зависимости от исходной кодировки в письме

Опции Charset нужно применять До DecodePart DecodeMessage
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Кодировка принятых писем. Synapse.

Сообщение isckatel » 08.06.2012 15:26:28

В очередной раз бьюсь над кодировкой, только в этот раз отправленных писем. За основу взял статью http://adm.rayfin.aksay.ru/otpravka-pisma-i-problemy-kodirovki.html и эту статью http://www.webdelphi.ru/2010/03/synapse-v-delphi-otpravka-pisem-s-vlozheniyami/
В итоге у себя получил следующий код:
Код: Выделить всё
Procedure TForm3.SendMail (Host,Subject,mTo,From,TextBody,HTML,login,password:string);
var Msg:TMimeMess;
    tmpStringList:TStringList;
    MsgPart:TMimePart;
begin
Msg := TMimeMess.Create;
tmpStringList:=TStringList.Create;
IdealCharsets:=[CP1251];/////////////////////////////
try
// Headers
Msg.Header.Subject:=Subject;
Msg.Header.From:=From;
Msg.Header.ToList.Add(mTo);
// MIMe Parts
MsgPart:=Msg.AddPartMultipart('alternate',nil);
if length(TextBody)>0 then
begin
tmpStringList.Text:=AnsiToUtf8(TextBody);////////////////////
//Msg.AddPartText(tmpStringList,MsgPart);
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,false,ME_BASE64);/////////////////////////
end
else
begin
tmpStringList.Text:=AnsiToUtf8(HTML);
Msg.AddPartHTML(tmpStringList,MsgPart);
end;
if Form3.Edit9.Text<>'' then
Msg.AddPartBinaryFromFile(Form3.Edit9.Text,MsgPart);
// кодируем и отправляем
Msg.EncodeMessage;
if smtpsend.SendToRaw(From,mTo,Host,Msg.Lines,login,password)   then
ShowMessage('Письмо отправлено')
else  ShowMessage('Письмо не отправлено');
finally
Msg.Free;
tmpStringList.Free;
Form3.Close;
end;
end;

По английски все отлично, а кириллицу не понимает.

Добавлено спустя 1 час 58 минут 30 секунд:
Re: Кодировка принятых и отправленных писем. Synapse.
Появились подвижки: тема письма и отправитель стали читабельны после того как прописал Msg.Header.CharsetCode:=UTF_8; , а с текст сообщения походу отправляется все таки в UTF-8 но почтовый сервер думает почему то, что в CP1251.

Добавлено спустя 8 минут 29 секунд:
Re: Кодировка принятых и отправленных писем. Synapse.
tmpStringList.Text:=AnsiToUtf8(TextBody); AnsiToUtf8-точно лишнее

Добавлено спустя 5 минут 27 секунд:
Re: Кодировка принятых и отправленных писем. Synapse.
О вроде получилось: надо строчку поменять вот эту: Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);

Добавлено спустя 13 минут 8 секунд:
Re: Кодировка принятых и отправленных писем. Synapse.
Рабочий вариант:
Код: Выделить всё
Procedure TForm3.SendMail (Host,Subject,mTo,From,TextBody,login,password:string);
var Msg:TMimeMess;
    tmpStringList:TStringList;
    MsgPart:TMimePart;
begin
Msg := TMimeMess.Create;
tmpStringList:=TStringList.Create;
IdealCharsets:=[UTF_8];
try
// Headers
Msg.Header.Subject:=Subject;
Msg.Header.From:=From;
Msg.Header.ToList.Add(mTo);
// MIMe Parts
MsgPart:=Msg.AddPartMultipart('alternate',nil);
if length(TextBody)>0 then
begin
tmpStringList.Text:=TextBody;
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);
end
else
begin
tmpStringList.Text:='--';
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);
end;
if Form3.Edit9.Text<>'' then
Msg.AddPartBinaryFromFile(Form3.Edit9.Text,MsgPart);
Msg.Header.CharsetCode:=UTF_8;
// кодируем и отправляем
Msg.EncodeMessage;
if smtpsend.SendToRaw(From,mTo,Host,Msg.Lines,login,password)   then
ShowMessage('Письмо отправлено')
else  ShowMessage('Письмо не отправлено');
finally
Msg.Free;
tmpStringList.Free;
Form3.Close;
end;
end;                                         
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19

Re: Кодировка принятых и отправленных писем. Synapse.

Сообщение broken850 » 29.09.2012 08:37:50

Я только недавно начал пробовать работать с вложениями. Когда писал первый пост еще не пользовался классом TMimePart. А сегодня попробовал, ниже то,

USMAN
Последний раз редактировалось broken850 12.10.2020 11:06:46, всего редактировалось 2 раз(а).
broken850
незнакомец
 
Сообщения: 1
Зарегистрирован: 29.09.2012 08:30:47

Re: Кодировка принятых и отправленных писем. Synapse.

Сообщение isckatel » 01.10.2012 07:21:01

broken850 писал(а):Я только недавно начал пробовать работать с вложениями. Когда писал первый пост еще не пользовался классом TMimePart. А сегодня попробовал, ниже то,

Что Вы этим хотели сказать?
isckatel
новенький
 
Сообщения: 18
Зарегистрирован: 16.03.2012 05:28:19


Вернуться в Обучение Free Pascal

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru