Bereitstellung von Signals für On-Premises: PowerMTA Integration

Bereitstellung von Signals für On-Premises: PowerMTA Integration

Bereitstellung von Signals für On-Premises: PowerMTA Integration

Aug 30, 2019

Herausgegeben von

Herausgegeben von

Bird

Bird

-

Kategorie:

Kategorie:

E-Mail

E-Mail

Ready to see Bird
in action?

Ready to see Bird
in action?

Deploying Signals for On-Premises: PowerMTA Integration

Lassen Sie uns in die Details der Einrichtung von PowerMTA für SparkPost-Signale eintauchen. Sie benötigen:

  • Ein Host, auf dem die neueste Version von PowerMTA läuft - entweder ein neuer oder ein bereits vorhandener Rechner

  • A SparkPost account with API key permission for “Incoming Events: Write” wie hier beschrieben

Wir richten PowerMTA ein, um Ereignisse auf Ihr SparkPost-Konto zu streamen, dann können Sie Folgendes nutzen:

Firstly, install (or upgrade) to PowerMTA 5.0 r4 or later, following the die üblichen v5.0-Installationsanweisungen which are pretty straightforward. Then we’ll work through the following steps:

  • Konfigurieren Sie den PowerMTA Anschluss to SparkPost-Signale

  • Einrichten von Engagement Tracking mit einer benutzerdefinierten Tracking-Domain

  • Wählen Sie, welche PowerMTA Verkehrsströme an Signals gemeldet werden sollen.

  • Testen, ob Ihre Ereignisse die Signale erreichen

  • Überprüfen Sie, wie Sie aussagekräftige Namen verwenden, die in Berichten gut dargestellt werden.

Wir werden auch die anderen spezifischen Aspekte der PowerPMTA-Einrichtung behandeln, die in unserer Signals-Demo verwendet werden:

  • FBL-Ereignisse (Spam-Beschwerden) und Remote (Out-of-Band) Bounces

  • Konfiguration der Injektion, einschließlich DKIM

  • FBL- und OOB-Konfiguration

  • Einrichtung und Benennung von VirtualMTA (und wie dies in Ihren SparkPost-Signalberichten erscheint)

Finally, there’s a “bonus feature” with code to ensure your campaign names are compatible with PowerMTA X-Job  name conventions.


Configure PowerMTA connector

Die Signals configuration is described in the 5.0 Benutzerhandbuch Abschnitt 10.1. Here we’ll start with “Use Case #2”, which enables Signals for all traffic from this PowerMTA host, and enable SparkPost engagement tracking.

# # SparkPost Signals # <signals> api-key ##my ingest API key here## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true Minimalfreiraum 1G engagement-tracking sparkpost # this turns on the open and click tracking in PowerMTA customer-id 123 # Your SparkPost account number here </signals> Freigabesignale true

Die Funktionen der einzelnen Attribute sind wie folgt:

api-key

Dieser Wert ist einzigartig für Ihr SparkPost-Konto, es ist der Wert, den Sie zuvor von SparkPost erhalten haben.

upload-url

Diese muss mit der Adresse Ihres SparkPost-API-Dienstes übereinstimmen, unabhängig davon, ob es sich um die USA oder die EU handelt. Für weitere Informationen 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 Direktive ist optional und liefert, wenn sie aktiviert ist, etwas mehr Informationen in der Datei pmta.log, was während der Einrichtung nützlich sein kann, um zu bestätigen, dass alles korrekt funktioniert. Jede Minute, auch wenn es keinen Verkehr gibt, werden Sie sehen:

2019-07-26 11:47:57 Signale: Entdeckte 0 Dateien

Beim Verkehr werden Sie etwas sehen wie:

2019-07-26 11:50:57 Signale: Entdeckt sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signale: Übertragen sp1-0000000000003FBD.json erfolgreich. 2019-07-26 11:50:57 Signals: 1 Datei entdeckt, 1 Datei erfolgreich übertragen

Minimalfreiraum

Dies teilt PowerMTA den Schwellenwert für den Festplattenspeicher mit, ab dem die ältesten SparkPost-JSON-Ereignisdateien gelöscht werden sollen, um Platz für neue Dateien zu schaffen, wenn der Festplattenspeicher knapp wird.

Freigabesignale

This tells PowerMTA to upload to Signals, in this case globally for all traffic (more info hier, für v5.0). You can be more selective about what traffic streams to upload if you wish.

