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;