Använda Mailgun Store () En tillfällig postlåda för din appars inkommande e-post

Vad du ska skapa

Välkommen till ett speciellt avsnitt av vår Building Your Startup-serie sponsrad av Mailgun. I denna serie guidar jag dig genom att starta en uppstart från koncept till verklighet med hjälp av min mötesplanerareapp som ett verkligt exempel. Varje steg under vägen kommer vi att släppa mötesplaneringskoden som exempel på öppen källkod som du kan lära av. I dagens episod gick Mailgun in för att sponsra en handledning om hur jag integrerade sitt meddelande routing och Store () API för att hantera svar från användare.

När människor till exempel får mötesförfrågningar från andra med mötesplanerare, kan de bara välja att svara och skicka en anteckning som de skulle till en vanlig e-posttråd. Jag ville emellertid automatiskt behandla svaret, lägga till det som en anteckning till mötet och meddela sedan mottagaren att en uppdatering är klar att visa. Låter komplicerat, men en av mötesplanerarens mål är att minska fram och tillbaka e-postmeddelanden mellan människor om planering och konsolidering i realtidsändringar till färre meddelanden.

Vad är Mailgun?

Om du ännu inte är bekant med Mailgun, är det e-postautomatiseringsmotorn som är betrodd av över 10 000 webbsidor och applikationsutvecklare för att skicka, ta emot och spåra e-postmeddelanden. Genom att utnyttja Mailguns kraftfulla epost-API kan utvecklare spendera mer tid på att bygga fantastiska webbplatser och mindre tid att kämpa med e-postservrar.

Det erbjuder en mängd olika funktioner för att hantera e-post snabbt och effektivt för din ansökan:

  • Skicka e-post (via API eller SMTP)
  • Inbound Routing
  • Spårning och Analytics
  • Spamfiltrering
  • Postlistor
  • E-postvalidering
  • Administrerade e-posttjänster

Mailgun API stöder alla populäraste språk, inklusive PHP, Ruby, Python, C # och Java, och de erbjuder utmärkt, välorganiserad dokumentation.

Det har varit ett go-to-choice för mig i många av mina konsultaktiviteter, nystart och tutorials.

Om du vill följa dagens handledning och ännu inte är bekant med Mailgun, kan du kolla Exploring Mailgun: Email Engine for Developers eller Hur Geogram byggt en gratis grupp e-posttjänst med Yii för PHP med MySQL. Du kanske också vill läsa Butik (): en tillfällig brevlåda för all din inkommande e-post för mer teknisk bakgrund.

All kod för mötesplanerare är skrivet i Yii2 Framework for PHP. Om du vill lära dig mer om Yii2, kolla in vår parallella serie Programmering med Yii2 på Envato Tuts+.

Om du inte har provat mötesplaneraren ännu, försök planera ditt första möte nu. Det kommer verkligen tillsammans och närmar sig alfa-frisläppande. 

Feedback är välkommen. Om du har en fråga eller ett ämnesförslag, vänligen skriv en kommentar nedan. Du kan också nå mig på Twitter @ reifman.

Och tack, Mailgun, för att sponsra denna episod av vår startserie!

Tänk på att det här, eftersom det här är en sponsrad handledning, kan visas före våra vanliga Startup-serien. Så vissa koder kan visas längre fram än i kommande episoder.

Använda Mailgun i mötesplaneraren

Jag har redan pratat om att använda Mailguns SMTP-leverans för utgående e-postmeddelanden i mötesplaneraren, men hur är det med att svara på e-postmeddelanden?

Mötesplanerarens inbjudningar har till exempel ett koncept som heter anteckningar. Anteckningar är kommentarer eller meddelanden som delas fram och tillbaka mellan mottagarna. För närvarande kan de publiceras från mötesvynssidan. Här är ett exempel:

