Product
Wie Kanban2go Zawinskis Gesetz erfüllt
Dieser Blogbeitrag eines Kunden wurde von Damon Cali verfasst. Damon ist Inhaber von Ninth Yard, dem Unternehmen hinter TrackJumper, einer einfachen webbasierten Bug-Tracking-Anwendung. Er ist außerdem Lead Web Developer für kanban2go.

Jedes Programm versucht zu expandieren, bis es E-Mails lesen kann. Programme, die dazu nicht in der Lage sind, werden durch solche ersetzt, die es können.
Zawinski’s Law
Ich weiß nicht, ob das stimmt, aber kanban2go hat kürzlich mit der Einführung einer E-Mail-basierten Funktion einen Schritt in diese Richtung gemacht. Was auf Anhieb klar wird: Eine Webanwendung zu schreiben, die E-Mails empfangen kann, ist schwer. Es gibt viele bewegliche Teile, von denen einige bereits eigenständige Großprojekte darstellen.
Der Nutzer sendet eine E-Mail-Nachricht, und Sie müssen diese empfangen und irgendwie verarbeiten. Wie macht man das? Möchten Sie einen eigenen E-Mail-Server verwalten? Müssen Sie Postfächer für alle Ihre Nutzer einrichten? Wie sieht es mit Spam und der Zustellbarkeit aus? Das reicht aus, damit sich das Entwicklungsteam fragt, ob es die Mühe wert ist.
Einen einfacheren Weg für Nutzer finden, Aufgaben zu erstellen
Das ging mir durch den Kopf, als wir die kanban2go-Taskbox entwickelt haben. Zunächst ein wenig Hintergrundwissen. kanban2go ist eine Aufgabenmanagement-App, die auf den Prinzipien von Kanban. Jeder Nutzer verfügt über ein oder mehrere virtuelle Kanban-Boards, auf denen sich verschiedene virtuelle „Aufgaben“ befinden. Sie loggen sich ein, klicken auf „Add Task“ und erhalten eine Aufgabe auf dem Board, die Sie bearbeiten, verschieben und mit der Sie interagieren können.
Wir wollten dies verbessern, indem wir Nutzern eine Möglichkeit bieten, Aufgaben per E-Mail an ihr Konto zu senden, anstatt sich in die App einloggen zu müssen. Da begann mir der Kopf zu schwirren – was normalerweise ein gutes Zeichen dafür ist, nachzusehen, ob schon jemand anderes das Problem gelöst hat.
Gute Kunstschaffende borgen. Großartige Kunstschaffende stehlen. In diesem Fall mieten pragmatische Kunstschaffende. Zum Glück macht Mailgun diesen gesamten Prozess einfach. Ich werde in diesem Beitrag darlegen, wie wir an das Problem herangegangen sind, in der Hoffnung, dass dies als Trigger für einige Ideen für Ihre eigene App dient. Der Code hier entspricht nicht genau dem, was wir verwenden – es ist eine vereinfachte Version –, aber die Unterschiede haben eher mit kanban2go als mit Mailgun zu tun.
Schritt 1 – Ihre Domain einrichten
Der erste Schritt (nach der Anmeldung bei Mailgun) besteht darin, Ihre Domain bei Mailgun zu erstellen und zu konfigurieren.
Wir haben uns für taskbox.kanban2go.com entschieden. Auf diese Weise kann ein Nutzer eine Nachricht an (beispielsweise) user_abc123@taskbox.kanban2go.com senden und die Nachricht erscheint als kanban2go-Aufgabe in der Taskbox des Nutzers.
Die Domain-Konfiguration besteht lediglich darin, die DNS-Einträge für Ihre Domain gemäß den Anweisungen von Mailgun einzurichten und die gewünschten Optionen im Control Panel auszuwählen. Explizite Anweisungen zu den DNS-Einstellungen finden Sie im Mailgun Control Panel. Befolgen Sie diese einfach.

Bei den Optionen haben wir uns dafür entschieden, den Spamfilter zu aktivieren, um alle eingehenden Spam-Nachrichten zu blockieren (Sie könnten den Spam auch behalten, aber wir halten es einfach). Da wir nur eine einzige Subdomain brauchten, haben wir uns für eine reguläre Domain anstelle einer Wildcard-Domain entschieden.

