Bienvenue dans un épisode spécial de notre série Building Your Startup sponsorisée par Mailgun. Dans cette série, je vous guide dans le lancement d'une startup du concept à la réalité, en utilisant mon application Meeting Planner comme exemple concret. À chaque étape, nous publierons le code de Meeting Planner sous forme d’exemples open source à partir desquels vous pourrez apprendre. Dans l'épisode d'aujourd'hui, Mailgun est intervenu pour sponsoriser un tutoriel sur la façon dont j'ai intégré son routage de message et son API Store () pour gérer les réponses des utilisateurs..
Par exemple, lorsque des personnes reçoivent des demandes de réunion avec d'autres personnes avec Meeting Planner, elles peuvent simplement choisir de répondre et d'envoyer une note comme elles le feraient à un fil de discussion standard. Cependant, je souhaitais traiter automatiquement la réponse, l'ajouter en tant que note à la réunion, puis informer le destinataire qu'une mise à jour est prête à être visualisée. Cela semble compliqué, mais l'un des objectifs de Meeting Planner est de réduire le nombre de courriers électroniques échangés entre les personnes au sujet de la planification et de consolider les modifications en temps réel en moins de notifications..
Si vous ne connaissez pas encore Mailgun, c'est le moteur d'automatisation de la messagerie approuvé par plus de 10 000 développeurs de sites Web et d'applications pour l'envoi, la réception et le suivi des e-mails. En tirant parti des puissantes API de messagerie de Mailgun, les développeurs peuvent passer plus de temps à créer des sites Web impressionnants et moins à se battre avec des serveurs de messagerie..
Il offre une variété de fonctionnalités pour gérer le courrier électronique rapidement et efficacement pour votre application:
L'API de Mailgun prend en charge tous les langages les plus populaires, tels que PHP, Ruby, Python, C # et Java. Ils offrent une excellente documentation bien organisée..
C'est un choix incontournable pour beaucoup de mes activités de conseil, de startups et de tutoriels..
Si vous souhaitez suivre le didacticiel d'aujourd'hui et que vous n'êtes pas encore familiarisé avec Mailgun, vous pouvez consulter Exploring Mailgun: le moteur de messagerie pour les développeurs ou comment Geogram a créé un service de messagerie électronique de groupe gratuit utilisant Yii pour PHP avec MySQL. Vous voudrez peut-être aussi lire Store (): une boîte aux lettres temporaire pour tous vos courriels entrants afin de vous familiariser davantage avec les connaissances techniques.
Tout le code de Meeting Planner est écrit dans le framework Yii2 pour PHP. Si vous souhaitez en savoir plus sur Yii2, consultez notre série parallèle Programmation avec Yii2 chez Envato Tuts+.
Si vous n'avez pas encore essayé Meeting Planner, essayez de planifier votre première réunion maintenant. Cela se rapproche vraiment et approche de la sortie d'alpha.
Les commentaires sont les bienvenus. Si vous avez une question ou une suggestion de sujet, veuillez poster un commentaire ci-dessous. Vous pouvez également me joindre sur Twitter @reifman.
Et merci à Mailgun d’avoir sponsorisé cet épisode de notre série de startups!
Gardez à l'esprit que, puisqu'il s'agit d'un tutoriel sponsorisé, il peut apparaître avant les épisodes de notre série Startup habituels. Donc, du code peut apparaître plus loin que dans les prochains épisodes.
J'ai déjà parlé de l'utilisation de la livraison SMTP de Mailgun pour les emails sortants dans Meeting Planner, mais qu'en est-il de la réponse aux emails?
Par exemple, les invitations de Meeting Planner ont un concept appelé notes. Les notes sont des commentaires ou des messages partagés entre les destinataires. Actuellement, ils peuvent être publiés à partir de la page d'affichage de la réunion. Voici un exemple:
Cependant, je souhaitais faciliter la tâche aux personnes qui souhaitaient répondre à un courrier électronique concernant une réunion et ajouter facilement leur message en tant que note à la réunion, puis grouper cette mise à jour avec d'autres notifications de modifications apportées à la réunion. Par exemple, une personne peut accepter des lieux et des heures de son courrier électronique d'invitation, mais également y répondre directement à partir de son application de messagerie ou de son courrier électronique. L’organisateur de la réunion recevra une notification des mises à jour plutôt que plusieurs.
Voici un résumé de ce que nous construisons aujourd'hui:
Premièrement, tous les courriels de planification de Meeting Planner utiliseront une adresse de réponse pour tout diriger vers une boîte aux lettres @ meetingplanner.io. Mailgun est chargé de traiter tous les courriels entrants via nos enregistrements MX. Avec le routage Mailgun, nous pouvons demander au service de notifier notre serveur chaque fois que de nouveaux messages arrivent. Ensuite, en arrière-plan, nous pouvons les traiter.
Mailgun analyse les messages avec ses algorithmes experts afin que nous n'ayons pas à le faire. Il est donc facile pour nous de déterminer qui a répondu à un message, à quelle réunion ils répondaient et quelle note ils écrivaient dans leur message. Enfin, nous ajouterons la note à la réunion et informerons l’autre participant..
Suivez-moi pendant que je vous explique comment faire..
Il y a quelque temps, j'ai configuré les enregistrements MX pour MeetingPlanner.io afin de canaliser tous les messages entrants directement dans Mailgun..
Voici un exemple d'enregistrements MX pour Mailgun:
À l'aide de l'interface utilisateur de routage simple de Mailgun, je définis la transmission pour le jeff et les boîtes aux lettres de support pour que les personnes intéressées puissent me joindre ou bénéficier du support client..
Les fonctionnalités de routage de Mailgun fournissent également les fonctionnalités suivantes:
Une fois prêt à intégrer le routage entrant pour la planification de réunion, j'ai décidé d'utiliser l'API store () de Mailgun. Bien que Mailgun puisse envoyer des e-mails analysés à votre serveur Web en temps réel, des surtensions temporaires ou des échecs de votre propre service peuvent vous faire rater des messages. Sur la base des commentaires des clients, Mailgun a décidé de renforcer la capacité de stockage des messages dans son cloud et de laisser votre application les traiter sur une période de trois jours.
Voici Mailgun décrivant quelques cas possibles qu'un stockage en nuage aide à résoudre:
Dans certains cas, les pièces jointes sont volumineuses et entraînent des délais d'attente lorsque nous essayons de poster les données sur leurs serveurs. Dans d'autres cas, il existe un volume important de courrier électronique entrant et les clients préfèrent simplement exécuter une requête GET à un certain intervalle au lieu de devoir gérer plusieurs POST de notre part. Enfin, cela sert de redondance au cas où leur service Web tombe en panne et qu’ils ne peuvent pas accepter nos POST.
J'ai donc configuré le routage de Mailgun pour avertir simplement le serveur Meeting Planner dès qu'il reçoit un nouveau message. Notez la troisième configuration ci-dessous:
Mailgun envoie des messages contenant des caractères génériques à Meeting Planner. le magasin() eux et notifier http://meetingplanner.io/mailgun-notification/store qu'il y a un nouveau message et Arrêtez() En traitement.
L'extension de mon utilisation de l'API avec Mailgun était à nouveau simple car leur documentation est de qualité supérieure. Il prend en charge diverses langues, par exemple. Ruby, Python, PHP, Java, C # et Go. Il offre des exemples concrets d'implémentation de la fonctionnalité Mailgun à travers ses services, que vous diffusiez, suiviez ou routiez.
Ainsi, en utilisant Yii2 et son générateur de code d’échafaudage automatisé, Gii, j’ai créé des migrations, des modèles et des contrôleurs pour un modèle MailgunNotification..
La classe m160514_010650_create_mailgun_notification_table étend la migration fonction publique 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' => Schéma :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Schéma :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);
Il stocke une URL de notification de Mailgun que nous pourrons récupérer ultérieurement. Par exemple:
https://api.mailgun.net/v2/domains/meetingplanner.io/messages/eyJw2UsICJrIjogImUyQ5LTk1NmItNGIwOCLWZmZTFjMDU3ZiIsICJzIjogijNGUIJII9
Voici le code qui ajoute des notifications non traitées avec STATUT: EN ATTENTE
:
public function store ($ message_url) // stocke l'URL de la notification mailgun $ 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 ();
Dans ce scénario, vous devez écrire du code de production à traiter, puis réagir aux notifications et messages que Mailgun vous notifie. Mailgun fournit un formulaire de test utile pour tester votre serveur au bas de sa page de configuration de routage..
Comme les serveurs de production sont plus difficiles à déboguer, cela a pris du temps. J'ai donc rencontré des erreurs au début.
Mais finalement, les notifications entrantes ont fonctionné:
Pour l’essentiel, j’ai analysé le URL du message
et stocké dans la base de données:
fonction publique actionStore () // stocke la notification de publication entrante de Mailgun if (isset ($ _ POST ['message-url'])) MailgunNotification :: store ($ _ POST ['message-url']);
Dans cet exemple, imaginons que j'ai répondu à une invitation à une réunion de Tom pour lui rappeler de prendre un livre lors de notre discussion sur le café:
En réponse, Mailgun nous notifie le message et une URL sécurisée pour accéder à son contenu est stockée dans le répertoire. MailgunNotification
table:
Ensuite, j'ai étendu le traitement en arrière-plan de Meeting Planner pour extraire les nouveaux messages de Mailgun et les traiter. Analyser les courriels avec Mailgun est facile, car ils ont effectué tout le travail qui leur aurait pris sinon des mois (et des mois… et des mois… et des mois).
En règle générale, Mailgun prend les e-mails entrants non structurés (illustrés à gauche) et envoie à votre application des données analysées et structurées (illustrées à droite):
Les développeurs indépendants non informés passent des mois à coder eux-mêmes l'analyse des e-mails, une tâche qui n'est jamais vraiment complète. Mailgun gère cela pour vous.
Marchons à travers le MailgunNotification :: Processus
méthode. Dans un premier temps, nous recherchons les notifications en attente dans MailgunNotification
table et invoquer mon composant Yiigun.php qui fait un obtenir()
demande à Mailgun à l'URL que nous avons reçue pour une notification:
fonction statique publique processus () $ items = MailgunNotification :: find () -> où (['status' => MailgunNotification :: STATUS_PENDING]) -> all (); if (count ($ items) == 0) return false; $ yg = new Yiigun (); foreach ($ items en tant que $ 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 (); continuer; $ response = $ raw_response-> http_response_body;
Mailgun renvoie les données détaillées du message. Donc nous analysons le meeting_id
dans le champ du destinataire, le corps du texte et le courrier électronique de l'expéditeur. Encore une fois, Mailgun rend cela facile:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text'); // analyse l'identifiant de la réunion si (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 (); continuer; // echo 'mid:'. $ meeting_id. '
'; // vérifier que l'id de la réunion est valide si (isset ($ response-> Sender)) $ sender = $ response-> Sender; else $ sender = $ response-> sender; // nettoie l'expéditeur // echo 'pré-expéditeur propre:'. $ sender. '
'; $ sender = \ yii \ helpers \ HtmlPurifier :: process ($ sender); // echo 'expéditeur:'. $ expéditeur. '
'; $ user_id = User :: findByEmail ($ sender); if ($ user_id === false) $ error = true; // ne fait rien // à faire - ne pas reconnaître l'adresse électronique $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ m-> update (); continuer;
J'apprécie particulièrement que Mailgun fournisse un texte dépouillé, qui supprime la signature de l'expéditeur et le fil de réponse. J'utilise aussi HtmlPurifier
éviter que du texte non échappé potentiellement dangereux ne cible notre serveur.
Au cours de cet effort, j'ai réappris que pour accéder à une propriété avec un trait d'un objet en PHP, vous devez l'entourer d'accolades:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text');
Et enfin, une fois que nous avons déterminé que la réunion et l'expéditeur existent et que ce dernier est un participant, nous ajoutons le stripped_text
comme note:
// echo 'chèque participant'; // vérifier que l'expéditeur est un participant ou un organisateur de cette réunion $ is_attendee = Meeting :: isAttendee ($ meeting_id, $ user_id); if ($ is_attendee) // ajoute une note de réunion, automatiquement son tampon de connexion et de réunion mis à jour MeetingNote :: add ($ meeting_id, $ user_id, $ stripped_text); autre
La nouvelle note apparaîtra sur la page de l'événement de la réunion lorsque le participant reviendra:
Yii prend en charge les événements ActiveRecord afin que, lorsqu’un Note de réunion
est ajouté, un Journal de réunion
l'entrée est créée automatiquement:
fonction publique afterSave ($ insert, $ modifiedAttributes) parent :: afterSave ($ insert, $ modifiedAttributes); if ($ insert) // si MeetingNote MeetingLog :: add ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);
Dans un prochain épisode, j'expliquerai comment cet événement déclenchera un autre événement qui aidera Meeting Planner à coordonner lorsqu'il est préférable d'informer les participants à la réunion qu'une nouvelle note ou un autre changement est survenu..
Essayez d'envoyer une invitation de planificateur de réunion et demandez à votre destinataire de répondre au courrier électronique avec un message. Vous devriez recevoir une notification peu après qu'ils l'aient fait et pouvoir ensuite la voir sur la page de l'événement..
J'espère que vous avez apprécié cet aspect appliqué à l'utilisation de l'API de routage et store () de Mailgun. C'est une API assez amusante et sophistiquée avec laquelle travailler. Mailgun propose en réalité une vaste gamme de services de messagerie pertinents pour tous les types de codage et de développement commercial. Et, de manière impressionnante, ils font un excellent travail tout ce qu'ils offrent.
Il s’agit bien d’un message sponsorisé, mais en tant qu’utilisateur expérimenté, j’offre la recommandation authentique que je vous recommande d’essayer le service aujourd’hui. Je les utilise pour tous mes projets.
Et, évidemment, il existe de nombreux autres scénarios que nous pourrions créer lors du traitement des messages. Par exemple, nous pourrions laisser les utilisateurs répondre avec des commandes telles que "retard" et nous saurons envoyer un SMS à l'autre personne pour lui signaler que leur collègue est en retard.
S'il vous plaît laissez-nous savoir quelles fonctionnalités Mailgun vous voudriez voir écrites à propos de plus à l'avenir. Vous pouvez les poster dans les commentaires ci-dessous ou me joindre directement sur Twitter @reifman.