You can also mark particular PowerMTA traffic to be reported as belonging to a SparkPost subaccount – this is another way to distinguish one particular traffic stream from another.

engagement-tracking, kunden-id
PowerMTA’s Engagement Tracking solution defaults zum tracking domain for the SparkPost US-hosted service. You specify your SparkPost numeric customer ID; here’s Hinweise zum Auffinden.

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

Benutzerdefinierte Tracking-Domäne

Wenn Sie lieber Ihre eigene Tracking-Domain verwenden möchten (dies ist aus Sicht der Zustellbarkeit besser), gehen Sie wie folgt vor:

  • Create tracking domain with your DNS provider by creating a CNAME record. This will usually be a subdomain of your top-level domain, e.g. track.mycompany.com .

track.mycompany.com CNAME pmta.spgo.io # wenn Sie ein SparkPost US-Konto haben track.mycompany.com CNAME pmta.eu.spgo.io # wenn Sie ein SparkPost EU-Konto haben

You can also use HTTPS tracking domains, although this is more involved (see SparkPost configuration steps here).

  • Register tracking domain in your SparkPost account, and es überprüfen. Wait a few minutes before trying this, to allow your DNS changes to propagate through the Internet, depending on your DNS provider.

  • Konfigurieren Sie PowerMTA so, dass diese Domäne anstelle der Standarddomäne verwendet wird, mit

tracking-domain yourdomain.com # Geben Sie hier Ihre eigene Domain ein

Sie können überprüfen, ob Ihre zugestellten E-Mails mit "Öffnungspixeln" versehen und die Links umbrochen wurden, indem Sie sich die Interna der E-Mail ansehen (in Google Mail verwenden Sie das Menü oben rechts und wählen "Original anzeigen").


You’ll notice the open pixels am beginning and end of the HTML in the email. Each HTML link is also changed to have REF  pointing zum tracking domain.


Das ist alles, was Sie brauchen, um SparkPost-Signale mit dem integrierten Engagement Tracking von PowerMTAzu verwenden.

Verhindern, dass bestimmte Links in Ihrer Html-E-Mail nachverfolgt werden

You can prevent PowerMTA from tracking specific links, by setting the custom attribute data-msys-clicktrack  to “0”  :

<a href="#" data-msys-clicktrack="0">Example</a>

PowerMTA wird der Link nicht umbrochen. Außerdem wird dieses Attribut vor der Übermittlung der Nachricht an den Empfänger entfernt.


Wählen Sie, welche PowerMTA Verkehrsströme an Signals gemeldet werden sollen.

Sie können Signale auswählen, die aktiv sein sollen:

  • Global (dies wurde im obigen Beispiel verwendet)

  • Für einige virtuelle MTAs und nicht für andere

  • Für einige virtuelle MTA-Pools und nicht für andere

  • Für bestimmte "Absender"- oder "Von"-Adressen, die von PowerMTA weitergegeben werden, in Kombination mit der Auswahl von Virtual MTA / Virtual MTA Pool

This configuration is very powerful and is illustrated through a series of Beispiele für Anwendungsfälle (v5.0) in the User Guide.


Testen, ob Ihre Ereignisse die Signale erreichen

Hier ist eine Ansicht von SparkPost Signals, die mit PowerMTA verbunden ist. Sie können sehen, dass der Gesundheitszustand variiert.


Die Namen der Kampagnen sind als Berichtsfacetten verfügbar, zusammen mit Unterkonto, IP-Pool, Postfachanbieter und Versanddomäne.

Sie können nicht nur die Protokolle von PowerMTA einsehen, sondern auch überprüfen, ob die Ereignisdaten SparkPost erreichen, indem Sie den Bildschirm "Integration von Signalen" aufrufen.


In your SparkPost Ereignisse suchen screen, you should see events appear within a few minutes. These will include Injection and Delivery events, as well as Bounce, and potentially Out-of-Band Bounce and Spam Complaint events, if you’ve already configured PowerMTA to handle those for you.
If you have Engagement Tracking enabled, you will also see open , initial_open , and click  events.


Verwendung aussagekräftiger Namen, die in den Berichten gut auftauchen

Setting up the PowerMTA VirtualMTA Pool names and Job names to be meaningful and human-readable is well worth doing. These show up directly in your SparkPost Signals facets and the Zusammenfassender Bericht.

