![]() |
Max. Zeilenlänge erreicht
Nabend zusammen,
ich habe folgendes Problem. Ich lade alle meine Emails von meinem Email Acc via POP3 runter. Diese Speicher ich in Text Dateien ab. Die Textdateien nenne ich so, wie der Titel der Mail ist. Der titel wird so gefiltert, dass keine unerlaupten Zeichen drin stehen und auch die Länge wird auf 30 Zeichen begrenzt. Dennoch wird mir bei manchen Emails ausgegeben, dass die maximale Zeilenlänge erreicht wird. Diese Zeile wird mir Rot angezeigt: mname := trim(copy(IdMessage1.Subject, 0, 30)); Aber warum? Hoffe ihr könnt mir helfen. |
AW: Max. Zeilenlänge erreicht
Muss das nicht bei 1 anfangen, also ausnahmsweise mal nicht nullbasiert?
|
AW: Max. Zeilenlänge erreicht
Müsste bei 1 anfangen, ist bei Copy aber erst mal unkritisch.
Ist der komplette Dateipfad evtl. zu lang? Wo wird der Fehler genau ausgegeben und wie lautet er ganz genau? |
AW: Max. Zeilenlänge erreicht
Also hier der genaue Fehler:
![]() Und sobald ich auf "Anhalten" klicke, dann wird eben diese Zeile markiert: mname := trim(copy(IdMessage1.Subject, 0, 30)); Habs jetzt mal statt 0 auf 1 gesetzt. Wie gesagt, es ist nicht bei allen. Ich hab auch schon ein paar geladen. Das ist immer mal ab und zu. Könnte es sein, dass da irgendwas mit dem Titel der Email nicht stimmt, der der zu lang ist für nen String? |
AW: Max. Zeilenlänge erreicht
Zum Glück setzt Copy den Index von alleine auf 1 hoch :)
(leider sollte im Gegenzug die Länge gekürzt werden) OK, aber der Fehler hier hat vermutlich nichts mit dem Dateinamen zu tun. Das ReadLn hat einen internen Textpuffer, welcher nicht unbegrenzt groß ist und hier sieht es so aus, als wenn eine Zeile mal zu lang ist. Aber eigentlich der Text/Quellcode der eMail intern Zeilenumbrüche enthalten (jedenfalls laut Spezifikation), was hier wohl nicht der Fall ist und somit der Puffer überläuft. |
AW: Max. Zeilenlänge erreicht
Können das eingebettete MIME codierte Anlagen sein? Dann müsste der Fehler immer auftreten, wenn es eine eMail mit Anlage ist.
|
AW: Max. Zeilenlänge erreicht
Hallo erstmal,
Zitat:
[
Delphi-Quellcode:
Mfg Coffeecoder
mname := trim(copy(IdMessage1.Subject, 1, 10));
|
AW: Max. Zeilenlänge erreicht
Bedenke, daß es egal ist, was du bei Copy angibst.
(und schonwieder die 1 vergessen :wink:) IdMessage1.Subject wird komplett abgearbeitet und es gibt den vollständigen String zurück. Erst danach kopiert Copy einen Teil dort raus. Der Fehler scheint aber schon beim Download der Mail aufzutreten, aber auf jeden Fall tritt der schon bei Indy auf und nicht erst im Copy. Tritt dieses Problem bei einer bestimmten eMail auf? Wo kommt diese Mail denn her? Kannst du diese Mail mit was Anderem runterladen, bzw. dort mal reinsehn? (z.B. im Firefox > rechtes der Button "Andere Aktionen" > Quelltext anzeigen) Ich hoffe mal FF und andere Mailprogramme speichern den Quelltext unverändert ab. |
AW: Max. Zeilenlänge erreicht
Man könnte ja eine Zwischenvariable einführen.
Delphi-Quellcode:
s := IdMessage1.Subject; //nun müsste der Fehler hier kommen
mname := trim(copy(s, 1, 30)); |
AW: Max. Zeilenlänge erreicht
Sind eventuell Steuerzeichen enthalten?
|
AW: Max. Zeilenlänge erreicht
Ja also das Problem tritt immer bei einer bestimmten mail auf.
Habe mir die Mail, die es sein müste mal angesehen und stelle fest, dass da viele Bilder drin vorhanden sind. Aber keinen Anhang. |
AW: Max. Zeilenlänge erreicht
Bilder sind ja m.E. auch MIME codiert eingebettet.
Der MIME Code wird im MailEditor zwar mit Zeilenbruch angezeigt, kann aber sein, das der dort nur in der Ansicht eingefügt ist und tatsächlich ein Bytestrom > "Max Zeilenlänge" zusammenkommt. STOP: Es geht ja nur ums Subject also den Betreff der Mail, garnicht um den Inhalt!? Die Meldung kommt ja nur beim Zugriff aufs Subject, nicht bereits beim Abruf? €: Ich schaue gerade in den Sourcen von Indy. Letztlich lande ich in idCoderHeader.DecodeHeader. Dort scheint aber nichts darauf hinzuweisen, das es eine String-Begrenzung gibt. |
AW: Max. Zeilenlänge erreicht
Für das Subjekt wird ja auch der ganze Mail-Header runtergeladen ... und dort sollte es auch Zeilenumbrüche geben ... vielleicht ist dort ja schon was defekt
oder Indy hat ein Problem damit diese Zeilenumbrüche zu erkennen. |
AW: Max. Zeilenlänge erreicht
Also der Fehler müsste schon vor Zugriff auf IdMessage1.Subject auftreten. Der Filter für den MailHeader sieht zwar grausam aus, aber sollte keinen String-Längen Fehler bringen.
Also wie himitsu sagt, bereits davor beim Runterladen und wie DeddyH vorgeschlagen hat, die Aufgabe splitten, um den Fehler genauer zu lokalisieren. |
AW: Max. Zeilenlänge erreicht
Splitten der beiden Befehle ist eigentlich nicht notwendig, da schon die Fehlermeldung besagt, daß das Problem im Indy-Teil auftritt und nicht im Copy. :angle:
Man könnte aber noch fragen (falls ich's nicht übersehn hab) welche Delphiversion (integriertes Indy) oder welche Indy-Version hier genutzt wird. (ganz fehlerfrei sind die ja auch nicht immer gewesen) |
AW: Max. Zeilenlänge erreicht
Je nachdem wie weit das Projekt schon gediehen ist würde ich auch empfehlen es mal mit Synapse zu versuchen ;)
![]() |
AW: Max. Zeilenlänge erreicht
EIdReadLnMaxLineLengthExceeded:
:glaskugel: Du benutzt TIdPOP3 und einen IOHandler? Beim IOHandler läßt sich die Eigenschaft MaxLineLength einstellen. Desweiteren regelt die Eigenschaft MaxLineAction, ob eine Exception (EIdReadLnMaxLineLengthExceeded) erzeugt wird (maException) oder ob die empfangenen Daten aufgeteilt werden (maSplit). |
AW: Max. Zeilenlänge erreicht
Nein benutze keinen IO Handler.
Ich benutze Delphi XE und die Indyversion, die dabei war. Finde jetzt leider nicht, wo ich die genaue Version finde. Ist aber auf jedenfall min. Indy 10. Komisch ist ja, das es bei anderen Email Accounts von mir funktioniert. Und auch die sind von Web.de. Es scheint irgendwie was mit dieser einen Mail zu sein. Aber auch das Subject dieser Mails besteht nur aus ca. 20 Zeichen. Und andere bei denen es funktioniert bestehen aus wesentlich mehr zeichen. |
AW: Max. Zeilenlänge erreicht
Zitat:
|
AW: Max. Zeilenlänge erreicht
Ja, genau! :thumb:
Da die Indy-Komponenten für den Datentransfer einen IOHandler benötigen, legen sie für den Fall, daß keiner zugewiesen wurde, selbst einen an. Über den kann dann auch die Einstellung vorgenommen werden. Siehe Delphi-Hilfe unter IOHandler, TIdTCPConnection. P.S.: Indy liest ja nicht nur das Subject einer Email. Da werden noch viel mehr Daten durch die Leitung geschickt. Diese Daten werden zeilenweise empfangen: Es wird also in der Standardeinstellung solange gesammelt, bist ein Zeilenende erkannt wurde. Paßt das Ganze nicht in den Empfangspuffer, meckert Indy eben. Soll das verhindert werden, muß man die entsprechenden Einstellungen vornehmen. Dann funktioniert es auch. :wink: |
AW: Max. Zeilenlänge erreicht
Ok ich werde es versuchen, die Frage ist nur, welcher IO Handler ist der richtige?
Habe nur folgende zur Auswahl und finde nicht, dass da ein passender dabei ist: 1. IOHandlerStack 2. IOHandlerStream 3. ServerIOHandlerStack 4. ServerIOSSLOpenSSL 5. SSLIOHandlerSocketOpenSSL Welchen nehme ich denn da am besten? |
AW: Max. Zeilenlänge erreicht
ich würde mal IOHandlerStream versuchen.
Server- und SSL-Zeugs kannste ignorieren |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 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