Jag ville emellertid göra det lätt för människor att svara på ett mail om ett möte och få ett enkelt meddelande till mötet, och sedan gruppera den uppdateringen med andra meddelanden om förändringar i mötet. Till exempel kan en person acceptera platser och tider från deras inbjudnings-e-post men svara även på inbjudan direkt från deras e-postprogram eller molnbaserade e-postmeddelanden. Mötet arrangören kommer att få en anmälan av uppdateringar snarare än flera.

En översikt över hur vi ska använda Mailgun

Här är en sammanfattning av vad vi bygger idag:

För det första kommer alla mötesplanerare att använda en svaradress för att styra allt till en @ meetingplanner.io-brevlåda. Mailgun har tilldelats att behandla alla inkommande e-postmeddelanden via våra MX-poster. Med Mailgun-routing kan vi fråga tjänsten att meddela vår server när nya meddelanden anländer. Sedan kan vi i bakgrunden behandla dem. 

Mailgun analyserar meddelanden med sina expertalgoritmer så att vi inte behöver. Så det är lätt för oss att bestämma vem som svarade på ett meddelande, vilket möte de svarade på och vilken anteckning de skrev i sitt meddelande. Slutligen lägger vi noten till mötet och informerar den andra deltagaren.

Följ med när jag går igenom dig hur det här görs.

Ta emot inkommande e-post på ditt domän

För en tid sedan satte jag upp MX-poster för MeetingPlanner.io för att trampa all inkommande e-post direkt till Mailgun. 

Här är ett exempel på MX-poster för Mailgun:

Med hjälp av Mailguns enkla routing-användargränssnitt ställer jag vidare vidare till jeff och supportpostlådor för intresserade personer att nå mig eller kundsupport.

Mailguns rutningsfunktioner ger också följande funktioner:

  • Eventuellt få rakt MIME-meddelande
  • Alla meddelanden kodas automatiskt till UTF-8
  • Gratis skräppostfiltrering
  • Enkel testning av webbockändpunkter
  • Textdelad generation från HTML-bara e-postmeddelanden
  • Matchar på alla e-postrubriker (t ex ämne, från :, cc :) och mottagare
  • Förmåga att kombinera flera filter för att ge sofistikerade uttryck

När jag var redo att integrera inkommande routing för möteskalkylering bestämde jag mig för att använda Mailgun's store () API. Medan Mailgun kan leverera parsade e-postmeddelanden till din webbserver i realtid, kan tillfälliga störningar eller dina egna servicefel leda till att du saknar meddelanden. Baserat på feedback från kunder beslutade Mailgun att bygga upp kapacitet att lagra meddelanden i sitt moln och låta din ansökan bearbeta dem över en tre dagarsperiod.

Här är Mailgun som beskriver några möjliga fall som en molnbutik hjälper till att lösa:

I vissa fall är bilagorna stora och orsakar time-outs när vi försöker posta data till sina servrar. I andra fall finns det en stor volym inkommande e-post och kunder vill hellre bara driva en GET-förfrågan vid något intervall i stället för att behöva hantera flera POST från oss. Slutligen tjänar det som redundans om deras webbtjänst går ner och de kan inte acceptera våra POSTs.

Så jag konfigurerade Mailguns routing för att bara meddela Meeting Planner-servern när det tar emot ett nytt meddelande. Lägg märke till den tredje konfigurationen nedan:

När vildkortsmeddelanden kommer in i mötesplaneraren, kommer Mailgun att Lagra() dem och meddela http://meetingplanner.io/mailgun-notification/store att det finns ett nytt meddelande och då sluta() bearbetning.

Att utvidga min API-användning med Mailgun var igen okomplicerad eftersom deras dokumentation är högst upp. Det ger stöd för en mängd olika språk, t.ex. Ruby, Python, PHP, Java, C # och Go. Det erbjuder arbetsexempel på att implementera Mailgun-funktionalitet över sina tjänster - oavsett om du sänder, spårar eller dirigerar.

Så, med hjälp av Yii2 och dess automatiska byggnads kodgenerator, Gii, skapade jag migreringar, modeller och controllers för en MailgunNotification-modell.