Wie bereits erwähnt, müssen Sie diese Pools nicht in Ihrem SparkPost-Konto erstellen. SparkPost übernimmt sie aus Ihrer PowerMTA Konfiguration.

Hier sehen Sie, wie PowerMTA Konfigurationsbegriffe in SparkPost-Begriffe übersetzt werden.

PowerMTA termSparkPost Berichte / Signale termRecipient Domain
(domain portion of “rcpt” field in Accounting file).Recipient DomainDie domain portion of the “Sender” or “From” header in the message relayed by PowerMTA.
(domain portion of “orig” in Accounting file).Sending DomainVirtualMTA (name)—VirtualMTA Pool (name)
(“vmtaPool” in accounting file)IP Pool (name)smtp-source-host a.b.c.d
(“dlvSourceIp” in accounting file)Sending IP a.b.c.dJob (name)
(“jobId” in accounting file)Campaign ID (name)—Template (name)“Subaccount” is not a native PowerMTA concept.


PowerMTA kann jedoch virtuelle MTAs, virtuelle MTA-Pools oder Sender-or-From-Domänen mit einer Subaccount-ID für SparkPost-Berichtszwecke kennzeichnen.

Unterkonto-ID (Nummer)FBL (Ereignis)Spam-Beschwerde (Ereignis)Remote Bounce (Ereignis)Out-of-Band bounce (Ereignis)

 

Setting up at least one smtp-source-host  address also enables SparkPost to correctly identify the sending IP address so that it shows up on Injection and Delivery events, as well as in the Zusammenfassender Bericht view.

Job names are set in PowerMTA via a header in the injected message. As well as enabling individual job control (pause/resume etc) which is useful in itself, PowerMTA passes the names through to SparkPost Signals reporting as “campaign ID”. See User Guide v5.0 Abschnitt 12.8 "Verfolgung einer Kampagne in PowerMTA mit einer JobID".

There are a few things to be aware of regarding job naming. While SparkPost (with JSON format, and JSON escaping) allows characters such as <SPACE>  in campaign names, mail headers are more restrictive. Valid characters allowed in the X-Job  header are:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

