Willkommen zu einer speziellen Folge unserer "Building Your Startup" -Reihe, die von Mailgun gesponsert wird. In dieser Serie führe ich Sie durch den Start eines Konzepts vom Konzept zur Realität, wobei Sie meine Meeting Planner-App als reales Beispiel verwenden. Bei jedem Schritt werden wir den Meeting Planner-Code als Open-Source-Beispiele veröffentlichen, von denen Sie lernen können. In der heutigen Episode sponserte Mailgun ein Tutorial, in dem beschrieben wurde, wie ich das Message-Routing und die Store () - API integriert habe, um Antworten von Benutzern zu verarbeiten.
Wenn beispielsweise Personen Besprechungsanfragen von anderen Personen mit Meeting Planner erhalten, können sie einfach nur antworten und eine Notiz wie einen anderen E-Mail-Thread senden. Ich wollte die Antwort jedoch automatisch bearbeiten, sie als Notiz zur Besprechung hinzufügen und den Empfänger darauf hinweisen, dass ein Update angezeigt werden kann. Hört sich kompliziert an, aber eines der Ziele von Meeting Planner besteht darin, die Hin- und Rückmails von Mitarbeitern zur Planung zu reduzieren und Änderungen in Echtzeit in weniger Benachrichtigungen zusammenzufassen.
Wenn Sie Mailgun noch nicht kennen, ist dies die E-Mail-Automatisierungs-Engine, auf die über 10.000 Entwickler von Websites und Anwendungen vertrauen, wenn Sie E-Mails senden, empfangen und verfolgen. Durch die Nutzung der leistungsfähigen E-Mail-APIs von Mailgun können Entwickler mehr Zeit damit verbringen, fantastische Websites zu erstellen und weniger Zeit mit E-Mail-Servern zu verbringen.
Es bietet eine Vielzahl von Funktionen für die schnelle und effiziente Verwaltung von E-Mails für Ihre Anwendung:
Mailguns API unterstützt alle gängigen Sprachen, einschließlich PHP, Ruby, Python, C # und Java, und bietet eine hervorragende, übersichtliche Dokumentation.
Für viele meiner Beratungstätigkeiten, Startups und Tutorials war es eine gute Wahl für mich.
Wenn Sie dem heutigen Tutorial folgen möchten und Mailgun noch nicht kennen, sollten Sie sich das Thema Exploring Mailgun: Die E-Mail-Engine für Entwickler oder Wie Geogram einen kostenlosen Gruppen-E-Mail-Dienst mit Yii für PHP mit MySQL erstellt haben. Vielleicht möchten Sie auch Store () lesen: ein temporäres Postfach für alle eingehenden E-Mails für mehr technischen Hintergrund.
Der gesamte Code für Meeting Planner ist im Yii2 Framework für PHP geschrieben. Wenn Sie mehr über Yii2 erfahren möchten, sehen Sie sich unsere parallele Serie „Programmieren mit Yii2“ bei Envato Tuts an+.
Wenn Sie Meeting Planner noch nicht ausprobiert haben, planen Sie jetzt Ihr erstes Meeting ein. Es kommt wirklich zusammen und nähert sich der Alpha-Veröffentlichung.
Feedback ist willkommen. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte einen Kommentar. Sie können mich auch auf Twitter @reifman erreichen.
Danke, Mailgun, dass Sie diese Episode unserer Startup-Serie gesponsert haben!
Denken Sie daran, dass es sich hier um ein gesponsertes Tutorial handelt, das möglicherweise vor unseren regulären Startup-Serien erscheint. Daher kann etwas Code weiter als in den kommenden Episoden erscheinen.
Ich habe bereits über die Verwendung der Mailgun-SMTP-Zustellung für ausgehende E-Mails in Meeting Planner gesprochen, aber wie reagieren Sie auf E-Mails??
Die Einladungen von Meeting Planner haben beispielsweise ein Konzept, das als Notizen bezeichnet wird. Notizen sind Kommentare oder Nachrichten, die zwischen Empfängern hin und her geteilt werden. Derzeit können sie von der Meeting-Ansichtsseite aus gepostet werden. Hier ist ein Beispiel:
Ich wollte es den Leuten jedoch leicht machen, auf eine E-Mail zu einer Besprechung zu antworten, und ihre Nachricht einfach als Notiz zur Besprechung hinzufügen und diese Aktualisierung dann mit anderen Benachrichtigungen über Änderungen der Besprechung gruppieren. Eine Person akzeptiert beispielsweise Orte und Zeiten aus ihrer Einladungs-E-Mail, beantwortet die Einladung aber auch direkt aus ihrer E-Mail-Anwendung oder ihrer Cloud-basierten E-Mail. Der Organisator der Besprechung erhält eine Benachrichtigung über Updates und nicht mehrere.
Hier ist eine Zusammenfassung dessen, was wir heute bauen:
Zunächst verwenden alle Meeting Planner-Planungs-E-Mails eine Antwortadresse, um alles an ein @ meetingplanner.io-Postfach weiterzuleiten. Mailgun ist damit beauftragt, alle eingehenden E-Mails über unsere MX-Datensätze zu verarbeiten. Beim Mailgun-Routing können wir den Dienst bitten, unseren Server zu benachrichtigen, wenn neue Nachrichten eingehen. Im Hintergrund können wir sie dann bearbeiten.
Mailgun analysiert Nachrichten mit seinen Expertenalgorithmen, sodass wir dies nicht müssen. So können wir leicht feststellen, wer auf eine Nachricht geantwortet hat, auf welches Meeting sie geantwortet haben und welche Notiz sie in ihre Nachricht schreiben. Zum Schluss fügen wir die Notiz zum Meeting hinzu und informieren den anderen Teilnehmer.
Folgen Sie mir, während ich Sie durchführe, wie dies geschieht.
Vor einiger Zeit habe ich MX-Einträge für MeetingPlanner.io eingerichtet, um alle eingehenden E-Mails direkt an Mailgun weiterzuleiten.
Hier ein Beispiel für MX-Einträge für Mailgun:
Mit der einfachen Routing-Benutzeroberfläche von Mailgun habe ich die Weiterleitung für die jeff eingerichtet und Mailboxen unterstützt, damit interessierte Personen mich oder den Kundensupport erreichen können.
Die Routing-Funktionen von Mailgun bieten außerdem folgende Funktionen:
Als ich bereit war, das eingehende Routing für die Terminplanung von Besprechungen zu integrieren, entschied ich mich, die store () - API von Mailgun zu verwenden. Während Mailgun geparnte E-Mails in Echtzeit an Ihren Webserver übermitteln kann, können Sie aufgrund von temporären Überspannungen oder eigenen Servicefehlern Nachrichten verfehlen. Aufgrund des Kundenfeedbacks entschied sich Mailgun dafür, die Kapazität zum Speichern von Nachrichten in seiner Cloud aufzubauen und die Anwendung sie über einen Zeitraum von drei Tagen verarbeiten zu lassen.
Im Folgenden beschreibt Mailgun einige mögliche Fälle, die ein Cloud-Store bei der Lösung unterstützt:
In einigen Fällen sind die Anhänge umfangreich und verursachen Zeitüberschreitungen, wenn wir versuchen, die Daten auf ihren Servern zu POSTen. In anderen Fällen gibt es eine große Anzahl eingehender E-Mails, und die Kunden würden stattdessen einfach eine GET-Anfrage in einem bestimmten Intervall ausführen, anstatt mehrere POSTs von uns bearbeiten zu müssen. Schließlich dient es als Redundanz für den Fall, dass der Webservice ausfällt und unsere POSTs nicht akzeptiert werden können.
Also habe ich Mailguns Routing so konfiguriert, dass der Meeting Planner-Server einfach benachrichtigt wird, wenn er eine neue Nachricht erhält. Beachten Sie die dritte Konfiguration unten:
Immer wenn Platzhalternachrichten in Meeting Planner eingehen, wird Mailgun angezeigt Geschäft() sie und benachrichtigen http://meetingplanner.io/mailgun-notification/store dass es eine neue Nachricht gibt und dann halt() wird bearbeitet.
Die Erweiterung der API-Nutzung mit Mailgun war wieder unkompliziert, da die Dokumentation erstklassig ist. Es bietet Unterstützung für eine Vielzahl von Sprachen, z. Ruby, Python, PHP, Java, C # und Go. Es bietet Arbeitsbeispiele für die Implementierung der Mailgun-Funktionalität in allen Diensten - egal, ob Sie Broadcasting, Tracking oder Routing durchführen.
Mit Yii2 und seinem automatisierten Scaffolding-Codegenerator Gii erstellte ich Migrationen, Modelle und Controller für ein MailgunNotification-Modell.
Klasse m160514_010650_create_mailgun_notification_table erweitert die Migration public function up () $ tableOptions = null; if ($ this-> db-> driverName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% mailgun_notification', ['id' => Schema :: TYPE_PK, 'url' => Schema :: TYPE_STRING. 'NOT NULL', 'status' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Schema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);
Es speichert eine Benachrichtigungs-URL von Mailgun, die wir später abrufen können. Zum Beispiel:
https://api.mailgun.net/v2/domains/meetingplanner.io/messages/eyJw2UsICJrIjogImUyQ5LTk1NmItNGIwOCLWZmZTFjMDU3ZiIsICJzIjogIjNGUILCAiYyIcyJ9
Hier ist der Code, mit dem unbearbeitete Benachrichtigungen hinzugefügt werden STATUS_PENDING
:
Öffentlicher Funktionsspeicher ($ message_url) // Speichern der URL aus der Mailgun-Benachrichtigung $ mn = new MailgunNotification (); $ mn-> status = MailgunNotification :: STATUS_PENDING; $ temp = str_ireplace ('https://api.mailgun.net/v2/', ", $ message_url); $ temp = str_ireplace ('https://api.mailgun.net/v3/',", $ temp ); $ mn-> url = $ temp; $ mn-> save ();
In diesem Szenario müssen Sie Produktionscode zur Verarbeitung schreiben und später auf Benachrichtigungen und Nachrichten reagieren, über die Mailgun Sie benachrichtigt. Mailgun bietet ein hilfreiches Testformular zum Testen Ihres Servers am unteren Rand der Routing-Konfigurationsseite.
Da Produktionsserver schwieriger zu debuggen sind, hat es einige Zeit gedauert, bis dies richtig war. Also bin ich zuerst auf Fehler gestoßen.
Aber letztendlich bekam ich eingehende Benachrichtigungen zu arbeiten:
Im Wesentlichen analysierte ich die Nachrichten-URL
und in der Datenbank gespeichert:
public function actionStore () // speichert eingehende Post-Benachrichtigungen von Mailgun if (isset ($ _ POST ['message-url'])) MailgunNotification :: store ($ _ POST ['message-url']);
Stellen Sie sich in diesem Beispiel vor, ich habe auf eine Einladung von Tom geantwortet, um ihn daran zu erinnern, ein Buch zu unserer Kaffeediskussion zu bringen:
Daraufhin benachrichtigt uns Mailgun über die Nachricht, und eine sichere URL für den Zugriff auf den Inhalt wird im gespeichert MailgunNotification
Tabelle:
Als Nächstes erweiterte ich die Hintergrundverarbeitung von Meeting Planner, um neue Nachrichten von Mailgun abzurufen und zu verarbeiten. Das Parsen von E-Mails mit Mailgun ist einfach, da sie all die Arbeit erledigt haben, die sonst Monate (und Monate… und Monate… und Monate) dauern würde..
Im Wesentlichen nimmt Mailgun unstrukturierte eingehende E-Mails (links angezeigt) und sendet Ihrer Anwendung geparste strukturierte Daten (rechts dargestellt):
Uninformierte unabhängige Entwickler verwenden das monatliche E-Mail-Analysieren von E-Mails, eine Aufgabe, die nie wirklich abgeschlossen ist. Mailgun verwaltet das für Sie.
Gehen wir durch die MailgunNotification :: Prozess
Methode. Zunächst suchen wir nach ausstehenden Benachrichtigungen im MailgunNotification
Tabelle und rufen Sie meine Yiigun.php-Komponente auf, die eine erhalten()
Anfrage an Mailgun an die URL, die wir für eine Benachrichtigung erhalten haben:
public static function process () $ items = MailgunNotification :: find () -> where (['status' => MailgunNotification :: STATUS_PENDING]) -> all (); if (count ($ items) == 0) return false; $ yg = new Yiigun (); foreach ($ items as $ m) $ error = false; // echo $ m-> id. '
'; $ raw_response = $ yg-> get ($ m-> url); if (is_null ($ raw_response)) $ m-> status = MailgunNotification :: STATUS_NOT_FOUND; $ m-> Update (); fortsetzen; $ response = $ raw_response-> http_response_body;
Mailgun gibt die detaillierten Daten aus der Nachricht zurück. Also analysieren wir das Konferenz-ID
aus dem Empfängerfeld, dem Nachrichtentext und der E-Mail des Absenders. Auch hier macht Mailgun das einfach:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text'); // parse die Besprechungs-ID if (isset ($ response-> To)) $ to_address = $ response-> To; else $ to_address = $ response-> to; $ to_address = str_ireplace ('@ meetingplanner.io', ", $ to_address); $ to_address = str_ireplace ('mp _',", $ to_address); $ meeting_id = intval ($ to_address); if (! is_numeric ($ meeting_id)) $ error = true; $ m-> status = MailgunNotification :: STATUS_INVALID_MEETING_ID; $ m-> Update (); fortsetzen; // echo 'mid:'. $ meeting_id. '
'; // Überprüfe, ob die ID der Konferenz gültig ist if (isset ($ response-> Sender)) $ sender = $ response-> Sender; else $ sender = $ response-> sender; // clean sender // Echo 'pre clean sender:'. $ sender. '
'; $ sender = \ yii \ helpers \ HtmlPurifier :: process ($ sender); // echo 'sender:'. $ sender. '
'; $ user_id = User :: findByEmail ($ sender); if ($ user_id === false) $ error = true; // nichts tun // antworten - E-Mail-Adresse nicht erkennen $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ m-> Update (); fortsetzen;
Ich schätze es besonders, dass Mailgun Stripped-Text zur Verfügung stellt, der die Signatur des Absenders und den Antwort-Thread entfernt. Ich benutze auch HtmlPurifier
um zu verhindern, dass potenziell schädlicher, nicht umschriebener Text auf unseren Server abzielt.
Während dieser Bemühungen habe ich wieder gelernt, dass Sie für den Zugriff auf eine Eigenschaft mit Bindestrich eines Objekts in PHP dieses mit geschweiften Klammern umgeben müssen:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text');
Und wenn wir erst einmal festgestellt haben, dass die Besprechung und der Absender vorhanden sind und letzterer ein Teilnehmer ist, fügen wir das hinzu stripped_text
als Hinweis:
// echo 'check teilnehmer'; // Vergewissern Sie sich, dass der Absender ein Teilnehmer oder Organisator dieser Besprechung ist. $ is_attendee = Besprechung :: isAttendee ($ meeting_id, $ user_id); if ($ is_attendee) // Besprechungsnotiz hinzufügen, automatisch protokolliert und Besprechungsstempel aktualisiert MeetingNote :: add ($ meeting_id, $ user_id, $ stripped_text); else
Die neue Notiz wird auf der Meeting-Ereignisseite angezeigt, wenn der Teilnehmer zurückkehrt:
Yii unterstützt ActiveRecord-Ereignisse, so dass a MeetingNote
wird hinzugefügt, a MeetingLog
Eintrag wird automatisch erstellt:
öffentliche Funktion afterSave ($ insert, $ changedAttributes) parent :: afterSave ($ insert, $ changedAttributes); if ($ insert) // wenn MeetingNote MeetingLog :: add ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);
In einer zukünftigen Episode werde ich erläutern, wie dieses Ereignis ein anderes Ereignis auslöst, mit dem Meeting Planner koordiniert, wann Besprechungsteilnehmer am besten darüber informiert werden, dass eine neue Notiz oder eine andere Änderung eingetreten ist.
Senden Sie eine Meeting Planner-Einladung und bitten Sie Ihren Empfänger, auf die E-Mail mit einer Nachricht zu antworten. Sie sollten kurz danach eine Benachrichtigung erhalten und dann auf der Ereignisseite angezeigt werden.
Ich hoffe, Ihnen hat dieser angewandte Blick auf die Routing- und Store () - API von Mailgun gefallen. Es ist eine ziemlich lustige, ausgereifte API, mit der man arbeiten kann. Mailgun bietet eine Vielzahl von E-Mail-Diensten, die für alle Arten von Codierung und Geschäftsentwicklung relevant sind. Und sie leisten beeindruckend gute Arbeit bei allem, was sie anbieten.
Sicherlich ist dies ein gesponserter Beitrag, aber als erfahrener Benutzer empfehle ich Ihnen die authentische Empfehlung, den Dienst heute zu testen. Ich habe sie für alle meine Projekte verwendet.
Und natürlich gibt es viele andere Szenarien, die wir beim Verarbeiten von Nachrichten erstellen könnten. Zum Beispiel könnten wir Benutzern die Möglichkeit geben, mit Befehlen wie "spät" zu antworten, und wir wissen, dass die andere Person per SMS benachrichtigt werden soll, dass der Kollege zu spät kommt.
Teilen Sie uns bitte mit, über welche Mailgun-Funktionen Sie in Zukunft weitere Informationen erhalten möchten. Sie können sie in den Kommentaren posten oder mich direkt auf Twitter @reifman erreichen.