Hi!
TMimeDec does NOT ignore MIME preamble and epilogue, so it fails to decode
correctly complex multipart message from RFC 2049 Appendix A. Specifically,
when it sees ending boundary (--boundary--) it starts another part.
Disabling preamble parsing as text/plain is very simple, just have to
check in OnHeaderEnd if the ContentType starts with multipart/ - if so,
we have to ignore next part. With preambles and epilogues of embedded
parts is far worse. Let's see the ProcessPartLine:
procedure TMimeDecode.ProcessPartLine; { ##ERIC }
var
Len : Integer;
t : Integer;
s : String;{ ##ERIC }
begin
{ Check if end of part (boundary line found) }
if (FCurrentData nil) and (FCurrentData^ #0) then begin
s := LowerCase(StrPas(FCurrentData));
if (s = FBoundary) then begin
PreparePart;
exit;
end
else if (s = (FBoundary + '--')) then begin
FEndOfMime := TRUE;
PreparePart;
exit;
end
else begin
for t := 0 to FEmbeddedBoundary.Count - 1 do begin
if (s = FEmbeddedBoundary[t]) or
(s = (FEmbeddedBoundary[t] + '--')) then begin
{ we now have to wait for the next part }
PreparePart;
exit;
end
end;
end;
end;
[..]
What do we see? When we hit epilogue of *the message*, we get information
about that we're done with MIME (whatever that should mean...). We don't
get *any* information if we crossed the ending boundary (--boundary--)
and start parsing epilogue. TMimeDec simply starts another part! My fix:
procedure TMimeDecode.ProcessPartLine; { ##ERIC }
var
Len : Integer;
t : Integer;
s : String;{ ##ERIC }
begin
{ Check if end of part (boundary line found) }
if (FCurrentData nil) and (FCurrentData^ #0) then begin
s := LowerCase(StrPas(FCurrentData));
if (s = FBoundary) then begin
PreparePart;
exit;
end
else if (s = (FBoundary + '--')) then begin
FPartOpened := False; //phd
TriggerPartEnd; //phd
exit;
end
else begin
for t := 0 to FEmbeddedBoundary.Count - 1 do begin
if s = FEmbeddedBoundary[t] then begin //phd
PreparePart; //phd
Exit; //phd
end else if s=(FEmbeddedBoundary[t] + '--')) then begin
FPartOpened := False; /phd
TriggerPartEnd; //phd
exit; //phd
end
end;
end;
end;
[..]
And I propose that we throw away that FEndOfMime. From my point of view,
it's useless, and still eats that byte or four (if compiler aligns variables
on dword boundaries).
--
Piotr Hellrayzer Dalek
Author of ICS-Based Hellcore Mailer - an Outlook Express killer
http://www.hcm.prv.pl
[EMAIL PROTECTED]
--
Najlepszy serwis MOTO w Polsce! http://link.interia.pl/f18a8
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be