Migrace z Mandrill na SparkPost v Ruby on Rails aplikaci

Staráme se o aplikaci BusinessBooster, ve které si každý ze zákazníků spravuje své kontakty a může jim posílat různé emaily od reklamních sdělení, kampaní až po automatické gratulace k narozenínám.

Měsíčně se rozesílá desetitíce emailů a na vše se používal Mandrill, díky němuž jsme měli kompletní statistiky doručitelnosti, spamu, otevření email, prokliků, spod.

Krátce však po získání tohoto projektu do naší správy, v době kdy jsme se s celým projektem vyvíjeným několik let předchozími vývojáři teprve seznamovali, přišla zpráva že Mandrill končí. Díky nekontrolování emailu, na který byl Mandrill zaregistrován, jsme se dozvěděli vše na poslední chvíli a měli jsme cca 3 týdny na nalezení a implementaci možného řešení.

Díky limitaci času, neznalostí detailní implementace rozesílání emailů v aplikaci BusinessBooster a dosud nikdy neimplementovanému rozesílání přes další alternativní servery, jsme se museli rozhodovat celkem rychle.

Mandrill uváděl jako možnou alternativu pro přechod server SparkPost. Při bližším prozkoumání jsme zjistili, že tento server využívá pro rozesílání emailů spousta velkým firem. Už jen to nám dávalo naději, že volba přejít na SparkPost bude ideální. Volba tedy padla na SparkPost.

Jelikož SparkPost přistupuje k rozesílání emailů s větší bezpečností a snaží se o co nejlepší doručitelnost, musely se nastudovat nové funkce jako Odesílací doména — Sending domain, SPF a DKIM záznamy, webhooks apod.

Odesílací doména — Sending domains

Odesílací domény ve SparkPostu fungují tak, že pro možnost odesílání emailu z vlastní domény musíte prokázat vlastnictví této domény. Např. pro email my_name@my_domain.com je to my_domain.com.

Prokázání vlastnictví domény se dělá tak, že na serveru SparkPostu si zaregistrujete doménu, např.my_domain.com. SparkPost Vám následně na emaily postmaster@my_domain.com a abuse@my_domain.com zašle email, pomocí kterého správce domény potvrdí její vlastnictví.

DKIM a SPF záznamy

Pro možnost zvýšení doručitelnosti emailů je doporučováno na doméně např. my_domain.com nastavit DNS záznamy, které Vám SparkPost vygeneruje. Díky těmto záznamům je pak odesílaný email jinak posuzován přijímacími servery a ve většině případů na něj není aplikován filtr pro spam.

DKIM záznam (Domain Keys Identified Mail) pomáhá před zneužitím Vaší domény k rozesílání spamu a zneužívání citlivých údajů (phishing).

SPF záznam (Sender Policy Framework) udržuje seznam všech vlastníků dané domény, kteří mají práva zveřejňovat seznam IP adres autorizovaných pro žžnost odesílání emailů za jejich doménu. Cílem je omezit množství spamu a lepší identifikaci emailu pro rozpoznání spamu a identifikaci odesílatele.

WebHooks

Pro možnost získání informací o tom, ce se s emailem po odeslání stalo, je nutné nastavit WebHooks. WebHooks se nastavít tak, že zadáte url adresu, na kterou SparkPost bude posílat aktuální stavy daného emailu — např. doručen, otevřen, kliknuto na odkaz v emailu, nedoručen z důvodu neexistence příjemce, opoždění, vyhodnocení serverem jako spam, vyhodnocení adresátem jako spam, odhlášení z odběru, apod.

Na tyto události je třeba nastavit odpovídající zpracování a např. vrácené neexistující emaily automaticky odhlásit z odběru emailů pro další rozesílání. Pokud by se na tyto adresy dále rozesílalo, klesalo by procento míry doručení a pokud by se tato hodnota dostala pod určitou hranici, mohl by nás SparkPost vyhodnotit jako Spamera a omezit nám tak množství maximálního počtu odeslaných emailů za den. Např. u Mandrillu se Vám mohlo klidně stát, že jste byli serverem omezeni na rozesílání 40 emailů za hodinu a pokud máte ve frontě např. 1000 emailů, docházelo ke zpoždění odesílání o mnoho hodin.

Implenetace a další problémy

Jelikož jsme již měly dříve udělané rozesílání emailů přes Mandrill, mysleli jsme si, že přenastavíme pár drobností a vše bude fungovat. Naše aplikace je ale trochu komplikovanější a dříve byla vyvíjena čistě jako Java aplikace a následně byla přepisována do Ruby on Rails. Aktuálně je aplikace hybridem těchto řešení a cca 25% je stále ještě v Java. Rozesílání bylo bohužel implementováno v Java a my jsme tak museli celou tuto část přepsat do Ruby on Rails (jsme RoR vývojáři a cílem je zastaralý Java kód postupně nahradit). To nám zabralo další, již velmi omezený čas na přechod na SparkPost.

Nicméně implementace se povedla a vše bylo připraveno k rozesílání emailů přes SparkPost ve stanoveném termínu.

Problémy, na které jsme narazili

U Mandrillu nebylo potřeba registrovat odesílací doménu a tak po ověření emailu mohl klient hned odesílat své kampaně. U SparkPostu je třeba mít ověřen minimálně jeden záznam — vlastnictví domény, DKIP nebo SPF záznam. Čím více, tím lépe. To však způsobilo mnoho našim zákazníkům problémy, jelikož nevěděli, co po nich vlastně žádáme a celému problému většinou vůbec nerozumněli. Registraci domény, jsme díky velké administrativní zátěži navíc, byli nuceni implementovat zcela automaticky a uživateli jsou ihned zobrazeny potřebné kroky, které jsou třeba pro úspěšné rozesílání emailu.

Následně jsme implementovali možnost uživateli vložit vlastní odesílací SparkPost účet, kde vidí další statistiky z jeho kampaní a má tak plný přehled nad svými emaily.

Máte podobný problém? Ozvěte se nám!

Jan Zof, June 1, 2016