Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Max. Zeilenlänge erreicht (https://www.delphipraxis.net/160509-max-zeilenlaenge-erreicht.html)

SyntaxXx 16. Mai 2011 21:58

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.

Jumpy 16. Mai 2011 22:34

AW: Max. Zeilenlänge erreicht
 
Muss das nicht bei 1 anfangen, also ausnahmsweise mal nicht nullbasiert?

Satty67 16. Mai 2011 22:41

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?

SyntaxXx 16. Mai 2011 22:49

AW: Max. Zeilenlänge erreicht
 
Also hier der genaue Fehler:

http://img6.imagebanana.com/img/8prr...rMaxLength.png


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?

himitsu 17. Mai 2011 00:09

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.

Satty67 17. Mai 2011 06:42

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.

Coffeecoder 17. Mai 2011 06:54

AW: Max. Zeilenlänge erreicht
 
Hallo erstmal,

Zitat:

Zitat von himitsu (Beitrag 1101251)
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.

Wenn dies der Fall ist dann versuche mal anstelle von 30, nur 10 mal Stellen zu kopieren nur um zu testen:

[
Delphi-Quellcode:
mname := trim(copy(IdMessage1.Subject, 1, 10));
Mfg Coffeecoder

himitsu 17. Mai 2011 07:08

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.

DeddyH 17. Mai 2011 07:36

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));

Luckie 17. Mai 2011 07:40

AW: Max. Zeilenlänge erreicht
 
Sind eventuell Steuerzeichen enthalten?

SyntaxXx 17. Mai 2011 07:42

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.

Satty67 17. Mai 2011 07:47

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.

himitsu 17. Mai 2011 08:10

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.

Satty67 17. Mai 2011 08:18

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.

himitsu 17. Mai 2011 08:30

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)

Sir Rufo 17. Mai 2011 08:51

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 ;)
email mit Synapse

Thom 17. Mai 2011 09:38

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).

SyntaxXx 17. Mai 2011 12:35

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.

Satty67 17. Mai 2011 12:52

AW: Max. Zeilenlänge erreicht
 
Zitat:

Zitat von SyntaxXx (Beitrag 1101351)
Nein benutze keinen IO Handler.

So wie ich Thoms Aussage verstehe, sollst Du dann einen benutzen, um das Verhalten entsprechend beeinflussen zu können.

Thom 17. Mai 2011 13:51

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:

SyntaxXx 17. Mai 2011 17:29

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?

himitsu 17. Mai 2011 18:29

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