Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SMTP-Server braucht zu lange um erhaltene Mail zu speichern (https://www.delphipraxis.net/133928-smtp-server-braucht-zu-lange-um-erhaltene-mail-zu-speichern.html)

MasterEvil 12. Mai 2009 10:57


SMTP-Server braucht zu lange um erhaltene Mail zu speichern
 
Hallo,

ich habe einen SMTP-Server mit Indy IdSmtpServer implementiert und ein Problem beim Erhalten von größeren E-Mails.
Diese werden erfolgreich zum Server versandt und im SMTP-Server wird OnMsgReceive ausgelöst.
Nun speicher ich dort die E-Mail auf die Festplatte und trage Daten in die Datenbank ein.
Dies ist bei kleinen E-Mails alles kein Problem.

Die Ausnahme bilden sehr große Mails über 20 MB. Dort dauert das Speichern der E-Mail am Server zu lange für die meisten Timeouts der Clients. Das OK zurück an den Client kommt erst nach dem Speichern. Dazwischen laufen keine Daten zwischen Client und Server und der Client denkt irgendwann das nichts mehr kommt und wirft einen Timeout. Der Client denkt dann, dass die E-Mail nicht erfolgreich versandt wurde und der Server hat die E-Mail aber komplett und weiß nicht, dass der Client das denkt. So wird so eine E-Mail immer mehrmals versandt.

Jetzt könnte man natürlich diesen Timeout beim Client immer hochregulieren, aber ich dachte, dass der Server evtl. zwischendurch sozusagen einen PING senden kann, dass er noch etwas tut. Hab mich dann auch durch das RFC für SMTP gebuddelt. Dort gibt es auch den NOOB Command, der für so etwas ansich gedacht ist. Dieser muss aber vom Client ausgeführt werden und nicht vom Server. Ist also die falsche Richtung ...

Kennt jemand evtl. eine Lösung?

Gruß,
Steffen

Assertor 12. Mai 2009 11:08

Re: SMTP-Server braucht zu lange um erhaltene Mail zu speich
 
Hi MasterEvil,

ich weiß nicht, ob ich Dein Problem richtig verstanden habe, aber ich würde die empfangenen Mails zunächst in ein Verzeichnis speichern und dann z.B. per Thread in die DB schieben. Das sollte sicherstellen, daß der Server direkt nach dem Erhalt Rückmeldung geben kann.

Gruß Assertor

P.S.: Dein Server wurde gehackt - das steht "HACKED BY DR.HACKER THEH4CKERS GROUP"... Hast wohl eine Sicherheitslücke.

SirThornberry 12. Mai 2009 11:18

Re: SMTP-Server braucht zu lange um erhaltene Mail zu speich
 
Ich glaube sein Problem war ja gerade das eben das Speichern auf Platte zu lange dauert.
Ich würde entsprechend die eingehende Message nicht direkt auf Platte schreiben sondern das einem anderen Thread überlassen. Dem muss dann nur das TIdMessage übergeben werden und gut ist.

MasterEvil 12. Mai 2009 11:45

Re: SMTP-Server braucht zu lange um erhaltene Mail zu speich
 
Das Problem ist, dass ich von Indy einen Stream bekomme, ich aber schon für eine Sicherheitsabfrage die Absenderadresse brauche. Daher muss ich den Stream erstmal in eine IdMessage laden. Dann übergebe ich die IdMessage an eine Datenbankroutine, die sich alle Daten da rauspflückt und die original E-Mail auf Festplatte speichert. Hier brauche ich aber auch das Ok, dass das geklappt hat. Denn ansonsten schlägt evtl. dort etwas fehl, aber der Client hat schon ein OK zurückbekommen und denkt die E-Mail wäre erfolgreich rausgegangen.
Dies OK kann ich nicht mehr Auswerten, wenn ich es in einen Thread auslagere :(

Man muss doch dem Client irgendwie mitteilen können, dass er noch etwas warten muss :/

@ Assertor:
Ja, da ist einer an meine Datenbank rangekommen und hat alle Datensätze verändert. Habe aber noch ein Backup, nur noch keine Zeit gefunden es einzuspielen ;) Aber danke.

Dax 12. Mai 2009 12:16

Re: SMTP-Server braucht zu lange um erhaltene Mail zu speich
 
Die Absenderadresse steht nicht immer in der Mail. Besser wäre es, auf die entsprechenden Events des SMTP-Servers zu reagieren, wenn er ein MAIL FROM: bekommt.

MasterEvil 12. Mai 2009 12:56

Re: SMTP-Server braucht zu lange um erhaltene Mail zu speich
 
Es soll aber verhindert werden, dass sich in einer Mail jemand für jemand anderen ausgibt, deswegen muss ich gerade das FROM in der Mail ansehen. Aber ansonsten hast du sicher recht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.

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