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.
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:
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.
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.
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.
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:
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 ();
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:
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.
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.