klass m160514_010650_create_mailgun_notification_table utökar migration public function up () $ tableOptions = null; om ($ 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. 'INTE NULL', 'status' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Schema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);  

Den lagrar en anmälningsadress från Mailgun som vi kan hämta från senare. Till exempel:

https://api.mailgun.net/v2/domains/meetingplanner.io/messages/eyJw2UsICJrIjogImUyQ5LTk1NmItNGIwOCLWZmZTFjMDU3ZiIsICJzIjogIjNGUiLCAiYyIcyJ9

Här är koden som lägger till obearbetade meddelanden med STATUS: PÅGÅENDE:

public function store ($ message_url) // lagra url från postgun notification $ 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> Spara ();  

Bearbetar POSTed-meddelanden

I det här scenariot måste du skriva produktionskod för att bearbeta och senare reagera på meddelanden och meddelanden Mailgun meddelar dig om. Mailgun ger ett användbart testformulär för att testa din server längst ner på routings konfigurationssidan.

Eftersom produktionsservrar är svåra att felsöka, tog det lite tid att få det här. Så jag började först påverka fel.

Men sen slutligen fick jag inkommande meddelanden som fungerade:

I huvudsak analyserade jag meddelande-url och lagrade den i databasen:

public function actionStore () // lagrar inkommande postmeddelande från Mailgun om (isset ($ _ POST ['message url'])) MailgunNotification :: store ($ _ POST ['message-url']);  

I det här exemplet kan du föreställa dig att jag har svarat på en mötesinbjudan från Tom för att påminna honom om att ta med en bok till vår kaffediskussion:

Som svar meddelar Mailgun oss meddelandet, och en säker URL för åtkomst till dess innehåll lagras i MailgunNotification tabell:

Bakgrundsmeddelande

Därefter utvidgade jag mötesplanerarens bakgrundsbehandling för att hämta nya meddelanden från Mailgun och bearbeta dem. Parsing email med Mailgun är lätt eftersom de har gjort allt arbete som annars skulle ta månader (och månader ... och månader ... och månader).

I huvudsak tar Mailgun ostrukturerad inkommande e-post (visas till vänster) och skickar din applikationsparserad, strukturerad data (visas till höger):

Oinformerade oberoende utvecklare spenderar månader kodande e-post parsing på egen hand, en uppgift som aldrig är helt klar. Mailgun hanterar detta för dig.

Låt oss gå igenom MailgunNotification :: Process metod. Först letar vi efter väntar meddelanden i MailgunNotification bord och anropa min Yiigun.php-komponent som gör a skaffa sig() begäran till Mailgun på webbadressen vi mottog för en anmälan:

offentliga statiska funktionen process () $ items = MailgunNotification :: find () -> where (['status' => MailgunNotification :: STATUS_PENDING]) -> alla (); om (count ($ items) == 0) return false;  $ yg = nytt Yiigun (); foreach ($ items as $ m) $ error = false; // echo $ m-> id. '
'; $ raw_response = $ yg-> få ($ m-> url); om (is_null ($ raw_response)) $ m-> status = MailgunNotification :: STATUS_NOT_FOUND; $ M-> uppdatering (); Fortsätta; $ response = $ raw_response-> http_response_body;

Mailgun returnerar de detaljerade uppgifterna från meddelandet. Så vi analyserar MEETING_ID från mottagarfältet, kroppstexten och avsändarens email. Återigen gör Mailgun det här lätt:

