Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   email-downloader as as service (https://www.delphipraxis.net/192647-email-downloader-service.html)

HolgerX 12. Mai 2017 15:09

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

erich.wanker 1. Jun 2017 14:02

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:

Return-Path: Received: from mout.kundenserver.de ([xxx]) by mx.kundenserver.de
(mxeue010 [xxx]) with ESMTPS (Nemesis) id 1N7Rkr-1dxx7n1M for ; Thu, 01 Jun
2017 13:57:31 +0200 Received: from black1 ([xxx]) by mrelayeu.kundenserver.de
(mreue0x [xxx]) with ESMTPA (Nemesis) id 0Mxx5p-1dBDexxxORq for ; Thu, 01 Jun
2017 13:57:31 +0200 From: "Erich Wanker *** xx" To: xxx Subject: blob Date:
Thu, 1 Jun 2017 13:57:35 +0200 MIME-Version: 1.0 Content-Type: multipart/related;
boundary="oCntjxxxY4" X-Mailer: Microsoft Office Outlook, Build 11.0.5510
Thread-Index: AdLxxxx+pb2gm3w== X-Mi
...
....


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

HolgerX 1. Jun 2017 14:57

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.

sko1 2. Jun 2017 11:48

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 01:56 Uhr.
Seite 2 von 2     12   

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