.social

SwissPass

August 2015

Die SBB lancierte im Sommer 2015 ihr neues Produkt "SwissPass". Mit der Maxomedia durfte ich zum einen die Umsetzung des Einführungsmailings und zum anderen den elektronischen Versand der Kunden-Kommunikation betreuen.

msmq

webapi

windows-service

Briefing

Bereits beim Briefing war klar, dass wir hier ein komplettes Toolset für stream-basierenden, automatisierten Mailversand umsetzen werden. Dies hatte vor allem 2 Gründe:

  • Es war bereits klar, dass die SBB noch weitere Versand-Streams anbinden möchte
  • Für die Maxomedia war es eine Möglichkeit, ein Standard-Produkt aufzubauen

Entsprechend viel Zeit wurde also auch in die Bereiche Architektur und Analyse gesteckt, jedoch war auch die Implementierung nicht ohne gewisse Stolpersteine zu meistern.

Lösungsansatz

Der technologische Lösungsansatz basierte auf mehreren Teilkomponenten:

  • Windows Konsolen-Applikationen für die Imports (pro Input-Stream 1 Importer)
  • 2 Windows-Services für die Template-Verarbeitung sowie den E-Mail Versand
  • Ein WebAPI-Projekt für die Reporting-Callbacks des E-Mail Providers
  • Ein MVC-Projekt für die Auswertung der Versand-Daten

Die Kommunikation zwischen den einzelnen Schichten Import, Processing und Versand geschieht über MSMQ (Microsoft Message Queuing). Der Entscheid für MSMQ war ein trivialer: es ist überall bereits vorhanden oder kann einfach nachinstalliert werden und es ist "battle-proven". Die beiden Windows-Services für die Template-Verarbeitung und den Versand wurden mithilfe von TopShelf implementiert, eine Library welche viele komische Eigenheiten des Windows-Service Managements vereinfacht.

Als Versand-Provider entschieden wir uns nach eingehender Evaluation für Mandrill (mittlerweilen integriert in MailChimp), dies vor allem aufgrund der Stabilität und des Pricings.

Zu Reporting-Zwecken wurden in Mandrill sog. WebHooks eingerichtet, welche minütlich alle Events (Mail geöffnet, Link geklickt, Bouncer etc.) im Batch auf einen Endpoint im WebAPI-Projekt schicken. Da dieser Endpoint unter gar keinen Umständen locked sein darf, triggert er lediglich einen Database-Insert und registriert via HangFire einen Background-Job. Dieser Job erledigt die eigentliche Aggregations-Arbeit und verknüpft den eingehenden Mandrill-Event mit dem verschickten Mailing.

Dies ermöglicht es uns, eine E-Mail von Anfang bis Ende nachvollziehen zu können, vom Import bis zum geöffneten Mail oder dem geklickten Link.