$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text'); // analysera mötesidentiteten om (isset ($ response-> To)) $ to_address = $ response-> To;  else $ to_address = $ response-> till;  $ to_address = str_ireplace ('@ meetingplanner.io', ', $ to_address); $ to_address = str_ireplace (' mp _ ',', $ till_adress); $ meeting_id = intval ($ till_adress); om (! is_numeric ($ meeting_id)) $ error = true; $ m-> status = MailgunNotification :: STATUS_INVALID_MEETING_ID; $ M-> uppdatering (); Fortsätta;  // echo 'mid:'. $ meeting_id. '
'; // verifiera mötesidentitet är giltig om (isset ($ response-> Sender)) $ avsändare = $ svar-> Avsändare; annars $ avsändare = $ svar-> avsändare; // ren avsändare // echo 'pre clean sender:'. $ sender. '
'; $ avsändare = \ yii \ helpers \ HtmlPurifier :: process ($ avsändare); // echo 'avsändare:'. $ avsändare. '
'; $ user_id = Användare :: findByEmail ($ avsändare); om ($ user_id === false) $ error = true; // gör ingenting // att göra - svara med att inte känna igen e-postadressen $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ M-> uppdatering (); Fortsätta;

Jag uppskattar särskilt att Mailgun ger strippad text, som tar bort avsändarens underskrift och svarstråden. Jag använder också HtmlPurifier för att förhindra potentiellt skadlig oskild text från att rikta in vår server.

Under denna ansträngning lärt jag mig att för att komma åt en bindad egenskap hos ett objekt i PHP måste du omsluta det med lockiga fästen:

$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text');

Och äntligen, när vi har bestämt att mötet och avsändaren existerar och att den senare är en deltagare, lägger vi till stripped_text som en anteckning:

 // echo "check deltagare"; // verifiera avsändaren är en deltagare eller arrangör till det här mötet $ is_attendee = Möte :: isAttendee ($ meeting_id, $ user_id); om ($ is_attendee) // lägg till mötesanteckning, uppdateras automatiskt den loggade och mötesadressen stämpeln MeetingNote :: lägg till ($ meeting_id, $ user_id, $ stripped_text);  annat 

Den nya noten kommer att visas på mötesevenemangssidan när deltagaren återvänder:

Yii stöder ActiveRecord-händelser så att när a MeetingNote läggs till, a MeetingLog posten skapas automatiskt:

offentlig funktion afterSave ($ insert, $ changedAttributes) förälder :: afterSave ($ insert, $ changedAttributes); om ($ insert) // om MeetingNote MeetingLog :: lägg till ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);  

I ett framtida avsnitt förklarar jag hur det här händelsen kommer att utlösa en annan händelse som hjälper mötesplaneraren att koordinera när det är bäst att meddela mötesdeltagare att en ny anteckning eller annan ändring har inträffat.

Prova att skicka en mötesplaneringsinbjudan och be din mottagare att svara på e-postmeddelandet med ett meddelande. Du borde få en anmälan strax efter att de har gjort det och sedan kan visa den på händelsessidan.

I stängning

Jag hoppas att du njöt av det här tillämpade tittar på att använda Mailguns routing och store () API. Det är ett ganska roligt, sofistikerat API att arbeta med. Mailgun erbjuder verkligen ett brett utbud av e-posttjänster som är relevanta för alla typer av kodning och affärsutveckling. Och imponerande, de gör ett bra jobb alls som de erbjuder. 

Visst är detta ett sponsrat inlägg, men som en erfaren användare erbjuder jag min giltiga rekommendation för dig att prova tjänsten idag. Jag har använt dem för alla mina projekt.

Och det finns uppenbarligen många andra scenarier vi kan bygga när vi behandlar meddelanden. Vi kan till exempel låta användare reagera med kommandon som "sen" och vi kommer att veta att texten är den andra personen som kollegan kör sen.

Vänligen meddela oss vilka Mailgun-funktioner du vill se skrivna om mer i framtiden. Du kan skicka in dem i kommentarerna nedan eller nå mig direkt på Twitter @ reifman.

relaterade länkar

  • Mailgun-E-posttjänsten för utvecklare
  • Store (): En tillfällig brevlåda för all din inkommande e-post
  • Staticus: Sample Mailgun Store () Application (GitHub)
  • Mailgun Resource Library
  • Mer Envato Tuts + Mailgun Tutorials