
Lassen Sie uns in die Details der Einrichtung von PowerMTA für SparkPost Signals eintauchen.
Lassen Sie uns in die Details der Einrichtung von PowerMTA für SparkPost Signals eintauchen. Sie benötigen:
Einen Host, um die neueste Version von PowerMTA zu betreiben – entweder neu oder eine bestehende Maschine
Ein SparkPost-Konto mit API-Schlüsselberechtigung für „Incoming Events: Write“ wie hier beschrieben
Wir richten PowerMTA so ein, dass Ereignisse an Ihr SparkPost-Konto gestreamt werden, dann können Sie Folgendes nutzen:
Zunächst installieren Sie PowerMTA 5.0 r4 oder höher (oder führen ein Upgrade durch) gemäß den üblichen Installationsanweisungen für v5.0, die recht unkompliziert sind. Dann gehen wir die folgenden Schritte durch:
Konfigurieren Sie den PowerMTA-Connector für SparkPost Signals
Richten Sie das Engagement Tracking mit einem benutzerdefinierten Tracking-Domain ein
Wählen Sie aus, welche PowerMTA-Traffic-Streams an Signals gemeldet werden sollen
Testen Sie, ob Ihre Ereignisse die Signals erreichen
Überprüfen Sie, wie Sie aussagekräftige Namen verwenden, die in Berichten gut sichtbar sind.
Wir behandeln auch die anderen spezifischen PowerPMTA-Setup-Aspekte, die in unserem Signals-Demo verwendet werden:
FBL-Ereignisse (Spam-Beschwerden) und Remote (Out-of-Band) Bounces
Injection-Konfiguration, einschließlich DKIM
FBL- und OOB-Konfiguration
VirtualMTA-Setup und Benennung (und wie dies in Ihren SparkPost Signals-Berichten angezeigt wird)
Abschließend gibt es ein „Bonus-Feature“ mit Code, um sicherzustellen, dass Ihre Kampagnennamen mit den PowerMTA X-Job-Namenskonventionen kompatibel sind.
Konfigurieren Sie PowerMTA connector
Die Konfiguration der Signals wird im 5.0 Benutzerhandbuch Abschnitt 10.1 beschrieben. Hier beginnen wir mit „Use Case #2“, der Signals für den gesamten Verkehr von diesem PowerMTA-Host aktiviert und SparkPost Engagement-Tracking aktiviert.
# # SparkPost Signals # <signals> api-key ##mein Eingabe-API-Schlüssel hier## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # dies aktiviert das Öffnen- und Klicktracking in PowerMTA customer-id 123 # Ihre SparkPost-Kontonummer hier </signals> enable-signals true
Hier ist, was jedes Attribut bewirkt:
api-key
Dies ist einzigartig für Ihr SparkPost-Konto, es ist der Wert, den Sie zuvor von SparkPost erhalten haben.
upload-url
Dies muss mit der Adresse Ihres SparkPost-API-Dienstes übereinstimmen, egal ob es sich um die USA oder die EU handelt. Für weitere Infos siehe hier. Die üblichen Werte sind:
SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events
SparkPost EU: https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
Diese Anweisung ist optional und wenn aktiviert, liefert sie ein wenig mehr Informationen in der pmta.log-Datei, was während der Einrichtung nützlich sein kann, um zu bestätigen, dass alles korrekt funktioniert. Jede Minute, selbst wenn kein Verkehr herrscht, sehen Sie:
2019-07-26 11:47:57 Signals: Es wurden 0 Dateien entdeckt
Mit Verkehr sehen Sie etwas wie:
2019-07-26 11:50:57 Signals: Entdeckt sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Übertragen sp1-0000000000003FBD.json erfolgreich. 2019-07-26 11:50:57 Signals: Entdeckt 1 Datei, 1 Datei erfolgreich übertragen
min-free-space
Dies teilt PowerMTA mit, ab welchem freien Speicherplatzplatz es beginnen soll, die ältesten SparkPost JSON-Ereignisdaten zu löschen, um Platz für neue Dateien zu schaffen, wenn der Speicherplatz knapp wird.
enable-signals
Dies teilt PowerMTA mit, dass es global für den gesamten Verkehr an Signals hochladen soll (mehr Infos hier, für v5.0). Sie können selektiver vorgehen und entscheiden, welche Verkehrsdatenströme hochgeladen werden sollen.
Sie können auch bestimmte PowerMTA-Verkehrsströme als zu einem SparkPost Subkonto zugehörig melden – dies ist eine weitere Möglichkeit, einen bestimmten Datenstrom von einem anderen zu unterscheiden.
engagement-tracking, customer-id
PowerMTAs Engagement-Tracking-Lösung standardisiert auf die Tracking-Domain für den in den USA gehosteten SparkPost-Dienst. Sie geben Ihre SparkPost-Kundennummer an; hier sind Anweisungen zu ihrer Auffindung.
tracking-domain
Für SparkPost EU-Konten, fügen Sie die folgende Zeile hinzu:
tracking-domain pmta.eu.spgo.io # dies ist der Endpunkt für SparkPost EU
Custom Tracking-Domain
Wenn Sie lieber Ihre eigene Tracking-Domain verwenden möchten (dies ist aus Zustellbarkeitsgründen besser), tun Sie Folgendes:
Erstellen Sie eine Tracking-Domain bei Ihrem DNS-Anbieter, indem Sie einen CNAME-Eintrag erstellen. Dies ist normalerweise eine Subdomain Ihrer obersten Domain, z.B. track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io # falls Sie ein SparkPost US-Konto haben track.mycompany.com CNAME pmta.eu.spgo.io # falls Sie ein SparkPost EU-Konto haben
Sie können auch HTTPS-Tracking-Domains verwenden, obwohl dies aufwendiger ist (siehe die Konfigurationsschritte von SparkPost hier).
Registrieren Sie die Tracking-Domain in Ihrem SparkPost-Konto und verifizieren Sie sie. Warten Sie ein paar Minuten, bevor Sie dies versuchen, um Ihren DNS-Änderungen Zeit zu geben, sich im Internet zu verbreiten, abhängig von Ihrem DNS-Anbieter.
Konfigurieren Sie PowerMTA, um diese Domain anstelle der Standarddomain zu verwenden, mit
tracking-domain yourdomain.com # Setzen Sie hier Ihre eigene Domain ein
Sie können überprüfen, ob Ihre gesendeten E-Mails „Open-Pixels“ hinzugefügt haben und die Links umwickelt sind, indem Sie sich die internen Daten der Mail ansehen (in Gmail, verwenden Sie das Menü rechts oben und wählen Sie „Original anzeigen“).

