Bruke Mailgun Store () En midlertidig postkasse for Appens innkommende e-post

Hva du skal skape

Velkommen til en spesiell episode av vår Building Your Startup-serie sponset av Mailgun. I denne serien veileder jeg deg gjennom å starte en oppstart fra konsept til virkelighet ved å bruke min Meeting Planner-app som et virkelighetseksempel. Hvert trinn underveis frigjør vi møteplanleggerkoden som åpen kildekodeeksempler du kan lære av. I dagens episode gikk Mailgun inn for å sponsere en veiledning om hvordan jeg integrert sin meldingsruting og Store () API for å håndtere svar fra brukere.

For eksempel, når folk mottar møteforespørsler fra andre med møteplanlegger, kan de bare velge å svare og sende et notat som de ville til en typisk e-posttråd. Jeg ville imidlertid automatisk behandle svaret, legge det til som et notat til møtet, og deretter varsle mottakeren om at en oppdatering er klar til å vise. Høres komplisert, men en av Meeting Planner-målene er å redusere frem og tilbake e-postmeldinger mellom folk om planlegging og konsolidering av sanntidsendringer i færre varsler.

Hva er Mailgun?

Hvis du ennå ikke er kjent med Mailgun, er det e-postautomatiseringsmaskinen som er betrodd av over 10 000 nettsider og applikasjonsutviklere for sending, mottak og sporing av e-post. Ved å utnytte Mailguns kraftige e-mail-APIer, kan utviklere bruke mer tid på å bygge flotte nettsteder og mindre tid med å kjempe med e-postservere.

Den tilbyr en rekke funksjoner for å administrere e-post raskt og effektivt for din søknad:

  • Sende e-post (via API eller SMTP)
  • Innkommende ruting
  • Sporing og Analytics
  • Spam filtrering
  • Postlister
  • E-postbekreftelse
  • Administrerte e-posttjenester

Mailgun API støtter alle de mest populære språkene, inkludert PHP, Ruby, Python, C # og Java, og de tilbyr utmerket, godt organisert dokumentasjon.

Det har vært et go-to-choice for meg i mange av mine konsulentaktiviteter, oppstart og opplæringsprogrammer.

Hvis du vil følge dagens veiledning og ennå ikke er kjent med Mailgun, kan du sjekke ut. Exploring Mailgun: Email Engine for Developers eller Hvordan Geogram har bygget en gratis gruppe-e-posttjeneste ved hjelp av Yii for PHP med MySQL. Du vil kanskje også lese Store (): en midlertidig postkasse for all din innkommende e-post for mer teknisk bakgrunn.

Alle koden for Meeting Planner er skrevet i Yii2 Framework for PHP. Hvis du vil lære mer om Yii2, sjekk ut vår parallelle serie Programmering med Yii2 på Envato Tuts+.

Hvis du ikke har prøvd Meeting Planner ennå, kan du prøve å planlegge ditt første møte nå. Det kommer virkelig sammen og nærmer seg alfa-utgivelse. 

Tilbakemelding er velkommen. Hvis du har et spørsmål eller et emneforslag, vennligst legg inn en kommentar nedenfor. Du kan også nå meg på Twitter @ reifman.

Og takk, Mailgun, for sponsing av denne episoden av vår oppstartsserie!

Husk at dette, fordi dette er en sponset opplæringsoppgave, kan vises foran våre vanlige oppstartsseriepisoder. Så noen kode kan vises lenger enn i kommende episoder.

Bruke Mailgun i møteplanleggeren

Jeg har allerede snakket om å bruke Mailguns SMTP-levering for utgående e-post i Meeting Planner, men hva med å svare på e-post?

For eksempel har Meeting Planner invitasjoner et konsept som heter notater. Notater er kommentarer eller meldinger som deles frem og tilbake mellom mottakerne. For øyeblikket kan de bli lagt ut fra møtevisningssiden. Her er et eksempel:

