
Ich denke über die Architektur eines Systems nach, das eingehende E-Mails verarbeiten und an eine Rails-App weiterleiten soll, die die eingehenden E-Mails verarbeitet. Ich bin mir nicht sicher, wie man so etwas am besten macht.
Es sollte so funktionieren:
- E-Mails werden an eine Adresse wie contact@user_id.myapp.com gesendet.
- Der Mailserver nimmt die Mails entgegen und leitet sie an die Rails-App weiter (oder speichert sie und die Rails-App holt sie ab)
- Die Rails-App verarbeitet die E-Mails (analysiert sie und wirft sie dann in die Datenbank)
Es sollte grundsätzlich wie eine Warteschlange funktionieren. Plötzliche Spitzen im E-Mail-Verkehr sollten die Rails-App nicht zum Absturz bringen.
Ich suche keine Komplettlösung. Mich interessiert nur eure Meinung. Mir sind 3 Möglichkeiten eingefallen:
- Rails verbindet sich über Pop3 mit dem Mailserver und lädt nur die Nachrichten herunter (wahrscheinlich langsam)
- Der Mailserver leitet die Mails mit einer POST-Anfrage an die Rails-App weiter (wahrscheinlich auch zu langsam, könnte den Webserver bei einer Mailbombe lahmlegen)
- Das Mailverzeichnis ist virtuell in das Dateisystem des Rails-App-Servers eingebunden (Mailserver und App-Server müssen getrennt sein) und Rails liest direkt daraus.
Was ist Ihrer Meinung nach der beste Ansatz in Bezug auf Leistung und Sicherheit? Übersehe ich hier etwas? Gibt es einen besseren Weg? Kennen Sie einige Best-Practice-Ressourcen?
Danke!
Antwort1
Hier ist ein Beitrag, der hilfreich sein könnte:
Empfangen von E-Mails und Anhängen mit Rails
Der Artikel enthält auch Links zu früheren Beiträgen zum Einrichten von RailsCron.
Antwort2
Ich habe Apps gesehen, die dies mit POP3 machen (Spiceworks ist ein Beispiel, das mir einfällt). Ich denke, es ist eine gute Möglichkeit, den App-Server vom Mailserver zu trennen, und ermöglicht es Ihnen, den Mailserver sich auf das zu konzentrieren, was er gut kann, und den Client von den Warteschlangen-/Speicheraufgaben für die Nachrichten zu befreien.
Betreff: Sicherheit
Ein Problem mit POP3, das mir in den Sinn kommt, ist die standardmäßige Verwendung von Klartext-Anmeldeinformationen. Wenn Sie es über SSL ausführen können (abhängig vom Mailserver), können Sie dieses Problem ausräumen.
Betreff: Leistung und Skalierung
Ich bin mir nicht so sicher, ob der POP3-Zugriff so langsam sein wird. Ich wäre vorsichtig, die Integration auf Dateisystemebene durchzuführen, da es beim Eintreffen neuer E-Mails zu Konflikten und Sperrproblemen kommen kann (denken Sie an das Mounten von Maildirs über NFS als Beispiel für lustige Konflikte im Dateisystem). POP3 bietet Ihnen eine gute Methode, um automatisch auf Elemente im Postfach zuzugreifen.
Es wäre wahrscheinlich problematisch, wenn mehrere Verbraucher gleichzeitig dasselbe POP3-Postfach verwenden würden (wenn Sie versuchen, die Skalierung zu erhöhen, um mehr Nachrichtenverkehr zu verarbeiten). Dafür könnten Sie auf der Mailserverseite ein Skript schreiben, um eingehende Nachrichten im Round-Robin-Verfahren an eine Gruppe von Postfächern zu verteilen und jeden Verbraucher an ein bestimmtes Postfach zu binden. (Sie könnten erwägen, IMAP für eine Architektur mit mehreren Verbrauchern zu verwenden, aber das ist nur leeres Geschwätz, ohne darüber nachzudenken.)
Sie fügen sicherlich mehr Schichten und potenzielle Engpässe hinzu, als wenn Sie SMTP einfach direkt in Ihren Code aufnehmen, aber Sie nutzen die ganze Arbeit, die die Autoren des Mailservers bereits geleistet haben. Ich hätte allerdings lieber ein Skalierungsproblem auf einem Mailserver als ein Skalierungsproblem bei benutzerdefiniertem SMTP-Servercode.
Antwort3
Rails ist wahrscheinlich das falsche Tool für diese Aufgabe. Sie möchten wahrscheinlich ein kleines Skript schreiben, das die E-Mail über stdin akzeptiert und in Ihre Datenbank einfügt. Möglicherweise können Sie hierfür denselben ActiveRecord-Code verwenden. Dann müssen Sie nur noch Ihren MTA so einrichten, dass er die E-Mail zustellt, indem er sie an Ihr Skript weiterleitet.
Wenn Sie etwas mehr Leistung benötigen, können Sie Ihr Skript so umschreiben, dass es ein Daemon ist, der die E-Mails über LTMP akzeptiert. Dadurch entfällt die Ineffizienz, für jede E-Mail einen Prozess zu starten.
Antwort4
Verwenden Sie anstelle von POP (falls Sie diesen Weg wählen) IMAP(S). Auf diese Weise können Sie Dinge auf dem Server „gelesen“ lassen, nachdem sie bearbeitet wurden.