[C++Builder] Anhänge einzeln aus einer Email extrahieren
-
Guten morgen,
ich habe folgendes Problem:
Ich möchte mit einer TNMPOP3-Komponente Emails von einem Mailserver abrufen. Dabei soll die Email zuerst nach bestimmten Kriterien überprüft werden. Also ob sie einen bestimmten Betreffausdruck hat, oder ob der Bodytext der Email stimmt!
Dann wird als letztes überprüft, ob überhaupt Anhänge vorhanden sind! für die spätere Weiterverarbeitung werden dann nur noch einige Anhänge benötigt!
Nun ist meine Problem, dass ich die Relevanzprüfung mit der Email zwar hinbekomme, aber jetzt möchte ich bestimmen können, ob und WELCHER extrahiert werden kann/soll.
Wenn eine Email z.B. 4 Anhänge besitzt mit den Namen test1.txt, test2.txt, test3.txt, test4.txt
dann möchte ich gerne bestimmen können, dass z.B. nur der Anhang "test4.txt" abgespeichert werden soll! (Und zwar dort abgespeichert, wo ich mit AttachFilePath angegeben habe!).
Meine Frage ist nun ist das möglich? Und wenn ja, wie realisiere ich das??!!
Vielen Danke für die Antworten
Gruß
-
http://www.marquardtnet.info/cecke/quickies.1/1_quicky_39.html
Empfehle die Indy-Komponenten. Die Fastnet Komponenten werden wohl in der 2006er Version nicht mehr dabei sein.
-
Erst mal danke!
Kann man damit jetzt auch angeben, dass nur bestimmte Attachments abgespeichert werden sollen??
In dem Bsp.:
else if(att&&att->ClassNameIs("TIdAttachment")) { att->SaveToFile("g:\\"+att->FileName); }wird ja jetzt nur überprüft, ob Anhänge vorhanden sind, oder??
Gut wäre es, wenn man jetzt sagen könnte:if(att&&att->AttachmentName == "test4.txt") { att->SaveToFile(); }Damit man überprüfen angeben kann, welchen Anhang man abspeichern möchte!
-
for(int y=0;y<IdMessage->MessageParts->Count;y++) { TIdText *msgText= dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[y]); TIdAttachment *att= dynamic_cast<TIdAttachment*>(IdMessage->MessageParts->Items[y]); if(msgText&&msgText->ClassNameIs("TIdText")) { Memo1->Lines=msgText->Body; } else if(att&&att->ClassNameIs("TIdAttachment")) { att->SaveToFile("g:\\"+att->FileName); } }Schon mal bitte die ganze Schleife ansehen und analysieren. Es ist was in der Mail, entweder Text oder ein Anhang. Ob du den Anhang dann speicherst oder verwirfst oder ganz anders an die Sach rangehst bleibt ja dir überlassen. att->FileName enthält den Filenamen-> den könnte man prüfen -> so irgendwann vor dem speichern-> oder dann auch nicht speichern
-
Danke schön, dass hat mir schon sehr weitergeholfen!
Ich hab jetzt noch eine Frage zu diesem Problem! Wenn ich den richtigen Anhang erwische, möchte ich ihn ja in einen Ordner meiner Wahl abspeichern.
z.B. unter C:\Anhänge\....
Mit dem Befehl
att->SaveToFile("C:\Anhaenge\\" + att->FileName);erreiche ich ja genau diesem Effekt! Doch alle Emails die ich einlesen werde haben den gleichen Anhangs-Dokumentennamen.
Ich möchte aber, dass jede Datei einzeln in dem Ordner C:\Anhänge gespeichert wird!
Windows geht ja her, und fügt an einen Dateiname die Ergänzung (1) zum Beispiel an, wenn eine Datei doppelt in einem Ordner vorkommt!Doch in meinem Fall wird der Inhalt der Anhänge immer der einzigen Datei hinzugefügt oder?!
Wie kann ich das ändern??Danke für die Antwort
Gruß
-
att->SaveToFile("g:\\"+att->FileName+IntToStr(y));Wäre eine schnelle Methode. Ansonsten musst du dir in einer Zählvariablen merken, wie oft du schon gespeichert hast, und diese dann oben einsetzen
int gespeichert=0; ..... att->SaveToFile("g:\\"+att->FileName+IntToStr(gespeichert)); gespeichert++;
-
Idealerweise würde man wohl mit FindFirst etc. oder FileExists nachsehen, ob eine gleichnamige Datei vorhanden ist. Wenn ja, den Zähler hochsetzen und nochmal prüfen, usw. usf.
Windows selbst sorgt übrigens nicht für eine fortlaufende Nummerierung identisch benamster Dateien (einfach mal im Explorer ausprobieren); wenn, dann macht das das jeweilige Programm.