
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 auszuführen – entweder eine neue oder eine vorhandene Maschine
Ein SparkPost-Konto mit API-Schlüsselberechtigung für „Incoming Events: Write“ wie hier beschrieben
Wir richten PowerMTA ein, um Ereignisse an Ihr SparkPost-Konto zu streamen, dann können Sie Folgendes verwenden:
Zusammenfassungsbericht
Bounce Bericht
Accepted Bericht
Delayed Bericht
Zuerst installieren (oder aktualisieren) Sie auf PowerMTA 5.0 r4 oder neuer, indem Sie den üblichen v5.0-Installationsanweisungen folgen, die ziemlich einfach sind. Dann arbeiten wir die folgenden Schritte durch:
Konfigurieren Sie den PowerMTA-Connector zu SparkPost Signals
Richten Sie Engagement Tracking mit einer benutzerdefinierten Tracking-Domain ein
Wählen Sie, welche PowerMTA-Datenströme an Signals gemeldet werden sollen
Testen, ob Ihre Ereignisse bei Signals ankommen
Überprüfen, wie Sie aussagekräftige Namen verwenden, die in Berichten gut sichtbar sind.
Wir werden auch andere spezifische PowerPMTA-Einrichtungsaspekte abdecken, die in unserer Signals-Demo verwendet werden:
FBL-Ereignisse (Spam-Beschwerden) und Remote- (Out-of-Band-) Bounces
Injektionskonfiguration, einschließlich DKIM
FBL- und OOB-Konfiguration
VirtualMTA-Einrichtung und Benennung (und wie dies in Ihren SparkPost Signals-Berichten erscheint)
Schließlich gibt es ein „Bonusfeature“ mit Code, um sicherzustellen, dass Ihre Kampagnennamen mit PowerMTA X-Job-Namenskonventionen kompatibel sind.
Konfigurieren Sie PowerMTA connector
Die Signalkonfiguration wird im 5.0 Benutzerhandbuch Abschnitt 10.1 beschrieben. Hier beginnen wir mit „Use Case #2“, der Signale für den gesamten Traffic von diesem PowerMTA-Host aktiviert und das SparkPost Engagement-Tracking aktiviert.
# # SparkPost Signals # <signals> api-key ##mein Ingest-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 Open- und Click-Tracking in PowerMTA customer-id 123 # Deine SparkPost-Kundennummer hier </signals> enable-signals true
Hier ist, was jedes Attribut bewirkt:
api-key
Dies ist einzigartig für dein SparkPost-Konto, es ist der Wert, den du zuvor von SparkPost erhalten hast.
upload-url
Dies muss mit der Adresse deines SparkPost-API-Dienstes übereinstimmen, egal ob in den USA oder in der EU. Weitere Informationen findest du 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 Direktive ist optional und wenn aktiviert, liefert sie etwas 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, auch wenn kein Traffic vorhanden ist, siehst du:
2019-07-26 11:47:57 Signals: Entdeckte 0 Dateien
Bei Traffic siehst du etwas wie:
2019-07-26 11:50:57 Signals: Entdeckte sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Übertragen von sp1-0000000000003FBD.json erfolgreich. 2019-07-26 11:50:57 Signals: Entdeckte 1 Datei, übertrug 1 Datei erfolgreich
min-free-space
Dies teilt PowerMTA mit, bei welchem Plattenplatzschwellenwert 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 an Signals hochladen soll, in diesem Fall global für allen Traffic (weitere Informationen hier, für v5.0). Du kannst wählerischer sein, welchen Traffic-Stream du hochladen möchtest, wenn du möchtest.
Du kannst auch bestimmte PowerMTA-Datenströme markieren, die als zu einem SparkPost Subkonto gehörend gemeldet werden sollen – das ist eine weitere Möglichkeit, einen bestimmten Datenstrom von einem anderen zu unterscheiden.
engagement-tracking, customer-id
PowerMTAs Engagement-Tracking-Lösung ist standardmäßig auf die Tracking-Domain für den SparkPost US-gehosteten Dienst eingestellt. Du gibst deine SparkPost-Nummernkunden-ID an; hier sind Anleitungen zum Finden.
tracking-domain
Für SparkPost EU-Konten füge die folgende Zeile hinzu:
tracking-domain pmta.eu.spgo.io # dies ist der Endpunkt für SparkPost EU
Individuelle Tracking-Domain
Wenn du lieber deine eigene Tracking-Domain verwenden möchtest (das ist besser aus einer Zustellbarkeits-Perspektive), mache Folgendes:
Erstelle eine Tracking-Domain mit deinem DNS-Anbieter, indem du einen CNAME-Eintrag erstellst. Dies wird normalerweise eine Subdomain deiner Top-Level-Domain sein, z.B. track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io # wenn du ein SparkPost US-Konto hast track.mycompany.com CNAME pmta.eu.spgo.io # wenn du ein SparkPost EU-Konto hast
Du kannst auch HTTPS-Tracking-Domains verwenden, obwohl dies aufwendiger ist (siehe SparkPost-Konfigurationsschritte hier).
Registriere die Tracking-Domain in deinem SparkPost-Konto und verifiziere sie. Warte ein paar Minuten, bevor du versuchst, dies auszuführen, um deinen DNS-Änderungen die Möglichkeit zu geben, sich im Internet zu verbreiten, abhängig von deinem DNS-Anbieter.
Konfiguriere PowerMTA, um diese Domain anstelle der Standard-Domain zu verwenden, mit
tracking-domain yourdomain.com # Gib hier deine eigene Domain an
Du kannst überprüfen, dass deine gesendeten E-Mails „Open Pixels“ hinzugefügt und die Links umwickelt sind, indem du die Interna der Mail ansiehst (in Gmail das Menü oben rechts verwenden und „Original anzeigen“ wählen).

