Frage

Ich arbeite an einer deamon Anwendung, dass Verwendungen E-Mail-Posteingang als Eingangswarteschlange. Die Reaktionszeiten sollten Overhead mit Server so hoch wie möglich sein, um gering wie möglich gehalten, so Polling E-Mail-Posteingang der Frage aus. Als IMAP-Protokoll die Benachrichtigungen über neue E-Mails ermöglicht, das ist ideal für die Anwendung.

Allerdings habe ich in Schwierigkeiten kommen, wenn ich versuchte, diesen Mechanismus in meinem Delphi / Indy Anwendung zu implementieren. TIdIMAP4 funktioniert gut (abgesehen von einigen Unicode Problemen, die in meinem Fall nicht relevant sind), aber ich kann den Weg nicht finden, um Benachrichtigungen zu implementieren darin.

Dies sollte ein einfaches GIYF Problem sein, aber für einige zu mir unbekannten Grund, finde ich nicht alle relevanten Informationen über Indy Komponenten bei der Online-Suche.

Eine Lösung oder alternative Ansätze würden sehr geschätzt werden.

Edit:. Da Indy appearently nicht asynchron unterstützt E-Mail-Benachrichtigungen, Weiß jemand, welcher freie Komponenten für delphi, dass ermöglichen würde,

War es hilfreich?

Lösung

TIdIMAP4 bietet keine Unterstützung für asynchrone Benachrichtigungen empfangen, wie neue E-Mail benachrichtigt. Das würde erfordern TIdIMAP4 Implementierung auf einem multithreaded Modell ähnlich dem, was TIdTelnet Nutzen, aber komplexer, weil der TIdIMAP4 der Stromsperrbefehl / Antwort-Modell ändern. Vorerst müssen Sie den Posteingang regelmäßig abzufragen.

Andere Tipps

Warum nicht die App einen SMTP-Server machen, statt Kunden.

Auf diese Weise können direkte Benachrichtigung haben, wie die E-Mail an Ihre App direkt gesendet wird, anstatt neue E-Mail zu ziehen.

Es gibt ein paar Fallbacks, in dieser E-Mail wird nicht Warteschlange, wenn Ihre Anwendung ist nach unten, obwohl ich sicher bin, dass MS Exchange oder Postfix usw. kann sehr gut mit ihm Setup Arbeit sein.

Ok. Dies ist eine alternative Lösung. Angenommen, es gibt keinen Grund, die Sie verwenden möchten E-Mails (zB Ihre Informationen kommen Form eine externe Quelle per E-Mail), dann würde ich eine Datenbanktabelle deutet auf eine viel einfachere Art und Weise zu sein, eine Eingabewarteschlange zu erstellen.

abfragen, einfach die Datenbank auf einer regelmäßigen Basis. Das wäre viel, viel schneller als Polling ein E-Mail-Posteingang, und viel schneller, als Sie denken, es sein wird. Polling eine Datenbank ist sehr schnell und man konnte leicht eine Datenbanktabelle mehrere hundert Mal pro Minute mit sehr wenig nennenswerten Einfluss auf die Leistung abzufragen.

Sie einfach eine Tabelle erstellen Sie Ihre Q Elemente zu speichern, und fügen Sie ein zusätzliches Feld, dass Sie einen Zeitstempel oder Flag speichern können, dass dieses q Stück gehandhabt wurde, dann nehmen Sie einfach den nächsten unhandled Artikel vom Stapel

eg mssql

select Top 1 * from tbl_MyQ where AlreadyHandled = 0 

mysql

select  * from tbl_MyQ where AlreadyHandled = 0 Limit 1

dann

update tbl_MyQ Set AlreadyHandled = 1 where QueueID = #ItemIDRetrieved#

Datenbanken sind schnell, einen Test durchführen, wenn Ihr besorgt. Und sie sind viel, viel weniger kompliziert als IMAP Ereignisse und E-Mail-Postfächer.

Wenn der E-Mail-Posteingang (IMAP) eine Grundvoraussetzung in Ihrer Architektur ist und es gibt keine IMAP-Clients zur Verfügung, würde ich versuchen, einen IMAP-Client mit asynchroner Benachrichtigung in einer anderen Sprache geschrieben zu finden (C, C # oder auch Java) zu Umsetzung ein ‚Proxy‘ oder Gateway, das dann Ihren Delphi-Daemon App auslösen wird, wenn neue Nachrichten eintreffen.

Der Delphi-Daemon könnte ein einfaches Socket-basiertes Protokoll verwenden oder http die Nachrichten (TIdHTTPServer, TIdTCPClient) zu erhalten.

Wenn die Lernkurve von Indy zu steil ist, können Sie eine protoype mit dem Ararat Synapse TCP / IP-Bibliothek schreiben könnte, die freie und Open Source ist, es funktioniert sehr gut in meinem Delphi 2009-Anwendungen (mit Ausnahme, dass der Compiler über einige beschwert String / ANSI-Conversions).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top