Показать сообщение отдельно
  #3  
Старый 16.05.2016, 13:23
draginimp draginimp вне форума
Прохожий
 
Регистрация: 02.04.2014
Сообщения: 37
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Нашел на просторах глубокого интернета, правда немного изменил
строки 8-23 от меня, на случай длинного заголовка.
http://www.sql.ru/forum/883437/pop3-...roblema-decode
Код:
function DecodeStr(Text: String): String;
Var
    P,P2,pz:Integer;
    Temp,Dec, temp2 : String;
  begin
    Result:='';

    if pos('=?',text)=0 then result:=text;
    if pos('=?',text)>1 then
    result:=copy(text,1,pos('=?',text)-1);

  temp2:=StringReplace(text,' ','', [rfReplaceAll, rfIgnoreCase]);

    Temp2:=Copy(Temp2,Pos('=?',LowerCase(temp2)),Length(temp2));
      repeat

      pz:=Pos('?=',LowerCase(temp2))+1;
      if pz=2 then  pz:=Pos('?=',LowerCase(temp2))+1;
       if pz<15 then
      pz:=length(temp2);

       temp:=Copy(Temp2,Pos('=?',LowerCase(temp2)),pz);
        delete(temp2,1,pz);
     
    while pos('=?UTF-8?',UpperCase(Temp))>0 do begin

      P:=pos('=?UTF-8?',UpperCase(Temp));
      P2:=length(temp)-1;
      Dec := Copy(Temp,p+10,P2-(P+10));
      if UpperCase(Temp[P+8])='Q' then
        Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
      Else
        Dec:=IdDecoderMIME1.DecodeString(Dec);
      
      Dec:=Utf8ToAnsi(Dec);

      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;

    while pos('=?KOI8-R?',UpperCase(Temp))>0 do begin
      P:=pos('=?KOI8-R?',UpperCase(Temp));
      P2:=pos('?=',Temp);
      Dec := Copy(Temp,p+11,P2-(P+11));
      if UpperCase(Temp[P+9])='Q' then
        Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
      Else
        Dec:=IdDecoderMIME1.DecodeString(Dec);
      Dec:=B_KOI8R2ANSI(Dec);
      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;

    while pos('=?WINDOWS-1251?',UpperCase(Temp))>0 do begin
      P:=pos('=?WINDOWS-1251?',UpperCase(Temp));
      P2:=pos('?=',Temp);
      Dec := Copy(Temp,p+17,P2-(P+17));

      if UpperCase(Temp[P+15])='Q' then
        Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec)
      Else
            Dec:=IdDecoderMIME1.DecodeString(Dec);
      Result:=Result+Copy(Temp,1,P-1)+Dec;
      Temp:=Copy(Temp,P2+2,length(Temp));
    End;
    until length(temp2)<5;

  end;


function B_KOI8R2ANSI(S: string): string;
Const
  KOI8_CODE = 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС—Ј';
  ANSI_CODE = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ё';
var
  i: integer;
begin
  Result := S;
  for i := 1 to Length(Result) do
    if Pos(Result[i], KOI8_CODE) > 0 then
      Result[i] := ANSI_CODE [Pos(Result[i], KOI8_CODE)];
end;
Ответить с цитированием