Sie werden die Open-Pixels am Anfang und Ende des HTMLs in der E-Mail bemerken. Jedes HTML-Link wird ebenfalls geändert, um REF auf die Tracking-Domain zu zeigen.

Das ist alles, was Sie brauchen, um SparkPost-Signals mit PowerMTAs eingebauten Engagement-Tracking zum Laufen zu bringen.
Verhindern, dass bestimmte Links in Ihrer HTML-E-Mail getrackt werden
Sie können verhindern, dass PowerMTA bestimmte Links trackt, indem Sie das benutzerdefinierte Attribut data-msys-clicktrack auf „0“ setzen:
<a href="#" data-msys-clicktrack="0">Beispiel</a>
PowerMTA wird den Link nicht umwickeln. Es wird auch dieses Attribut vor der Übermittlung der Nachricht an Ihren Empfänger entfernen.
Wählen Sie aus, welche PowerMTA Traffic-Streams an Signals gemeldet werden sollen
Testen, ob Ihre Events Signals erreichen
Hier ist eine Ansicht von SparkPost Signals, verbunden mit PowerMTA. Sie können sehen, dass der Gesundheitswert variiert.

Die Kampagnennamen sind als Berichtsfacetten verfügbar, zusammen mit Subaccount, IP-Pool, Mailbox Provider und sendender Domain.
Zusätzlich zum Betrachten der PowerMTA-Protokolle können Sie überprüfen, ob die Ereignisdaten SparkPost erreichen, indem Sie sich den Signals-Integrationsbildschirm ansehen.

