2009-08-16 12 views
9

Ich habe versucht, herauszufinden, die beste Möglichkeit, eingehende E-Mails in einem Rails-Anwendungen zu behandeln. Mir ist klar, dass "Best Practices" ziemlich subjektiv sind. Ich möchte damit beginnen, dass meine Hauptanliegen Skalierbarkeit und Effizienz sind. Dies ist vor allem deshalb ein Problem, weil ich möglicherweise große Anhänge verarbeiten muss.Best Practices für den Empfang von E-Mails in Rails

Scheint so, als ob die akzeptierte Methode war, ActionMailer zu benutzen, um die E-Mail zu erhalten, aber kürzlich bin ich über mehrere Artikel gestolpert, dass dies ineffizient ist, da es eine neue Rails-Instanz mit jeder E-Mail erzeugt (schrecklich bei hohen Volumina).

vor kurzem der meisten, dieser Artikel hat meine Aufmerksamkeit ist immer: http://jasonseifer.com/2009/04/24/receving-email-with-rails

Die Post spricht von einer abgespeckten Version des Action System, das nicht gezwungen ist, eine ganze Schienen-Instanz, um zu laichen, aber die Kommentare zu sprechen mehrere andere Optionen wie ein dediziertes Mail-Verzeichnis (Maildir?) und Imap/Pop-Abruf.

Meine Frage ist: Hat jemand irgendwelche Gedanken darüber, was die beste Option wäre derzeit für die Verarbeitung eingehender E-Mail in einer Rails-Anwendung (einschließlich Anhänge)?

Antwort

6

Ich pflege die Fetcher plugin für den Download von E-Mail von einem IMAP-Server, den ich mit Cron verwenden. Ich benutzte einen Daemon, aber das war schwer zu laufen (sogar mit Monit), weil Ruby hängen würde. Cron ist OK für meine Arbeitslast, aber es erzeugt einmal pro Minute einen Rails-Prozess.

Für die Verarbeitung von Anhängen, sehen Sie sich die MMS2R Bibliothek an. Es hat eine nette Schnittstelle, um die Dateien aus einer E-Mail zu holen.

Der andere Ansatz, den ich mir empfohlen habe, ist es, einen HTTP-Post für jede empfangene Nachricht abzufeuern. Dann können Sie Ihre Web-Tier skalieren, um damit umzugehen.

Shameless Stecker: möchten Sie vielleicht Mike Mondragon und meine PeepCode book on receiving email with Ruby überprüfen.

+1

Schamlose Stecker sind nicht schamlos, wenn sie relevant sind ;-), ich werde es überprüfen. Was macht die IMAP-Option genau? Müssen Sie anderswo Zugang zu einem externen E-Mail-Konto haben oder hosten Sie Ihren eigenen E-Mail-Server und ziehen Sie einfach davon ab? Vielen Dank! – Ryan

+0

Ich verwende ein Google Apps-E-Mail-Konto. Jedes Konto mit IMAP-Zugriff sollte jedoch funktionieren. –

+1

Für meinen speziellen Fall werde ich http Post verwenden, nur weil meine Situation nicht IMAP-Zugang (E-Mail für eine gesamte Domain) förderlich ist. Danke für die Antwort und danke, dass du mich zu MMS2R geschickt hast! – Ryan

1

in mms2r die MMS2R#default_media gibt nur den größten Videoanhang zurück, wenn es existiert, oder den größten Bildanhang, wenn es existiert, oder den größten Textanhang, wenn es existiert, in dieser Reihenfolge. MMS2R#default_text gibt den größten text/plain-Anhang zurück, wenn er existiert. Sie können auch auf alle Anhänge direkt über den Medien-Hash von mms2r zugreifen, z. MMS2R # Medien. MMS2R#media wird von mimetype codiert, der vom Schlüssel referenzierte Wert ist ein Array von Datenträgern dieses Typs. Wenn also zwei JPEG-Anhänge in einer von MMS2R verarbeiteten E-Mail vorhanden wären, würden Sie auf diese als ein Array zugreifen, indem Sie den Medien-Hash mit image/jpeg, z. MMS2R#media['image/jpeg']

Wenn MMS2R zuerst eine E-Mail verarbeitet, wird jede gefundene Anlage entschlüsselt und in einem Array von Datenträgern dieses Typs gespeichert. Wie gesagt, dieses Array wird dann durch Mimetype im MMS2R#media Hash getastet.

Kaufen Sie das Buch, ich muss meine Hypothek bezahlen PeepCode book on receiving email with Ruby.

4

Sie könnten versuchen, einen Dienst zu verwenden wie http://cloudmailin.com/

+0

Ich habe das noch nicht probiert, aber ich werde es das nächste Mal überprüfen, wenn ich dieses Problem habe. Ich habe mit sendgrid.com zusammengearbeitet und kann sie jedem empfehlen, der einen solchen Service braucht ... wollte nur für zukünftige Leser einspringen! – Ryan

0

ich vor kurzem einen Daemon geschrieben, die E-Mails von Postfix mit LMTP empfängt (es verwendet und ist ziemlich eventmachine schnell und robust) und speichert sie in MongoDB. In diesem Sinne eliminiert es den mittleren Mann (IMAP-Server + IMAP-Client). Dieser Ansatz bietet eine ziemlich grenzenlose Skalierbarkeit und Redundanz. Andere Backends-Unterstützung (MySQL, Redis, etc.) kann in kürzester Zeit hinzugefügt werden.

received

2

Für über HTTP auf Ihre Rails-Anwendung E-Mails von Postfix Relaying, schrieb ich gerade einen Artikel darüber, wie wir es tun.

Es ist eigentlich ganz einfach, aber wir nutzen auch die Fähigkeit von Postfix, E-Mails zu verschieben, wenn sie nicht weitergeleitet werden können. Das habe ich bisher nirgends gesehen. Einzelheiten finden Sie unter http://www.doorkeeperhq.com/developer/smtp-to-web-api.

Verwandte Themen