Benvenuti in un episodio speciale della serie Building Your Startup sponsorizzata da Mailgun. In questa serie, ti guiderò attraverso il lancio di una startup dall'idea alla realtà usando la mia app Meeting Planner come esempio di vita reale. Ogni passo lungo il percorso, rilasceremo il codice di Meeting Planner come esempi open-source da cui puoi imparare. Nell'episodio di oggi, Mailgun è intervenuto per sponsorizzare un tutorial su come ho integrato l'instradamento dei messaggi e l'API Store () per gestire le risposte degli utenti.
Ad esempio, quando le persone ricevono le richieste di riunione dagli altri con Meeting Planner, possono semplicemente scegliere di rispondere e inviare una nota come farebbero con un tipico thread di posta elettronica. Tuttavia, volevo elaborare automaticamente la risposta, aggiungerla come nota alla riunione e quindi comunicare al destinatario che un aggiornamento è pronto per essere visualizzato. Sembra complicato, ma uno degli obiettivi di Meeting Planner è ridurre le e-mail avanti e indietro tra le persone sulla pianificazione e consolidare le modifiche in tempo reale in un numero inferiore di notifiche.
Se non hai ancora familiarità con Mailgun, è il motore di automazione della posta elettronica considerato affidabile da oltre 10.000 sviluppatori di siti Web e applicazioni per l'invio, la ricezione e il monitoraggio delle email. Sfruttando le potenti API di posta di Mailgun, gli sviluppatori possono dedicare più tempo alla creazione di siti Web di qualità e alla riduzione dei tempi di conflitto con i server di posta elettronica.
Offre una varietà di funzioni per la gestione della posta elettronica in modo rapido ed efficiente per la tua applicazione:
L'API di Mailgun supporta tutti i linguaggi più diffusi, tra cui PHP, Ruby, Python, C # e Java e offre una documentazione eccellente e ben organizzata.
Per me è stata una scelta irrinunciabile in molte delle mie attività di consulenza, startup e tutorial.
Se desideri seguire il tutorial di oggi e non hai ancora familiarità con Mailgun, puoi provare Esplorare Mailgun: Il motore di posta elettronica per sviluppatori o Come Geogram ha creato un servizio di posta elettronica di gruppo gratuito utilizzando Yii per PHP con MySQL. Si consiglia inoltre di leggere Store (): una casella di posta temporanea per tutte le e-mail in arrivo per un background più tecnico.
Tutto il codice per Meeting Planner è scritto in Yii2 Framework per PHP. Se desideri saperne di più su Yii2, consulta la nostra serie parallela Programmazione con Yii2 su Envato Tuts+.
Se non hai ancora provato Meeting Planner, prova a pianificare la tua prima riunione ora. Sta davvero arrivando insieme e si avvicina alla versione alpha.
Il feedback è benvenuto Se hai una domanda o un suggerimento sull'argomento, per favore pubblica un commento qui sotto. Puoi anche raggiungermi su Twitter @reifman.
E grazie, Mailgun, per aver sponsorizzato questo episodio della nostra serie di startup!
Tieni presente che, poiché si tratta di un tutorial sponsorizzato, potrebbe comparire prima dei normali episodi della serie di avvio. Quindi alcuni codici potrebbero apparire più avanti rispetto agli episodi imminenti.
Ho già parlato dell'utilizzo della consegna SMTP di Mailgun per le e-mail in uscita in Meeting Planner, ma per quanto riguarda la risposta alle e-mail?
Ad esempio, gli inviti di Meeting Planner hanno un concetto chiamato note. Le note sono commenti o messaggi condivisi avanti e indietro tra i destinatari. Attualmente possono essere pubblicati dalla pagina di visualizzazione della riunione. Ecco un esempio:
Tuttavia, volevo rendere più semplice per le persone rispondere a un'e-mail su una riunione e avere il loro messaggio facilmente aggiunto come nota alla riunione, quindi raggruppare quell'aggiornamento con altre notifiche delle modifiche sulla riunione. Ad esempio, una persona potrebbe accettare luoghi e orari dall'e-mail di invito, ma può anche rispondere all'invito direttamente dalla propria applicazione di posta elettronica o posta elettronica basata su cloud. L'organizzatore della riunione riceverà una notifica di aggiornamenti anziché diversi.
Ecco un riassunto di ciò che stiamo costruendo oggi:
Innanzitutto, tutte le e-mail di pianificazione di Meeting Planner utilizzeranno un indirizzo di risposta per indirizzare tutto a una cassetta postale @ meetingplanner.io. Mailgun è assegnato per elaborare tutte le email in entrata tramite i nostri record MX. Con il routing Mailgun, possiamo chiedere al servizio di notificare il nostro server ogni volta che arrivano nuovi messaggi. Quindi, in background, possiamo elaborarli.
Mailgun analizza i messaggi con i suoi algoritmi esperti, quindi non è necessario. Quindi è facile per noi determinare chi ha risposto a un messaggio, a quale riunione stavano rispondendo e quale nota stavano scrivendo nel loro messaggio. Infine, aggiungeremo la nota alla riunione e informeremo l'altro partecipante.
Seguitelo mentre vi guido attraverso come è fatto.
Qualche tempo fa, ho impostato i record MX per MeetingPlanner.io per incanalare tutta la posta in arrivo direttamente su Mailgun.
Ecco un esempio di record MX per Mailgun:
Usando la semplice interfaccia utente di routing di Mailgun, ho impostato l'inoltro per il jeff e supporto le cassette postali affinché le persone interessate possano raggiungermi o l'assistenza clienti.
Le funzionalità di routing di Mailgun forniscono anche le seguenti funzionalità:
Una volta pronto per integrare il routing in entrata per la pianificazione delle riunioni, ho deciso di utilizzare l'API store () di Mailgun. Mentre Mailgun può recapitare e-mail analizzate sul tuo server web in tempo reale, temporanee impreviste o i tuoi fallimenti di servizio potrebbero farti perdere i messaggi. In base al feedback dei clienti, Mailgun ha deciso di creare la capacità di archiviare i messaggi nel cloud e di consentire alla tua applicazione di elaborarli per un periodo di tre giorni.
Ecco Mailgun che descrive alcuni possibili casi che un cloud store aiuta a risolvere:
In alcuni casi, gli allegati sono grandi e causano timeout quando proviamo a inviare i dati ai loro server. In altri casi, vi è un grande volume di e-mail in arrivo e i clienti preferiscono semplicemente eseguire una richiesta GET a un certo intervallo invece di dover gestire più POST da noi. Infine, funge da ridondanza nel caso in cui il loro servizio web non funzioni e non possano accettare i nostri POST.
Così ho configurato il routing di Mailgun per avvisare semplicemente il server di Meeting Planner ogni volta che riceve un nuovo messaggio. Si noti la terza configurazione di seguito:
Ogni volta che i messaggi jolly entrano in Meeting Planner, Mailgun lo farà memorizzare() loro e avvisare http://meetingplanner.io/mailgun-notification/store che c'è un nuovo messaggio e poi Stop() in lavorazione.
L'espansione dell'uso delle API con Mailgun è stata di nuovo semplice poiché la loro documentazione è di prim'ordine. Fornisce supporto per una varietà di lingue, ad es. Ruby, Python, PHP, Java, C # e Go. Offre esempi operativi di implementazione della funzionalità Mailgun attraverso i suoi servizi, indipendentemente dal fatto che stiate trasmettendo, monitorando o instradando.
Quindi, usando Yii2 e il suo generatore automatico di codice per scaffolding, Gii, ho creato migrazioni, modelli e controller per un modello MailgunNotification.
classe m160514_010650_create_mailgun_notification_table estende Migration public function up () $ tableOptions = null; if ($ this-> db-> driverName === 'mysql') $ tableOptions = 'SET CARATTERE 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);
Memorizza un URL di notifica da Mailgun che possiamo recuperare in seguito. Per esempio:
https://api.mailgun.net/v2/domains/meetingplanner.io/messages/eyJw2UsICJrIjogImUyQ5LTk1NmItNGIwOCLWZmZTFjMDU3ZiIsICJzIjogIjNGUiLCAiYyIcyJ9
Ecco il codice che aggiunge le notifiche non elaborate con STATO: IN ATTESA
:
archivio di funzioni pubbliche ($ message_url) // memorizza l'url dalla notifica di 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 ();
In questo scenario, devi scrivere il codice di produzione per elaborare e successivamente reagire alle notifiche e ai messaggi di cui Mailgun ti ha informato. Mailgun fornisce un utile modulo di test per testare il tuo server nella parte inferiore della pagina di configurazione del routing.
Poiché i server di produzione sono più difficili da eseguire il debug, è stato necessario del tempo per farlo correttamente. Quindi all'inizio ho incontrato degli errori.
Ma poi, alla fine, ho ricevuto le notifiche in entrata che funzionano:
Essenzialmente, ho analizzato il messaggio-url
e memorizzato nel database:
public function actionStore () // memorizza la posta in arrivo da Mailgun if (isset ($ _ POST ['message-url'])) MailgunNotification :: store ($ _ POST ['message-url']);
In questo esempio, immagina di aver risposto a un invito a una riunione da Tom per ricordargli di portare un libro alla nostra discussione sul caffè:
In risposta, Mailgun ci notifica il messaggio e un URL sicuro per accedere ai suoi contenuti è archiviato nel MailgunNotification
tavolo:
Successivamente, ho esteso l'elaborazione in background di Meeting Planner per recuperare i nuovi messaggi da Mailgun ed elaborarli. L'analisi delle e-mail con Mailgun è facile poiché hanno svolto tutto il lavoro che altrimenti richiederebbe mesi (e mesi ... e mesi ... e mesi).
In sostanza, Mailgun accetta e-mail in entrata non strutturate (mostrato a sinistra) e invia i dati strutturati e analizzati dalla tua applicazione (mostrati a destra):
Gli sviluppatori indipendenti disinformati impiegano mesi a codificare l'analisi delle e-mail da soli, un'attività che non è mai veramente completa. Mailgun gestisce questo per te.
Passiamo attraverso il MailgunNotification :: Process
metodo. Inizialmente, cerchiamo notifiche in sospeso nel MailgunNotification
tabella e invocare il mio componente Yiigun.php che fa a ottenere()
richiedere a Mailgun l'URL ricevuto per una notifica:
public static function process () $ items = MailgunNotification :: find () -> dove (['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 (); Continua; $ response = $ raw_response-> http_response_body;
Mailgun restituisce i dati dettagliati dal messaggio. Quindi analizziamo il meeting_id
dal campo del destinatario, il corpo del messaggio e l'e-mail del mittente. Ancora una volta, Mailgun rende questo facile:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text'); // analizza l'ID della riunione if (isset ($ response-> To)) $ to_address = $ response-> To; else $ to_address = $ response-> a; $ 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 (); Continua; // echo 'mid:'. $ meeting_id. '
'; // verifica l'ID della riunione è valido se (isset ($ response-> Sender)) $ sender = $ response-> Sender; else $ sender = $ response-> mittente; // clean sender // echo 'pre clean sender:'. $ sender. '
'; $ sender = \ yii \ helpers \ HtmlPurifier :: process ($ sender); // echo 'sender:'. $ sender. '
'; $ user_id = Utente :: findByEmail ($ mittente); if ($ user_id === false) $ error = true; // non fare nulla // da fare - rispondi con non riconoscere l'indirizzo email $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ M-> update (); Continua;
Apprezzo in particolare che Mailgun fornisca il testo spogliato, che estrae la firma del mittente e il thread di risposta. Io uso anche HtmlPurifier
per evitare che il testo potenzialmente non dannoso non sfugga al nostro server.
Durante questo sforzo, ho imparato che per accedere a una proprietà sillabata di un oggetto in PHP, devi circondarla con parentesi graffe:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text');
E infine, una volta stabilito che l'incontro e il mittente esistono e che quest'ultimo è un partecipante, aggiungiamo il stripped_text
come nota:
// echo 'controlla il partecipante'; // verifica che il mittente sia un partecipante o un organizzatore di questa riunione $ is_attendee = Meeting :: isAttendee ($ meeting_id, $ user_id); se ($ is_attendee) // aggiungi la nota della riunione, automaticamente il suo timbro touch registrato e della riunione ha aggiornato MeetingNote :: add ($ meeting_id, $ user_id, $ stripped_text); altro
La nuova nota verrà visualizzata nella pagina dell'evento della riunione quando il partecipante torna:
Yii supporta gli eventi di ActiveRecord in modo che quando a MeetingNote
è aggiunto, a MeetingLog
la voce viene creata automaticamente:
funzione pubblica afterSave ($ insert, $ changedAttributes) parent :: afterSave ($ insert, $ changedAttributes); if ($ insert) // se MeetingNote MeetingLog :: add ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);
In un episodio futuro, spiegherò come questo evento attiverà un altro evento che aiuta coordinatore di Meeting Planner quando è meglio informare i partecipanti alla riunione che una nuova nota o un'altra modifica è avvenuta.
Prova a inviare un invito a Meeting Planner e chiedi al destinatario di rispondere all'e-mail con un messaggio. Dovresti ricevere una notifica poco dopo averlo fatto e quindi essere in grado di visualizzarlo sulla pagina dell'evento.
Spero ti sia piaciuto questo aspetto applicato utilizzando l'API di routing e store () di Mailgun. È un'API molto divertente e sofisticata con cui lavorare. Mailgun offre davvero una vasta gamma di servizi di posta elettronica che sono rilevanti per tutti i tipi di sviluppo di codice e business. E, impressionante, fanno un ottimo lavoro a tutti quelli che offrono.
Certamente questo è un post sponsorizzato, ma come utente esperto, offro la mia raccomandazione autentica per provare oggi il servizio. Li ho usati per tutti i miei progetti.
E, ovviamente, ci sono molti altri scenari che potremmo creare durante l'elaborazione dei messaggi. Ad esempio, potremmo consentire agli utenti di rispondere con comandi come "in ritardo" e sapremo di mandare messaggi di testo all'altra persona che il loro collega è in ritardo.
Per favore facci sapere quali funzionalità di Mailgun ti piacerebbe vedere scritte di più in futuro. Puoi postarli nei commenti qui sotto o raggiungermi direttamente su Twitter @reifman.