Imidlertid ønsket jeg å gjøre det enkelt for folk å svare på en e-post om et møte og få deres melding enkelt lagt til som et notat til møtet, og deretter gruppere den oppdateringen med andre varsler om endringer i møtet. For eksempel kan en person godta steder og tider fra invitasjonsmeldingen, men deretter svare også på invitasjonen direkte fra e-postprogrammet eller skybasert e-post. Møtelæreren mottar ett varsel om oppdateringer i stedet for flere.

En oversikt over hvordan vi skal bruke Mailgun

Her er et sammendrag av hva vi bygger i dag:

Først vil alle planleggingsemailene i møteplanleggeren bruke en svaradresse for å lede alt til en @ meetingplanner.io postkasse. Mailgun er tildelt til å behandle alle innkommende e-post via våre MX-poster. Med Mailgun-ruting kan vi spørre tjenesten om å varsle vår server når nye meldinger kommer. Så, i bakgrunnen, kan vi behandle dem. 

Mailgun analyserer meldinger med ekspertalgoritmer, slik at vi ikke trenger det. Så det er lett for oss å bestemme hvem som svarte på en melding, hvilket møte de svarte på, og hva notatet de skrev i deres melding. Til slutt legger vi notatet til møtet og informerer den andre deltageren.

Følg med når jeg går deg gjennom hvordan dette er gjort.

Motta innkommende e-post på ditt domene

For en stund siden opprettet jeg MX-poster for MeetingPlanner.io for å trekke all innkommende e-post direkte til Mailgun. 

Her er et eksempel på MX-poster for Mailgun:

Ved hjelp av Mailguns enkle ruting-brukergrensesnitt, setter jeg opp for å sende og sende postkasser til interesserte personer for å nå meg eller kundesupport.

Mailguns rutefunksjoner gir også følgende muligheter:

  • Mulig mottatt rå MIME-melding
  • Alle meldinger kodet automatisk til UTF-8
  • Gratis spamfiltrering
  • Enkel testing av webhook endepunkter
  • Tekst-del generasjon fra HTML-kun e-post
  • Matcher på alle e-postoverskrifter (for eksempel emne, fra :, cc :) og mottakere
  • Evne til å koble sammen flere filtre for å gi sofistikerte uttrykk

Når jeg var klar til å integrere innkommende ruting for å møte planlegging, bestemte jeg meg for å bruke Mailgun's store () API. Mens Mailgun kan levere analyserte e-poster til webserveren din i sanntid, kan midlertidige overspenninger eller dine egne feil på tjenestene føre til at du savner meldinger. Basert på tilbakemeldinger fra kunder, bestemte Mailgun å bygge kapasiteten til å lagre meldinger i sin sky og la søknaden behandle dem over en tre-dagers periode.

Her er Mailgun som beskriver noen mulige tilfeller som en skythandel hjelper med å løse:

I enkelte tilfeller er vedleggene store og forårsaker time-outs når vi prøver å POST dataene til sine servere. I andre tilfeller er det et stort volum innkommende e-post, og kunder vil helst bare kjøre en GET-forespørsel med noe mellomrom i stedet for å måtte håndtere flere POSTer fra oss. Endelig fungerer det som redundans i tilfelle deres webtjeneste går ned og de kan ikke godta våre POSTs.

Så jeg konfigurerte Mailguns ruting for å bare varsle Meeting Planner-serveren når den mottar en ny melding. Legg merke til den tredje konfigurasjonen nedenfor:

Når wildcard meldinger kommer inn i Meeting Planner, vil Mailgun butikk() dem og varsle http://meetingplanner.io/mailgun-notification/store at det er en ny melding og da Stoppe() behandling.

Utvidelse av API-bruken min med Mailgun var igjen grei da dokumentasjonen er topp. Den gir støtte til en rekke språk, f.eks. Ruby, Python, PHP, Java, C # og Go. Den tilbyr arbeidseksempler på å implementere Mailgun-funksjonalitet på tvers av sine tjenester - enten du sender, sporer eller ruter.

Så, ved å bruke Yii2 og sin automatiserte stillaskodegenerator, Gii, opprettet jeg migrasjoner, modeller og kontroller for en MailgunNotification-modell.