Auf Ihrem SparkPost-Events-Suchbildschirm sollten Sie innerhalb weniger Minuten Ereignisse sehen. Diese werden Injektion und Zustellereignisse beinhalten, ebenso wie Bounces und möglicherweise Out-of-Band-Bounces und Spam-Beschwerdeereignisse, falls Sie PowerMTA bereits dafür konfiguriert haben.
Wenn Sie das Engagement-Tracking aktiviert haben, werden Sie auch open, initial_open und click Ereignisse sehen.
Verwendung aussagekräftiger Namen, die in Berichten gut angezeigt werden
Die Einrichtung der PowerMTA VirtualMTA Pool-Namen und Job-Namen so, dass sie sinnvoll und menschlich lesbar sind, lohnt sich. Diese erscheinen direkt in Ihren SparkPost Signals-Facetten und im Zusammenfassungsbericht.
Wie bereits erwähnt, müssen Sie diese Pools nicht in Ihrem SparkPost-Konto erstellen. SparkPost übernimmt sie aus Ihrer PowerMTA-Konfiguration.
Hier ist, wie PowerMTA-Konfigurationsbegriffe in SparkPost-Begriffe übersetzt werden.
PowerMTA BegriffSparkPost Reports / Signals BegriffEmpfänger-Domain
(Domainanteil des „rcpt“-Felds in der Buchhaltungsdatei).Empfänger-DomainDer Domainanteil des „Sender-“ oder „From“-Headers in der Nachricht, die von PowerMTA weitergeleitet wird.
(Domainanteil von „orig“ in der Buchhaltungsdatei).Sende-DomainVirtualMTA (Name) — VirtualMTA Pool (Name)
(„vmtaPool“ in der Buchhaltungsdatei)IP Pool (Name)smtp-source-host a.b.c.d
(„dlvSourceIp“ in der Buchhaltungsdatei)Sendende IP a.b.c.dJob (Name)
(„jobId“ in der Buchhaltungsdatei)Kampagnen-ID (Name) — Vorlage (Name)„Subaccount“ ist kein nativer PowerMTA-Begriff.
PowerMTA kann jedoch VirtualMTAs, Virtual MTA Pools oder Sender- oder Absender-Domains mit einer Subaccount-ID zwecks SparkPost-Berichterstellung taggen.
Subaccount-ID (Nummer)FBL (Ereignis)Spam-Beschwerde (Ereignis)Externe Bounce (Ereignis)Out-of-Band Bounce (Ereignis)
Die Einrichtung von mindestens einer smtp-source-host-Adresse ermöglicht es auch SparkPost, die sendende IP-Adresse korrekt zu identifizieren, sodass sie bei Injection- und Delivery-Ereignissen sowie in der Übersicht angezeigt wird.
Job-Namen werden in PowerMTA über einen Header in der injizierten Nachricht gesetzt. Ebenso wie die Ermöglichung der individuellen Steuerung von Jobs (Pause/Fortsetzen usw.), was an sich nützlich ist, überträgt PowerMTA die Namen an SparkPost Signals-Berichterstattung als „Kampagnen-ID“. Siehe Benutzerhandbuch v5.0 Abschnitt 12.8 „Verfolgen einer Kampagne in PowerMTA mit einer JobID“.
Es gibt einige Dinge zu beachten, was die Benennung von Jobs betrifft. Während SparkPost (mit JSON-Format und JSON-Escaping) Zeichen wie <SPACE> in Kampagnennamen erlaubt, sind Mail-Header restriktiver. Zulässige Zeichen im X-Job-Header sind:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
Mit anderen Worten, unzulässige Zeichen umfassen <SPACE>, Anführungszeichen „ und Backtick `. Wenn Sie es gewohnt sind, mit X-Job-Namen zu arbeiten, wird dies nicht überraschend sein, und Ihre Kampagnen-ID-Namen werden „einfach funktionieren“ bei SparkPost-Berichterstattung. Wenn Sie wie ich zuerst SparkPost gelernt haben, möchten Sie möglicherweise ein Tool, um sicherzustellen, dass Ihre X-Job-Werte sicher sind; siehe das Bonus-Feature am Ende dieses Artikels.
FBL-Ereignisse (Spam Complaints) und externe (out-of-band) Bounces
PowerMTA kann FBL-Ereignisse (bei SparkPost als Spam-Beschwerden bekannt) und Remote-Bounces (bei SparkPost als Out-of-Band-Bounces bekannt, da die Antwort erst einige Zeit später zurückkommt und nicht während der SMTP-Konversation) empfangen und verarbeiten.
Es gibt Artikel im Port25-Support-Forum, wie man den Bounce-Processor und den FBL-Processor einrichtet. Wenn Sie ein bestehender PowerMTA-Benutzer sind, haben Sie diese wahrscheinlich bereits.
Hier ist die Konfiguration, die ich für eine Demo gemacht habe, basierend auf diesen Artikeln und ausgerichtet auf das Hosting von PowerMTA in Amazon EC2.
Wenn Sie mit der Konfiguration von PowerMTA in diesem Bereich vertraut sind, können Sie diesen Teil überspringen und zur nächsten horizontalen Linie gehen.
Injection-Konfiguration
Wir werden Port 587 für eingehende Nachrichten nutzen, die über das öffentliche Internet von einem anderen Host kommen. Wir müssen verhindern, dass schlechte Akteure diesen Dienst entdecken und missbrauchen, daher verwenden wir Benutzername/Passwort-Authentifizierung und optionales TLS, ähnlich wie bei SparkPost SMTP-Injection-Endpunkten.
Wir wollen in der Lage sein, Nachrichten von Quellen zu senden, die ordnungsgemäß authentifiziert sind, an beliebige Ziele. Außerdem möchten wir einen separaten Listener auf Port 25 für FBL und Remote-Rückläuferantworten, die keine Authentifizierung erfordern.
# # IP-Adresse(n) und Port(s), auf denen für eingehende SMTP-Verbindungen gelauscht wird # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
In den folgenden <source> Deklarationen verwenden wir Benutzername/Passwort-Authentifizierung und optionales TLS, um gegen Nachrichteninjektion zu schützen. Wir setzen auch Grenzwerte für Verbindungen, die fehlerhafte Passwortversuche machen.
Ihr Setup könnte anders sein; wenn Sie beispielsweise ein privates Netzwerk zwischen Injector und PowerMTA haben, benötigen Sie keine Passwortauthentifizierung.
# Eine Quelldeklaration für alle Injektionen, intern oder extern. Erzwinge Authentifizierung, außer für Rückläufer und FBLs # <source 0/0> log-connections false log-commands false # WARNUNG: ausführlich! nur für Entwicklung log-data false # WARNUNG: noch ausführlicher! smtp-service true # SMTP-Dienst erlauben smtp-max-auth-failure-rate 1/min allow-unencrypted-plain-auth false allow-starttls true rewrite-list mfrom </source> <source {auth}> always-allow-relaying yes # nur wenn die Authentifizierung gelingt default-virtual-mta default process-x-job true </source>
Die <source {auth}> Deklaration (siehe hier. v5.0) gilt, sobald die Authentifizierung bestanden ist. Hier erlaubt sie die Weiterleitung, richtet die Standard-virtuelle MTA-Gruppe ein und fügt den X-Job-Header hinzu (der von SparkPost Signals als campaign_id gemeldet wird).
Die rewrite-list ordnet injizierte Nachrichten einer bestimmten MAIL FROM-Domain zu (auch als Bounce-Domain oder Return-Path: bekannt).
# # Rewrite der MAIL FROM-Adresse, um zur Bounce-Domain zu passen # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
Dann richten wir unsere TLS-Konfiguration und SMTP-Benutzername / Passwort gemäß den aktuellen Empfehlungen ein.
# # Sicherung des eingehenden Dienstes mit Benutzername, Passwort und TLS. SMT 2020-06-15 # smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem smtp-server-tls-allow-tlsv1 false smtp-server-tls-allow-tlsv1.1 false smtp-server-tls-allow-tlsv1.2 true smtp-server-tls-allow-tlsv1.3 true # # SMTP-Benutzer (authentifiziert via SMTP AUTH) # <smtp-user SMTP_Injection> password ##PASSWORT HIER EINTRAGEN## authentication-method password </smtp-user>
Wir können überprüfen, dass das (unsichere, veraltete) TLS v1.0 nicht akzeptiert wird, indem wir mein bevorzugtes SMTP-Testwerkzeug verwenden, swaks.
swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1
Wir sehen:
*** TLS-Start fehlgeschlagen (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS versucht, aber fehlgeschlagen
Ebenfalls für –tls-protocol tlsv1_1.
Lassen Sie uns auch die DKIM-Signatur auf unseren ausgehenden Nachrichten anwenden, da es gute Praxis ist (ich habe diese Anweisungen befolgt, um den Schlüssel einzurichten).
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
FBL und OOB-Konfiguration
Jetzt ... endlich ... geben wir an, welche spezifischen Domains für Remote-Bounce- und FBL-Antworten offen sind. Wir wollen diese nicht irgendwo weiterleiten (um Backscatter-Angriffe zu verhindern), sondern diese Antworten nur intern verarbeiten.
# # Aktivieren Sie die Bounce- und FBL-Verarbeitung auf spezifischen Domains # relay-domain pmta.signalsdemo.trymsys.net relay-domain bounces.pmta.signalsdemo.trymsys.net relay-domain fbl.pmta.signalsdemo.trymsys.net <bounce-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain pmta.signalsdemo.trymsys.net domain bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain fbl.pmta.signalsdemo.trymsys.net </address-list> </feedback-loop-processor>
Sie können sehen, dass ich zwei Bounce-Domains eingerichtet habe, während ich mit der Verwendung/nicht Verwendung der mfrom Umschreiberegel herumgespielt habe.
Die FBL-Domain wird normalerweise dann bei externen Diensten wie Microsoft SNDS registriert; siehe diesen Artikel für weitere Informationen. Für dieses Demo werden die FBLs vom Bouncy Sink kommen, daher ist keine Registrierung erforderlich.
Testen des SMTP-Listeners
Es ist wichtig zu testen, dass Ihr SMTP-Listener eine Autorisierung für allgemeine Ziele benötigt und alle Nachrichten ablehnt, die nicht speziell an die FBL- und Remote-Bounce-Domains adressiert sind.
swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com
Die erwartete Antwort zeigt, dass das Relaying verweigert wird:
550 5.7.1 Relaying verweigert für Empfänger in "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>
(Ende der Demo-Einrichtungsbeschreibung).
VirtualMTA Einrichtung und Benennung
PowerMTA VirtualMTAs (und VirtualMTA-Pools) sind leistungsstarke Funktionen zur Verwaltung von Nachrichtenströmen, und die Berichtsfunktionen von PowerMTA / SparkPost Signals funktionieren am besten, wenn diese aktiv sind.
# # Routen Sie den gesamten ausgehenden Verkehr über diesen virtuellen MTA / Pool. # Geben Sie hier die Zustell-IP-Adresse an, damit SparkPost-Signale Injection- („Empfangs“-)Ereignisse richtig verarbeiten, # indem sie das richtige sending_IP-Attribut enthalten # <virtual-mta mta1> smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net </virtual-mta> <virtual-mta-pool default> virtual-mta mta1 <domain *> max-smtp-out 20 # max. Verbindungen *pro Domain* bounce-after 4d12h # 4 Tage, 12 Stunden retry-after 10m # 10 Minuten dkim-sign ja </domain> </virtual-mta-pool>
Die virtual-mta-pool-Einstellung wird in SparkPost als „IP-Pool“ gemeldet und steht als Berichtsfunktion von SparkPost Signals zur Verfügung (das Dropdown-Menü unterhalb der Diagramme).

Der Zusammenfassungsbericht zeigt ebenfalls IP-Pool als „Gruppieren nach“-Berichtsfunktion.

Wie bereits in diesem Artikel erwähnt, ermöglicht die Einrichtung von mindestens einer smtp-source-host-Adresse auch, dass SparkPost die sendende IP-Adresse korrekt identifiziert, sodass sie bei Injection- und Zustellereignissen sowie im Zusammenfassungsbericht angezeigt wird:

Das ist alles, was Sie benötigen, um eine grundlegende Integration zwischen PowerMTA und SparkPost Signals zum Laufen zu bringen. Sie finden das vollständige Konfigurationsbeispiel hier.
Bevor Sie gehen, hier ist das Bonus-Feature, das ich erwähnt habe.
Bonusfunktion: X-Job Namensprüfung/-filterung
Um sicherzustellen, dass jede Zeichenfolge als PowerMTA X-Job-Name sicher ist, hier eine einfache Python-Funktion, um unsichere Zeichen in einen Unterstrich „_“ umzuwandeln
import re def pmtaSafeJobID(s): """ :param s: str :return: str Mapping einer beliebigen Kampagnen-ID-Zeichenfolge zu zulässigen Zeichen für die PMTA X-Job-Header. Siehe https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Speziell werden <sp> " ` nicht zugelassen, aber die meisten anderen Zeichen sind erlaubt. """ # Beachten Sie, dass - [ ] - und \ doppelt maskiert werden müssen - siehe https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]' return re.sub(disallowedChars, '_', s)
Dies verwendet Python-Reguläre Ausdrücke auf eine spezifische Weise. Es deklariert die Menge der nicht zulässigen Zeichen unter Verwendung des „Set-Komplement“-Operators ^ anstatt alle zulässigen Zeichen aufzulisten. Das bedeutet, dass wir Zeichen über den üblichen 7-Bit-Satz hinaus erfassen (und sicher machen). Wir können das mit diesem Testfragment zeigen:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
Ergibt
_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________
Sie können sehen, dass <SPACE>, doppelte Anführungszeichen „, und Backtick ` sowie alle Zeichen über ~ in einen Unterstrich umgewandelt werden.