API? No, můžeme vám posílat CSV na e-mail…

Pokud jste někdy řešili automatizaci procesů, co měly co do činění s bankami či platebními bránami, určitě jste se už setkali s tím, že poté, co vám account kdysi na začátku nasliboval, jak jejich služba je ta nejprogresivnější a technologicky na výši, a nyní jste odeslali dotaz na podporu (mezitím jste desetkrát prošli všechnu dokumentaci, co jste našli, ale nikde nic nenašli), z podpory přijde odpověď, že to slibované API pro napojení vlastně tak úplně neexistuje.

Že jediná možnost, jak dostat výpisy transakcí, je stahování CSVčka (napůl v iso-8859-2, což je možná ta lepší část, z druhé poloviny je totiž ve windows-1250)… které je v ZIPu (zaheslovaném, samozřejmě!, protože bezpečnost)… který vám přijde e-mailem… každý druhý den, někdy jednou týdně, samozřejmě pokaždé v jiný čas.

Když jsem začínal programovat, vždycky jsem se z řešení podobných problémů úplně hroutil. Ale naučil jsem mít rád výzvy.

Jak tedy na to? Potřebujeme e-mailovou schránku, která nějakým způsobem dá vědět naší aplikaci. Pokud máme firemní e-maily např. na GSuite, můžeme si vytvořit nového uživatele, nebo alias, nebo použít existující schránku a tam si vytvořit složku, kde budou e-maily uloženy (dá se na to i nastavit automatický filtr), a poté přes IMAP doručené zprávy stahovat.

Nevýhodou tohoto řešení je, že musíme zprávy periodicky pollovat a aplikace musí mít přístupové údaje ke dané schránce (což pokud použitá adresa slouží nejen pro posílání výpisů, může být bezpečností riziko, pokud by heslo z aplikace uniklo).

Šlo by použít IMAP IDLE extension a mít neustále otevřené spojení na server. Ale podpora klientských knihoven je špatná a máme 99.9 % času zbytečně běžící proces.

Nebo pro Gmail by šly použít notifikace přes Google Cloud Pub/Sub — ty mohou proťuknout např. HTTP endpoint. To už vypadá zajímavěji. Gmail je ale teď pro aplikaci jen zbytečný middleman. Nešlo by se ho zbavit?


A ono šlo. A jako vždy, AWS na to má službu. Amazon Simple Email Service (SES) mimo to, že umí e-maily odesílat, je dokáže i přijímat.

Na subdoménu, např. emailapi.doména.tld, stačí nastavit MX záznam, aby směřoval na SES a poté, když pošlu e-mail na cokoli@emailapi.doména.tld, dostane se zpráva na SMTP SESu. V konzoli jde během pár minut naklikat, že pokud se tam stane, zpráva uloží do S3 a přes SNS se proťukne HTTP endpoint aplikace.

Nemusíme vytvářet nové e-mailové schránky, nemusíme řešit polling. Pro každou službu, kterou takto integrujeme, můžeme mít separátní e-mailovou adresu a podle toho určit, co se má s přijatými zprávami udělat. V objemu, kolik tímto projde měsíčně e-mailů, je to vše zadarmo.


No, a pak už stačí jen rozZIPovat, rozparsovat a projít ta nezdokumentovaná CSVčka 🤦‍