Du wirst Open Pixels am Anfang und Ende des HTML in der E-Mail bemerken. Jeder HTML-Link wird auch geändert, um REF hinzuzufügen, das auf die Tracking-Domain zeigt.

Das ist alles, was du brauchst, um SparkPost Signals mit dem in PowerMTA integrierten Engagement-Tracking zum Laufen zu bringen.
Verhindern, dass spezifische Links in deinem HTML-E-Mail verfolgt werden
Du kannst verhindern, dass PowerMTA spezifische Links verfolgt, indem du das benutzerdefinierte Attribut data-msys-clicktrack auf „0“ setzt: :
<a href="#" data-msys-clicktrack="0">Beispiel</a>
PowerMTA wird den Link nicht umschließen. Es wird dieses Attribut auch entfernen, bevor die Nachricht an deinen Empfänger übermittelt wird.
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 verwenden Port 587 für eingefügte Nachrichten, die über das öffentliche Internet von einem anderen Host kommen. Wir müssen verhindern, dass böswillige Akteure diesen Dienst entdecken und missbrauchen, daher verwenden wir Benutzername/Passwort-Authentifizierung und optional TLS, ähnlich wie bei SparkPost SMTP Injection-Endpoints.
Wir möchten in der Lage sein, Nachrichten von ordnungsgemäß authentifizierten Quellen an jeden beliebigen Zielort zu senden. Außerdem möchten wir einen separaten Listener auf Port 25 für FBL- und Remote-Bounce-Antworten, die keine Authentifizierung erfordern.
# # IP-Adresse(n) und Port(s), auf denen eingehende SMTP-Verbindungen empfangen werden sollen # 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 optional TLS zum Schutz vor unbefugtem Nachrichteneinschleusen. Wir setzen auch Geschwindigkeitsbegrenzungen für Verbindungen, die fehlgeschlagene Passwortversuche unternehmen.
Ihre Konfiguration könnte anders sein; beispielsweise benötigen Sie keine Passwortauthentifizierung, wenn Sie ein privates Netzwerk zwischen Injektor und PowerMTA haben.
# Eine allgemeine Quellregel für alle Injektionen, intern oder extern. Authentifizierung erzwingen, außer für Bounces und FBLs # <source 0/0> log-connections false log-commands false # WARNUNG: ausführlich! nur für die 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 erfolgreich ist default-virtual-mta default process-x-job true </source>
Die <source {auth}>-Deklaration (siehe hier. v5.0) gilt, wenn die Authentifizierung erfolgreich war. Hier wird das Weiterleiten erlaubt, die Standard-virtuelle MTA-Gruppe eingerichtet und der X-Job-Header hinzugefügt (wird von SparkPost Signals als campaign_id gemeldet).
Die Rewrite-Liste ordnet eingefügte Nachrichten zu einer bestimmten MAIL-FROM-Domain (auch bekannt als Bounce-Domain oder Return-Path:) zu.
# # Umschreiben der MAIL FROM-Adresse zur Übereinstimmung mit der Bounce-Domain # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
Dann richten wir unsere TLS-Konfiguration und den SMTP-Benutzernamen / das Passwort gemäß den aktuellen Empfehlungen ein.
# # Sichern 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 über SMTP AUTH) # <smtp-user SMTP_Injection> password ##SETZEN SIE IHR PASSWORT HIER EIN## 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-Testtool, swaks, verwenden.
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
Ebenso für –tls-protocol tlsv1_1.
Lassen Sie uns auch die DKIM-Signierung auf unseren ausgehenden Nachrichten anwenden, da es eine 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 .. erklären wir, welche spezifischen Domains für Remote-Bounce- und FBL-Antworten offen sind. Wir möchten diese nirgendwo weiterleiten (um Backscatter-Angriffe zu verhindern), sondern diese Antworten nur intern verarbeiten.
# # Aktivieren Sie Bounce- und FBL-Verarbeitung auf bestimmten 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, da ich mit der Verwendung/Nichtverwendung der mfrom-Umrewrite-Regel herumgespielt habe.
Die FBL-Domain wird normalerweise dann bei externen Diensten wie Microsoft SNDS registriert; Weitere Informationen finden Sie in diesem Artikel. Für dieses Demo kommen die FBLs aus dem Bouncy Sink, sodass keine Registrierung erforderlich ist.
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.