Das war es schon mit der Domain-Konfiguration.
Schritt 2 – Routings für die E-Mail-Weiterleitung konfigurieren
Ein Großteil der Einfachheit von Mailgun beruht auf dem dortigen Routing-System. Sie richten Routings ein, die Mailgun mitteilen, was mit den Nachrichten geschehen soll, die unter der eingerichteten Domain eingehen. In unserem Fall könnte es nicht einfacher sein – wir wollten, dass Mailgun alle an *@taskbox.kanban2go.com gesendeten Nachrichten an eine URL in unserer App weiterleitet – http://kanban2go.com/mailgun/receive. Die Aktion unter dieser URL verarbeitet die eingehende Nachricht dann entsprechend.
Das Großartige an Routings ist, dass sie reguläre Ausdrücke sowie sogar Named Captures unterstützen, die an die Aktionen weitergegeben werden, sodass sie Ihnen eine enorme Flexibilität bieten.
Routings werden im Tab „Routes“ im Mailgun Control Panel eingerichtet.
Zunächst erstellen wir einen Filterausdruck – den Sie sich als regulären Ausdruck für Mailgun vorstellen können. In unserem Fall soll jede Nachricht erfasst werden, die an unsere Domain gesendet wird.
match_recipient('.*@taskbox.kanban2go.com') Als Nächstes definieren wir eine Aktion, die Mailgun anweist, was bei einem Treffer zu tun ist.
forward("http://kanban2go.com/mailgun/receive"), stop()
In diesem Fall leiten wir die Nachricht an unsere App weiter und stoppen dann.
Mailgun parst die Nachrichten für Sie und bietet einige praktische Funktionen, oder Sie können sich dafür entscheiden, die unformatierte Nachricht zu erhalten. Da wir nichts Ausgefallenes vorhaben und es uns Arbeit erspart, haben wir uns dafür entschieden, die von Mailgun geparsten Nachrichten zu empfangen.
Hier passiert ein Großteil der Magie. Wenn Mailgun eine passende Nachricht empfängt, verarbeitet es diese und sendet eine POST-Anfrage an die URL, die im Mailgun-Routing angegeben ist. Die Parameter dieser Anfrage umfassen Absender, Betreff, Textkörper und eine Reihe weiterer nützlicher Daten. Sehen Sie sich die Dokumentation an für weitere Informationen zu Routings.
Schritt 3 – E-Mails mit Rails empfangen
Da Mailgun uns nun POST-Anfragen sendet, müssen wir unsere Rails-App so einrichten, dass sie diese verarbeiten kann.
In kanban2go hat ein Nutzer viele Aufgaben. Jede Aufgabe hat ein Attribut namens „content“, das den Text der Aufgabe enthält.
In unserer Rails-App müssen wir die POST-Anfragen von Mailgun unter http://kanban2go.com/mailgun/receive verarbeiten. Der erste Schritt besteht darin, ein Routing für unsere neue Aktion in routes.rb zu erstellen.
post '/mailgun/receive' => 'mailgun#receive' Als Nächstes müssen wir einen MailgunController mit einer „receive“-Aktion in mailgun_controller.rb erstellen.
class MailgunController < ApplicationControllerrn protect_from_forgery :except => [:receive]rn def receivern user = User.find_by_taskbox_address(params['recipient'])rn stripped_text = params['stripped-text']rn if userrn Task.create(:user => user, :content => stripped_text)rn endrn render :nothing => truern endrnend
Beachten Sie, dass wir den Forgery-Schutz für die Receive-Aktion deaktivieren müssen. Für weitere Informationen zur Funktionsweise von protect_from_forgery gibt es eine großartige Erklärung im Rails Security Guide.
Als Erstes muss in der Receive-Aktion der Nutzer abgerufen werden, an den die Nachricht gesendet wurde. Dazu weisen wir jedem Nutzer bei der Erstellung eine eindeutige Taskbox-E-Mail-Adresse (in einem „taskbox_address“-Attribut) zu. Eine taskbox_address könnte beispielsweise „hard_to_guess74623@taskbox.kanban2go.com“ sein. Wichtig ist, dass der Nutzername in der Adresse eindeutig und schwer zu erraten ist. Anschließend ermitteln wir den Nutzer mit der Methode User.find_by_taskbox_address (wird von Mailgun als Parameter ‚recipient‘ übermittelt).
Als Nächstes extrahieren wir den Parameter „stripped-text“ aus der Anfrage. Dies wird von Mailgun bereitgestellt, wenn es eine E-Mail-Nachricht parst. Der „stripped-text“ ist lediglich der Textkörper der E-Mail ohne zitierte Teile oder Signatur.
Wenn wir einen Nutzer finden, erstellen wir eine Aufgabe für diesen Nutzer und setzen den Inhalt dieser Aufgabe auf den Stripped-Text. Wenn wir keinen Nutzer finden, passiert nichts.
Schritt 4 – Zurücklehnen
Das war’s. Mehr ist nicht nötig, um mit Mailgun E-Mails in Aufgaben zu verwandeln. Das ist natürlich ein sehr einfaches Beispiel. Abhängig von Ihren Sicherheits- und Datenschutzanforderungen müssen Sie in Ihrer App möglicherweise einige zusätzliche Prüfungen und Logiken durchlaufen, aber die harte Arbeit wird von Mailgun für Sie erledigt – Routing, Parsing und Spamfilterung.
Ich hoffe, dies trägt dazu bei, verständlich zu machen, warum Sie keine Angst mehr vor E-Mails in Ihrer App haben müssen. Es gibt unzählige Möglichkeiten – werden Sie einfach kreativ.
Denken Sie darüber nach, eine E-Mail-Verarbeitung in Ihre App zu integrieren? Haben Sie Anmerkungen zu dem hier skizzierten Ansatz? Teilen Sie Ihre Gedanken in den Blog-Kommentaren oder nehmen Sie an der Konversation auf HackerNews teil.
Offenlegung: Der Gründer von kanban2go.com, Prabhakar Gopalan, arbeitet bei Rackspace, der Muttergesellschaft von Mailgun. kanban2go.com existierte bereits vor Prabhakars Tätigkeit bei Rackspace.