Михаил!
Мы взяли готовый сервис — NiftyImages. Со временем хотим перейти на самописный, потому что NiftyImages медленно отдаёт картинки и стоит $250 в месяц.
Чтобы написать свой, мы разобрались, как устроены таймеры в NiftyImages. Таймер — это гифка, которая генерируется при каждом запросе к ней:
Чтобы гифка обновлялась, её отдают с явно выключенным кешированием:
GET https://img1.niftyimages.com/...?dt=...&format=epoch
cache-control: no-cache, no-store
expires: -1
pragma: no-cache
В результате при каждом открытии письма почтовая программа заново запрашивает картинку с таймером, сервис генерирует новую её версию, клиент видит новый счётчик.
Самая большая сложность — производительность. Генерация каждой гифки занимает примерно 350 мс. Если не предусмотреть кеширование и ограничения по количеству одновременных запросов, легко заддосить сервис пачкой параллельных запросов.
P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.