function TfMain.fDecodeMIME(eString:string):String;
var vStrOut:String;
vTempStr, vStrNew:String;
vPosStart, vPosEnd:integer;
begin
vStrOut:=eString;
// ISO-8859-1 Pre-Format
vStrOut := ReplaceString(vStrOut,'=?iso-8859-1?', '=?ISO-8859-1?');
vStrOut := ReplaceString(vStrOut,'=?ISO-8859-1?', '=?UTF-8?'); // will be treated like UTF8
// UTF8 Pre-Format
vStrOut := ReplaceString(vStrOut,'=?utf-8?', '=?UTF-8?');
vStrOut := ReplaceString(vStrOut, #13+#10 + ' =?UTF-8?', '=?UTF-8?'); // Linebreakt & Space
vStrOut := ReplaceString(vStrOut, #13+#10 + ' =?UTF-8?', '=?UTF-8?'); // Linebreakt & TAB
vStrOut := ReplaceString(vStrOut, '?= =?UTF-8?', '?==?UTF-8?');
vStrOut := ReplaceString(vStrOut, '-8?q?', '-8?Q?');
vStrOut := ReplaceString(vStrOut, '-8?b?', '-8?B?');
// replace all UFT8 occurrences
while Pos('=?UTF-8?',vStrOut) > 0 do
begin
vPosStart := Pos('=?UTF-8?',vStrOut);
vTempStr := Copy(vStrOut, vPosStart, Length(vStrOut)-vPosStart+1);
vPosEnd := Pos('?=',vTempStr)+1;
vTempStr := Copy(vTempStr, 1, vPosEnd);
vStrNew := vTempStr;
// now Decode depending on UTF8-Type
if Pos('=?UTF-8?Q?',vStrNew) > 0 then // (Q)uoted
begin
vStrNew := ReplaceString(vStrNew,'_', ' ');
vStrNew := ReplaceString(vStrNew,'=?UTF-8?Q?', '');
vStrNew := DecodeQuotedPrintable(vStrNew);
vStrNew := Copy(vStrNew, 1, Length(vStrNew)-1); // last Char after Decode Quoted is '?' -> cut 1 char
end
else if Pos('=?UTF-8?B?',vStrNew) > 0 then // (B)ase64
begin
vStrNew := ReplaceString(vStrNew,'=?UTF-8?B?', '');
vStrNew := DecodeBase64(vStrNew);
end;
// Trim formated Result
vStrNew := Trim(vStrNew);
// replace String in Original Text by position..
vStrOut := ReplaceString(vStrOut, vTempStr, vStrNew);
end;
Result := vStrOut;
end;