klasse m160514_010650_create_mailgun_notification_table utvider Migrasjon offentlig funksjon opp () $ tableOptions = null; hvis ($ this-> db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('mailgun_notification', ['id' => Skjema :: TYPE_PK, 'url' => Skjema :: TYPE_STRING. 'IKKE NULL', 'status' => Skjema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Skjema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Skjema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);  

Den lagrer en varslingsadresse fra Mailgun som vi kan hente fra senere. For eksempel:

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

Her er koden som legger til ubehandlede meldinger med STATUS_PENDING:

offentlig funksjon butikk ($ message_url) // lagre url fra mailgun melding $ 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> Lagre ();  

Behandler POSTed Notifications

I dette scenariet må du skrive produksjonskode for å behandle og reagere senere på meldinger og meldinger Mailgun informerer deg om. Mailgun gir et nyttig testskjema for å teste ut serveren din nederst på rutings konfigurasjonssiden.

Fordi produksjonsservere er vanskeligere å feilsøke, tok det litt tid å få dette til rette. Så jeg kjørte først inn i feil.

Men så til slutt fikk jeg innkommende varsler:

I hovedsak analyserte jeg melding-url og lagret den i databasen:

offentlig funksjon actionStore () // lagrer inngående postvarsel fra Mailgun hvis (isset ($ _ POST ['message-url'])) MailgunNotification :: store ($ _ POST ['message-url']);  

I dette eksemplet kan du forestille deg at jeg har svart på en møteinvitasjon fra Tom for å minne ham om å ta med en bok til kaffediskusjonen vår:

Som svar informerer Mailgun oss om meldingen, og en sikker URL for tilgang til innholdet er lagret i MailgunNotification bord:

Bakgrunnsmessig behandling

Deretter utvidet jeg møteplanleggerens bakgrunnsbehandling for å hente nye meldinger fra Mailgun og behandle dem. Parsing e-post med Mailgun er lett som de har gjort alt arbeidet som ellers ville ta måneder (og måneder ... og måneder ... og måneder).

I hovedsak tar Mailgun ustrukturert innkommende e-post (vist til venstre) og sender søknaden din parsete, strukturerte data (vist til høyre):

Uinformerte uavhengige utviklere bruker månedlig koding av e-post parsing på egenhånd, en oppgave som aldri er helt ferdig. Mailgun klarer dette for deg.

La oss gå gjennom MailgunNotification :: Process metode. Først ser vi etter ventende varsler i MailgunNotification bord og påkalle min Yiigun.php komponent som lager en få() Be om Mailgun på nettadressen vi mottok for et varsel:

offentlig statisk funksjonsprosess () $ items = MailgunNotification :: find () -> hvor (['status' => MailgunNotification :: STATUS_PENDING]) -> alt (); hvis (count ($ items) == 0) return false;  $ yg = ny Yiigun (); foreach ($ elementer som $ m) $ error = false; // echo $ m-> id. '
'; $ raw_response = $ yg-> få ($ m-> url); hvis (is_null ($ raw_response)) $ m-> status = MailgunNotification :: STATUS_NOT_FOUND; $ M-> oppdatering (); Fortsette; $ respons = $ raw_response-> http_response_body;

Mailgun returnerer de detaljerte dataene fra meldingen. Så vi analyserer MEETING_ID fra mottakerfeltet, kroppsteksten og avsenderens e-postadresse. Igjen, Mailgun gjør det enkelt:

$ stripped_text = \ yii \ helpers \ HtmlPurifier :: prosess ($ respons -> 'stripped-text'); // parse møte ID hvis (isset ($ respons-> Til)) $ to_address = $ response-> To;  ellers $ to_address = $ response-> til;  $ to_address = str_ireplace ('@ meetingplanner.io', ', $ to_address); $ to_address = str_ireplace (' mp _ ',', $ til_address); $ meeting_id = intval ($ til_address); hvis (! er_numerisk ($ møte_id)) $ error = true; $ m-> status = MailgunNotification :: STATUS_INVALID_MEETING_ID; $ M-> oppdatering (); Fortsette;  // ekko 'midt:'. $ meeting_id. '
'; // verifiser møte ID er gyldig hvis (isset ($ respons-> Sender)) $ sender = $ respons-> Sender; ellers $ sender = $ respons-> avsender; // ren avsender // ekko 'pre clean sender:'. $ sender. '
'; $ sender = \ yii \ helpers \ HtmlPurifier :: prosess ($ sender); // ekko 'avsender:'. $ avsender. '
'; $ user_id = Bruker :: findByEmail ($ sender); hvis ($ user_id === false) $ error = true; // gjør ingenting // å gjøre - svar med ikke gjenkjenne e-postadresse $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ M-> oppdatering (); Fortsette;

Jeg setter særlig pris på at Mailgun gir strippetekst, som tar ut avsenderens signatur og svartråden. Jeg bruker også HtmlPurifier for å forhindre potensielt skadelig unescaped tekst fra å målrette mot serveren vår.

Under denne innsatsen har jeg lært at for å få tilgang til en bindestrek av en gjenstand i PHP, må du omgjøre den med krøllede parenteser:

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

Og til slutt, når vi har bestemt at møtet og avsenderen eksisterer, og at sistnevnte er en deltaker, legger vi til stripped_text som et notat:

 // ekko 'sjekk deltaker'; // verifiser avsender er en deltaker eller arrangør til dette møtet $ is_attendee = Møte :: isAttendee ($ meeting_id, $ user_id); Hvis ($ is_attendee) // legg til møtenotat, oppdateres automatisk den loggede og møtede stemplet MeetingNote :: legg til ($ meeting_id, $ user_id, $ stripped_text);  annet 

Det nye notatet vises på møtehendelsessiden når deltakeren returnerer:

Yii støtter ActiveRecord hendelser slik at når a MeetingNote er lagt til, a MeetingLog oppføring blir automatisk opprettet:

offentlig funksjon afterSave ($ insert, $ changedAttributes) foreldre :: afterSave ($ insert, $ changedAttributes); hvis ($ insert) // hvis MeetingNote MeetingLog :: legg til ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);  

I en fremtidig episode forklarer jeg hvordan denne hendelsen vil utløse en annen hendelse som hjelper koordinering med møteplanleggeren når det er best å varsle møtedeltakere om at et nytt notat eller en annen endring har skjedd.

Prøv å sende inn en møteplanlegger-invitasjon og spør mottakeren om å svare på e-posten med en melding. Du bør motta et varsel kort tid etter at de har gjort det, og så kan du se det på hendelsessiden.

I Avslutning

Jeg håper du likte dette anvendte ser på å bruke Mailguns ruting og store () API. Det er en ganske morsom, sofistikert API å jobbe med. Mailgun tilbyr virkelig et stort utvalg av e-posttjenester som er relevante for all slags koding og forretningsutvikling. Og imponerende, de gjør en god jobb i det hele tatt de tilbyr. 

Dette er sikkert et sponset innlegg, men som en erfaren bruker tilbyr jeg min autentiske anbefaling for deg å prøve tjenesten i dag. Jeg har brukt dem til alle mine prosjekter.

Og selvfølgelig er det mange andre scenarier vi kan bygge når vi behandler meldinger. For eksempel kan vi la brukerne reagere med kommandoer som "sent", og vi vet at vi skal skrive den andre personen som deres kollega kjører sent.

Gi oss beskjed om hvilke Mailgun-funksjoner du vil se skrevet om mer i fremtiden. Du kan legge inn dem i kommentarene nedenfor eller nå meg direkte på Twitter @ reifman.

Relaterte linker

  • Mailgun-e-posttjenesten for utviklere
  • Store (): En midlertidig postkasse for all din innkommende e-post
  • Staticus: Sample Mailgun Store () Søknad (GitHub)
  • Mailgun Resource Library
  • Flere Envato Tuts + Mailgun Tutorials