Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2014, 13:08   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию кодировка тела письма Indy 10 и TIdIMAP4

Здравствуйте уважаемые коллеги !
Просьба помочь с решением проблемы чтения письма с почтового ящика.
Проблема заключается в кодировке

исходный текст
РУССКИЙ ТЕКСТ - RUSSIAN TEXT
ENGLISH TEXT - АНГЛИЙСКИЙ ТЕКСТ

Принятый текст
??????? ????? - RUSSIAN TEXT'#$D#$A'ENGLISH TEXT - ?????????? ?????'#$D#$A

В заголовках пишет, что IdMap4.Charset ='utf-8'
IdMap4.ContentType ='text/plain'

Странность заключается в том, что кодировка UTF8 характерна чредованием символов похожих на Р (РуР7P#) и.т.п
--------
Читаю письмо следующим образом
if IdMap4.RetrieveHeader(number,IdMess age) then
IdMap4.Retrieve(number, IdMessage);

причём после IdMap4.Retrieve тектс полностью теряется. Прошёлся "вунтрь" компоненты IdMessage, исходного русского текста нигде нет повсюду знаки вопросов

Заранее благодарю за помощь или ссылку на схожу тематику
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 12.05.2014, 18:44   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

ответ нашёл самостоятельно:

Код:

if IdMAP4.RetrieveHeader(number,IdMessage) then //читаем заголовок
begin
  IdMessage.NoDecode := true;              //снимаем флаг декодирования
  IdMAP4.Retrieve(number, IdMessage);   // читаем исходное закодирвоаное письмо 
// смотрим состав письма
 // письмо состоит из нескольких частей, тела письма нет
  case byte((IdMessage.MessageParts.Count>0) and (IdMessage.Body.Count=0)) of
    // перебираем все части
    1:  for i:=0 to IdMessage.MessageParts.Count - 1 do
	if IdMessage.MessageParts[i].PartType=mptText then
	with TIdText(IdMessage.MessageParts[i]) do
	 for j:=0 to Body.Count-1 do
	  S    := S+ _DecodeString(Trim(Body.Strings[i]))

    0:  for i:=0 to FRcvMsg.Body.Count-1 do
	 S    := S+ _DecodeString(Trim(IdMessage.Body.Strings[i]))
  end;
S - содержит готовую строку , "кидаем" её на нижнюю функцию

Код:
// IdDecoderMIME --- TIdDecoderMIME компонент Инди
procedure _DecodeString(const Value : string) : string;
var buff : TIdBytes; // описан в IdGlobal
    i  : integer;
    s : string;
begin
  buff := IdDecoderMIME.DecodeBytes(V); // декодируем строку

  s:='';  result :='';
 // формируем строку и избавляемся от нулей которые периодически появляются в теле письма при декодировании IdDecoderMIME
  for i:=0 to length(buff)-1 do
  case byte(buff[i]=0) of
     1: S:=S+' ';
     0: S:=S+chr(buff[i]);
  end;
  // каждую часть письма кидаем на стандартный декодер кодировок
  // который скидывали на форум (см. ниже текст функции)
  repeat
    i:=Pos(#10, S);
    case byte(i<1) of
      1: result := result+_Decoder(S, content);
      0: begin
	  result := result+_Decoder(Copy(S,1,i), content);
	  delete(S,1,i);
	 end;
    end;
  until i<1;
end;
Декодировщик, вызыввается выше
Код:
function _Decoder(const Text, content : string):string;
type
   TTxtConvert = (cmNone, cmUTF8, cmKoi8RToAnsi,cmKoi8UToAnsi,cmOemDosToAnsi,cmIsoToAnsi);
const
 fCodes = #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' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
      '_`abcdefghijklmnopqrstuvwxyz{|}~';
 convMatrix: array [TTxtConvert] of string =
   ('', '',
    fCodes+'-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёг㬬¬LLL---¦¦¦¦Ё¦¦TTT¦¦¦+++©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',
    fCodes+'-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёєгії¬LLL-ґў¦¦¦¦ЁЄ¦ІЇT¦¦¦+ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',
    fCodes+'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦Lг¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦ ',
    fCodes+'????????????????????????˜??????? ЁЂЃЄЅІЇЈЉЊЋЌ*ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ'
    );
var V : string;
    i : integer;
    m : TTxtConvert;

begin
  result := '';
  if Pos('text/html',content)>0 then exit; // html текст
  V:=AnsiUpperCase(content);
  m:= cmNone;
  if Pos('UTF-8', V)>0  then m:=cmUTF8 else
  if Pos('KOI8-R', V)>0 then m:=cmKoi8RToAnsi else
  if Pos('KOI8-U', V)>0 then m:=cmKoi8UToAnsi else
  if Pos('OEM', V)>0    then m:=cmOemDosToAnsi else
  if Pos('ISO', V)>0    then m:=cmIsoToAnsi;
  case byte(m) of
    0: result := Trim(Text);
    1: case Length(text) mod 2 of // если того не делать, массивы с нечётным числом байт не обрабатываются Utf8ToAnsi
	0: result := Utf8ToAnsi(Text);
	1: result := Utf8ToAnsi(Text+' ');
       end;
    else
    V:= convMatrix[m];
    for i := 1 to length(Text) do
    if ord(Text[i])<=Length(V) then
     result := result + V[ord(Text[i])];
  end;
end;
---
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.07.2015, 18:03   #3
octamer
Новичок
Джуниор
 
Регистрация: 08.05.2011
Сообщений: 1
По умолчанию

Это просто кусок ужаса!
octamer вне форума Ответить с цитированием
Старый 11.07.2015, 20:37   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от octamer Посмотреть сообщение
Это просто кусок ужаса!
Согласен. 80% которого в самой Инди
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 11.07.2015, 20:50   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
80% которого в самой Инди
Вообще то нужно учитывать и проблемы на стороне почтовиков. То, что нормально читается в Тандерберде (к примеру) кракозяблится в Лотусе или наоборот. Аутглюк может откракозяблить вполне нормальный текст, в то время как просто браузер его без проблем покажет читабельно. Это легко проверить, закрутив свой клиент на сокетах, с чем я столкнулся тоже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2015, 21:08   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вообще то нужно учитывать и проблемы на стороне почтовиков. То, что нормально читается в Тандерберде (к примеру) кракозяблится в Лотусе или наоборот. Аутглюк может откракозяблить вполне нормальный текст, в то время как просто браузер его без проблем покажет читабельно. Это легко проверить, закрутив свой клиент на сокетах, с чем я столкнулся тоже.
Я уже научен горьким опытом, кроме того в 10-й Инди был баг связанный с SSL библиотеками. Собрали проект под 7-й работает великолепно. Кидаем на машину с ХР - ексепшен (не может загрузить библиотеки SSL).
Пересобрали под 6-й Инди - в ХР запускается без проблем, в 7-ке та же ошибка.
В результате, идею с почтовым клиентом на ЕХЕ-шниках закинули в длинный ящик и забыли. Коллега клепает почтовый сервак и страницу на сайте для входа пользователей.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формат тела письма в OutLook'е Olper Microsoft Office Excel 8 29.08.2011 17:07
Расширенное оформление тела письма Che Guevara PHP 1 16.08.2011 12:34
Кодировка приходящего письма dagetus Общие вопросы Delphi 0 08.07.2011 05:40
synapse кодировка(?) письма jskorvin Работа с сетью в Delphi 0 03.01.2011 16:29
Распознавание тела письма при получении iamur Работа с сетью в Delphi 1 11.02.2008 17:33