In other words, disallowed characters include <SPACE>, double-quotes “  and backtick `. If you’re used to working with X-Job names, this won’t be surprising, and your campaign ID names will “just work” on SparkPost reporting. If like me, you learned SparkPost first, you might want a tool to ensure your X-Job values are safe; see the bonus feature am end of dieser Artikel.

FBL-Ereignisse (Spam-Beschwerden) und Remote (Out-of-Band) Bounces

PowerMTA kann FBL-Ereignisse (in SparkPost als Spam-Beschwerde-Ereignisse bekannt) und Remote Bounces (in SparkPost als Out-of-Band Bounces bekannt, da die Antwort einige Zeit später zurückkommt und nicht während der SMTP-Konversation) empfangen und verarbeiten.

There are articles in the Port25 Unterstützung Forum on how to set up the Bounce-Prozessor and the FBL-Prozessor. If you are an existing PowerMTA user, you probably already have these.

Hier ist die Konfiguration, die ich für eine Demo erstellt 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 bis zur nächsten horizontalen Linie gehen.

Konfiguration der Einspritzung

Wir verwenden Port 587 für injizierte 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 eine Benutzername/Passwort-Authentifizierung und optionales TLS, ähnlich wie bei SparkPost SMTP-Injection-Endpunkten.

Wir möchten in der Lage sein, Nachrichten von Quellen, die ordnungsgemäß authentifiziert sind, an jedes Ziel zu senden. Wir wollen auch einen separaten Listener an Port 25 für FBL und Remote Bounce-Antworten, die keine Authentifizierung erfordern

# IP-Adresse(n) und Port(s), auf denen eingehende SMTP-Verbindungen überwacht werden sollen # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25

In the following <source>  declarations, we’re using username/password authentication and optional TLS to defend against rogue message injection. We also set rate limits on connections making failed password attempts.

Wenn Sie beispielsweise ein privates Netzwerk zwischen Injektor und PowerMTA haben, benötigen Sie keine Kennwortauthentifizierung.

# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs # <source 0/0> log-connections false log-commands false # WARNING: verbose! just for dev log-data false # WARNING: even more verbose! smtp-service true # allow SMTP service 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 # only if the auth succeeds default-virtual-mta default process-x-job true </source>

The <source {auth}>  declaration (siehe hier. v5.0) applies once authentication has passed. Here, it allows onward relaying, sets up the default virtual MTA group to use, and adds the X-Job header (which will be reported by SparkPost Signals as campaign_id).

Die Rewrite-Liste ordnet injizierte Nachrichten einer bestimmten MAIL FROM-Domäne zu (auch Bounce-Domäne oder Return-Path: genannt).

# # Rewrite the MAIL FROM address to match the bounce domain # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>

Then we set up our TLS-Konfiguration and SMTP username / password, according to aktuelle Empfehlungen.

# # Secure the inbound service with username, password and 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 users (authenticated via SMTP AUTH) # <smtp-user SMTP_Injection> password ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>

We can check that the (insecure, Abgelehnt) TLS v1.0 is not accepted using my favorite SMTP test tool,  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 wurde versucht, schlug aber fehl

Likewise for -tls-Protokoll tlsv1_1.

Let’s also apply DKIM signing on our outgoing messages, as it’s good practice (I followed diese Anleitungen to set up the key).

# DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem


FBL- und OOB-Konfiguration

Now .. finally .. we declare which specific domains are open for remote bounce and FBL responses. We don’t want to relay those anywhere (to prevent Backscatter-Angriffe), just internally process those responses.

# # Enable Bounce and FBL processing on specific 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>

You can see I set up two bounce domains, as I was playing around with using/not using the mfrom  rewrite rule.

The FBL domain is usually then registered with external services such as Microsoft SNDS; see this article for more information. For this demo, the FBLs will be coming from the Hüpfende Spüle, so no need to register.


Testen des SMTP-Listeners

Es ist wichtig zu testen, dass Ihr SMTP-Listener eine Autorisierung für alle allgemeinen Ziele verlangt und alle Nachrichten zurückweist, die nicht speziell an die FBL- und Remote-Bounce-Domänen gerichtet sind.

swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com

Die Antwort zeigt wie erwartet, dass die Weiterleitung verweigert wird:

550 5.7.1 relaying denied for recipient in "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>

(Ende der Beschreibung des Demo-Setups).

Einrichtung und Benennung von VirtualMTA

PowerMTA VirtualMTAs (und VirtualMTA-Pools) sind leistungsstarke Funktionen für die Verwaltung von Nachrichtenströmen, und die Berichtsfunktionen von PowerMTA / SparkPost Signals funktionieren am besten mit diesen aktiven Funktionen.

# # Route all outgoing traffic through this virtual mta / pool. # Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events # will carry the correct sending_IP attribute # <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. connections *per domain*         bounce-after    4d12h    # 4 days, 12 hours         retry-after     10m      # 10 minutes         dkim-sign       yes     </domain> </virtual-mta-pool>

The virtual-mta-pool  setting is reported in SparkPost as “IP Pool”, and is available as a SparkPost Signals reporting facet (the drop-down menu underneath the charts).


Der Zusammenfassungsbericht zeigt auch den IP-Pool als Berichtsfacette "Gruppieren nach".


As noted earlier in this article, setting up at least one  smtp-source-host address also enables SparkPost to correctly identify the sending IP address, so that it shows up on Injection and Delivery events, and on the Summary Report:


That’s all you need to get a basic integration working between PowerMTA and SparkPost Signals. You’ll find the vollständiges Beispiel der Konfigurationsdatei hier.

Bevor Sie gehen, hier noch das erwähnte Bonus-Feature.

Bonusfunktion: Überprüfung/Filterung von X-Job-Namen

To ensure any character string is safe for use as a PowerMTA X-Job  name, here’s a simple Python function to map any unsafe characters to an underscore “_”

import re def pmtaSafeJobID(s):    """    :param s: str    :return: str    Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header.    See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid    Specifically disallow <sp> " ` but allow through most other chars.    """    # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]'    return re.sub(disallowedChars, '_', s)

This uses Reguläre Ausdrücke in Python in a specific way. It declares the set of disallowed characters using the “set complement” operator ^ rather than list all allowed chars. That means we catch (and make safe) characters beyond the usual 7-bit set. We can show that using this test fragment:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Geben Sie

_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________

You can see that <SPACE>, double-quotes “, and backtick `, as well as all characters beyond ~ are mapped to underscore.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> to the right person -> at the right time.

By clicking "See Bird" you agree to Bird's Hinweis zum Datenschutz.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> to the right person -> at the right time.

By clicking "See Bird" you agree to Bird's Hinweis zum Datenschutz.