Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdIMAP4 - Mail nicht vollständig bei .<CR><LF> Zeile (https://www.delphipraxis.net/150590-tidimap4-mail-nicht-vollstaendig-bei-cr-lf-zeile.html)

moelski 21. Apr 2010 14:07


TIdIMAP4 - Mail nicht vollständig bei .<CR><LF>
 
Moin !

Ich rufe mit TIdIMAP4 ein IMAP Postfach ab. Das klappt im Normalfall auch.

Wenn aber in der Message eine Zeile vorkommt mit
Code:
.<CR><LF>
dann bricht das abholen der Mail an der Stelle ab und die Mail ist unvollständig.

Nun ist .<CR><LF> ja gleichzeitig das Ende der Daten einer SMTP Übertragung. Kann man das Verhalten von TIdIMAP4 irgendwo beeinflussen das er die ganze Mail - unabhängig vom Inhalt - liesst?

Zum Lesen nutze ich übrigens das hier:
Delphi-Quellcode:
  nCount := TheImap.MailBox.TotalMsgs;
  if nCount = 0 then begin
      SiMain.LogDebug('There are no messages in ' + TheImap.MailBox.Name);
      GetMail := False;
      Exit;
  end else begin
    // Email abholen ....
    TheImap.GetUID(ID + 1, FEMail_UID);
    SiMain.LogInteger('MsgSize', TheImap.RetrieveMsgSize(ID+1));
    TheImap.Retrieve(ID + 1, TheMsg);
    GetMail := True;
  end;
Bin im Moment echt ratlos.
Ich habe mir sogar schon die internen Stream angesehen die in IdIMAP4.pas erzeugt werden. Selbst die sind schon unvollständig wenn die obige Zeile kommt.

:gruebel: *confused i bin* :gruebel:

moelski 22. Apr 2010 08:17

Bug in IdIOHandler -> ReadLnRFC
 
Moin !

Ich denke hier ist der Fehler zu finden:
Delphi-Quellcode:
function TIdIOHandler.ReadLnRFC(var VMsgEnd: Boolean; const ALineTerminator: string;
  const ADelim: String = '.'; AByteEncoding: TIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}
  ): string;
begin
  Result := ReadLn(ALineTerminator, AByteEncoding
    {$IFDEF STRING_IS_ANSI}, ADestEncoding{$ENDIF}
    );
  // Do not use ATerminator since always ends with . (standard)
  if Result = ADelim then
  begin
    VMsgEnd := True;
    Exit;
  end;
  if TextStartsWith(Result, '.') then begin {do not localize}
    Delete(Result, 1, 1);
  end;
  VMsgEnd := False;
end;
Das kann nicht funktionieren. Denn wenn in der Mail ein . steht in einer Zeile, dann wird das als Ende interpretiert.
Mir ist auch nicht klar warum man Punkte am Anfang einer Zeile löscht.

So ein Mist ... Wie soll man damit Mails sauber empfangen können :evil:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz