2017-04-15 6 views
10

Ich habe einen benutzerdefinierten E-Mail-Server und Web-Client implementiert. Der Server ist nur eine REST-API (ähnlich der Google Mail-API von Google), die einen Drittanbieter (sendgrid) zum Senden und Empfangen verwendet. Die E-Mails werden in einer Datenbank gespeichert. Der Webclient kommuniziert nur mit dem REST-Client zum Senden und Empfangen.IMAP Server Facade - wie macht man das?

Das Problem bei diesem Ansatz ist es nicht IMAP überall nicht implementiert, die es unmöglich für Standard-Clients (Outlook, iPhone, etc.) zu verbinden und nutzen Sie unseren E-Mail-API macht. Dies beschränkt die Kunden darauf, nur unseren Client für E-Mails zu verwenden.

Was ich brauche ist eine Art von IMAP-Server "Fassade", die die Verbindungen zu Clients verwalten und Aufrufe an meine REST API für die tatsächliche Bearbeitung der Anfragen (E-Mail, E-Mail senden, etc.).

Wie kann eine IMAP-Fassade umgesetzt werden? Gibt es vielleicht eine Möglichkeit, einen bestehenden MailServer zu nehmen und ihn auf all seine "Ereignisse" zu lenken, um Aufrufe an meine API zu richten?

+0

Ja, das ist möglich. Mit Dovecot können Sie beispielsweise Speichermodule anschließen. – arnt

+0

Haben Sie eine bevorzugte Sprache? – vzwick

+0

Die Frage sagt .net, also C# ish ... aber es gibt nicht viel IMAP-Server-Code in C#. Client, ja, sicher, aber nicht Server, und bei weitem der größte Teil des Problems ist IMAP zu dienen ... – arnt

Antwort

2

(Dies ist im Grunde wieder mein Kommentar, sondern erarbeitet einiges mehr.)

Einiger IMAP-Server, vor allem Dovecot, ist so aufgebaut, dass der Dateizugriff in einem separaten Modul mit einer definierten Schnittstelle ist. Dovecot ist nicht das einzige, aber es ist bei weitem das beliebteste und seine Backend-Schnittstelle ist bekannt dafür, angemessen zu sein, so würde ich das abwesend spezifische Bedenken nehmen.

Es existiert bereits nicht-Datei Module wie imapc, was beweist, dass es getan werden kann. Wenn ein Client eine Mailbox von imapc gesichert öffnet, Dovecot IMAP-Befehle analysiert, ruft Nachrichtenzugriffsfunktionen in imapc, imapc Probleme neue IMAP-Befehle, analysiert die Server-Antworten, kehrt C structs zu Dovecot, Dovecot Moden neue IMAP-Antworten und gibt sie an den Client .

Ich schlage vor, dass Sie die dovecot source nehmen, schauen Sie sich src/lib-storage/inbox/index/imapc und den anderen Backends in that directory und ein implementieren, die Ihre REST-API als Client spricht.

2

tl: dr; schreibe dein Gateway in Perl; Verwenden Sie Net :: IMAP :: Server; überschreiben Net :: IMAP :: Server :: Postfach; und verwenden Sie einen der vielen Perl-REST-Clients, um mit Ihrem Server zu kommunizieren.

Ihre beste Wette, um dies schnell und unter Beibehaltung einer angemessenen Menge an Code-Sicherheit zu tun, ist mit Perl. Sie benötigen zwei Perl-Module. Die erste ist Net::IMAP::Server und here ist das Github-Repository für dieses Modul. Dies ist ein standardkonformer RFC 3501-Server, der absichtlich für einen konfigurierbaren Mail-Speicher konzipiert wurde. Sie überschreiben die standardmäßige Net :: IMAP :: Server :: Mailbox-Implementierung mit Ihrem eigenen Code, der mit Ihrem benutzerdefinierten E-Mail-Backend kommuniziert.

Wählen Sie für Ihr zweites Modul Ihre bevorzugten Perl-Module aus, die Sie verwenden möchten, um mit Ihrem REST-Server zu sprechen. Ihre Wahl hängt davon ab, wie viel feinste Kontrolle Sie über die Konstruktion und Lieferung der REST-Nachrichten haben wollen.

Zum Glück, hier haben Sie jede Menge Auswahl. Eine Möglichkeit ist Eixo::REST, die ein Github-Repository here hat. Eixo :: REST scheint sich gut mit asynchronen vs. synchronen REST-API-Aufrufen zu befassen, bietet jedoch nicht viel Kontrolle über die X509-Schlüsselverwaltung. Abhängig davon, wie googley Ihre API ist, gibt es auch das Modul REST::Google. Interessanterweise hat diese Familie auch ein REST::Google::Apps::EmailSettings Modul, speziell um Gmail-spezifische Funkiness wie Etiketten und Sprachen einzustellen. Schließlich scheint das REST::Consumer Modul viele HTTPS-spezifische Dinge wie Timeout und Authentifizierung als Parameter für die Perl-Objekt-Instanziierung einzukapseln.

Wenn Sie diese vorhandenen Frameworks verwenden, sollten bereits 90% des erforderlichen Codes für Sie erledigt sein.

Tun Sie dies nicht, indem Sie Dovecot oder einen anderen in C oder C++ geschriebenen Mail-Server hacken. Wenn Sie einen Mail-Server schnell mit einer kompilierten Sprache hacken, wird Ihr Server früher oder später die ganze Freude an Pufferüberläufen und Stack-Zerschlagen erfahren und alles andere, was das Internet tut, um über Mail-Server hinwegzukommen. Lass es zuerst sicher arbeiten und dann später optimieren.

+0

Sinn macht. Und Perl scheint eine ideale Sprache für den Umgang mit E-Mails zu sein, da Perl bei der Textanalyse und -verwaltung eine Rolle spielt. Also ich brauche dann einen Perl-Guru, da ich sehr Perl-noob bin und nicht die Zeit dazu habe ... – richard

1

Da Sie mit .NET vertraut sind, würde ich vorschlagen, eine der folgenden Implementierungen von IMAPv4 Server nach Ihren Wünschen Hacking:

  • Lumisoft Mail Server - ein sehr altes Projekt in der Tat (nennen wir es „reifen“, nicht wahr?). Lassen Sie sich von der jahrzehntelangen Website und dem Fehlen eines GitHub-Links nicht abschrecken - die Quelle finden Sie unter "Andere Downloads".
  • McNNTP - auch ein älteres Projekt und mit einem Hauptaugenmerk auf NNTP (wie der Name sagt), aber sehr nahe an dem, was Sie in Bezug auf die IMAP-Komponente erreichen wollen. Take a look, you'll probably find this a good starting point.