![]() |
AW: email-downloader as as service
Hmm..
Mal ne ganz andere Idee: Wieso 'zerlegst' Du die Mail? Anstelle alles einzeln abzuspeichern, kannst Du die Mail doch direkt als Stream in deine DB speichern, dann hast Du immer alle Anhänge, eingebettete Bilder und so weiter enthalten. Somit hast Du nur für die schnelle Suche die Kopfdaten und zur Anzeige wird die Message dann mit LoadFromStream geladen und angezeigt. Wenn die Anhänge dann doch extern benötigt werden, dann kann der User diese aus der Ansicht heraus dort speichern, wo er sie benötigt. So bleiben alle Bestandteile deiner Mail zusammen, incl. der Eingebetteten Bilder. Wenn Du dir sorgen um die Datenbankgröße machst, dann kannst Du den Mailstream vor dem speichern in die DB ja noch packen. Nur mal so ne Idee.. ;) Nach dem Pronziep arbeiten eigendlich die meisten EMail-Programme (Outlook/Thunderbird). ;) |
AW: email-downloader as as service
Hallo HolgerX
vielen Dank für deinen Tipp - hab jetzt deinen Ansatz angefangen .. die Mails werden jetzt in ein BLOB Field gespeichert Nun hab ich aber ein Problem: Wenn ich den Stream lade und in einen Iframe sende sehe ich nun den Quelltext der Mail: Zitat:
Ich mache momentan folgendes zum Speichern:
Delphi-Quellcode:
pop.Retrieve(intIndex, Msg);
.... Msg.SaveToStream(BlobStream); BlobStream.Position := 0; MAILDATENBANK.Close; MAILDATENBANK.SQL.Text := 'insert into MAILDATENBANK (INR, USER_INR, DATEN) values (:inr, :user_inr, :daten)'; MAILDATENBANK.ParamByName('inr').AsString := neue_nummer; MAILDATENBANK.ParamByName('user_inr').AsInteger := USER_INR; MAILDATENBANK.ParamByName('daten').LoadFromStream(BlobStream, ftBlob); MAILDATENBANK.ExecSQL; BlobStream.Free; Irgendwie verstehe ich das ganze nicht ... ich brauch für die Darstellung der Mail die Binärdaten der eingebetteten Bilder -- aber zur Darstellung der Mail benötige ich die Msg.Body-Daten Keine Ahnung, wie ich nun diesen eMail-Stream darstellen könnte (und das für alle möglichen Content-Types) Bei meiner "alten" Lösung habe ich Msg.ContentType verwendet...
Delphi-Quellcode:
if Msg.ContentType = 'text/html' then
begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; if AnsiContainsStr(Msg.ContentType, 'text/plain') then begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; if Msg.ContentType = 'multipart/alternative' then begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; if Msg.ContentType = 'multipart/mixed' then begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; if Msg.ContentType = 'multipart/related; type="multipart/alternative"' then begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; if AnsiContainsStr(Msg.ContentType, 'application/pdf') then begin Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; //Mailteile for i := 0 to Msg.MessageParts.Count-1 do begin erledigt:=0; if Msg.MessageParts.Items[i] is tIdAttachment then begin anzahl_anhang:=anzahl_anhang+1; s := (Msg.MessageParts.Items[i] as tIdAttachment).Filename; extensio:= ExtractFileExt(s) ; (Msg.MessageParts.Items[i] as tIdAttachment).savetofile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\Anhang_' + neue_nummer +'_'+inttostr(anzahl_anhang)+extensio); MAILDATENBANK.Edit; MAILDATENBANK.FieldByName('ANHANG_ANZAHL').AsInteger:=anzahl_anhang; MAILDATENBANK.Post; Z_NUMMER.SQL.Clear; Z_NUMMER.SQL.add('SELECT GEN_ID( POOL, 1 ) AS IDR FROM RDB$DATABASE'); Z_NUMMER.open; MAILANHANG.Append; MAILANHANG.FieldByName('INR').AsInteger:=Z_NUMMER.FieldByName('IDR').AsInteger; MAILANHANG.FieldByName('PR').AsString:=neue_nummer; MAILANHANG.FieldByName('ORIGINALNAME').AsString:= (Msg.MessageParts.Items[i] as tIdAttachment).FileName; MAILANHANG.FieldByName('FILE').AsString:= 'Anhang_' + neue_nummer +'_'+inttostr(anzahl_anhang)+extensio; MAILANHANG.Post; end; if Msg.MessageParts.Items[i] is TIdText then begin TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8); end; end; // for i := 0 to Msg.MessageParts.Count-1 do end; // Die Mail habe ich noch nicht |
AW: email-downloader as as service
Hmm..
Ich mache es bei meinem EMail-Viewer so: - Lade die Mail in IDMessage - Speichere alle Anhänge 'Temporär' ins User\temp- Verzeichnis (als weiteres Unterverzeichnis verwende ich dann eine GUID). - Nehme den Body und ersetze die IFrames mit den absoluten Pfadangaben zum Bild. - Gebe den Body an den TWebBrowser zur Anzeige. (bei reinen Text-Bodys um die HTML-Tags ergänzt). Dieser Browser zeigt dann die Mail inclusive der Bilder an. Wenn die Anzeige dieser Mail beendet wird, lösche ich (anhand der Verzeichnisguid identifiziert) die Temporären Dateien wieder. Wenn der Betrachter geschlossen wird, gibt es somit keine Dateien irgendwo liegen. Das gleiche Prinzip nutzen eigentlich alle EMail-Viewer. |
AW: email-downloader as as service
Was mir auffällt, falls Du mal die Mails löschen willst:
Delphi-Quellcode:
for intIndex := 1 to MailCount do solltest Du dann besser rückwärts durchlaufen, sonst bekommst Du Meldungen ala "mail with sequence number 9 was deleted earlier" nur als kleiner Hinweis... Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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