Driftsättning av Signals för lokal användning: PowerMTA Integration

Driftsättning av Signals för lokal användning: PowerMTA Integration

Driftsättning av Signals för lokal användning: PowerMTA Integration

Aug 30, 2019

Publicerad av

Publicerad av

Bird

Bird

Kategori:

Kategori:

E-post

E-post

Ready to see Bird
in action?

Ready to see Bird
in action?

Deploying Signals for On-Premises: PowerMTA Integration

Låt oss dyka in i detaljerna för att ställa in PowerMTA för SparkPost-signaler. Du kommer att behöva:

  • En värd att köra den senaste versionen av PowerMTA på - antingen en ny eller en befintlig maskin

  • A SparkPost account with API key permission for “Incoming Events: Write” enligt beskrivningen här

Vi ställer in PowerMTA för att strömma händelser upp till ditt SparkPost-konto, sedan kan du använda följande:

Firstly, install (or upgrade) to PowerMTA 5.0 r4 or later, following the vanliga installationsanvisningar för v5.0 which are pretty straightforward. Then we’ll work through the following steps:

  • Konfigurera PowerMTA kontaktdon to SparkPost Signals

  • Ställ in Engagement Tracking med en anpassad spårningsdomän

  • Välj vilka PowerMTA trafikströmmar som ska rapporteras till Signals

  • Kontrollera att dina händelser når signalerna

  • Gå igenom hur man använder meningsfulla namn som syns bra i rapporteringen.

Vi kommer också att täcka de andra specifika PowerPMTA-installationsaspekterna som används i vår Signals-demo:

  • FBL-händelser (Spam Complaints) och bounces på distans (out-of-band)

  • Injektionskonfiguration, inklusive DKIM

  • FBL- och OOB-konfiguration

  • Inställning och namngivning av VirtualMTA (och hur detta visas i dina SparkPost Signals-rapporter)

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


Configure PowerMTA connector

Den Signals configuration is described in the 5.0 Användarhandbok avsnitt 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-nyckel ##my ingest API key here## uppladdnings-url https://api.sparkpost.com/api/v1/ingest/events logg-verbose true min-fritt utrymme 1G engagement-tracking sparkpost # this turns on the open and click tracking in PowerMTA customer-id 123 # Your SparkPost account number here </signals> aktivera signaler true

Här är vad varje attribut gör:

Api-nyckel

Detta är unikt för ditt SparkPost-konto, det är det värde du fick från SparkPost tidigare.

uppladdnings-url

Detta måste matcha adressen till din SparkPost API-tjänst, oavsett om det är USA eller EU. För mer information se här. De vanliga värdena är:

SparkPost (USA): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events

logg-verbose

Detta direktiv är valfritt och när det är aktiverat ger det lite mer information i pmta.log-filen, vilket kan vara användbart under installationen för att bekräfta att allt fungerar korrekt. Varje minut, även när det inte finns någon trafik, kommer du att se:

2019-07-26 11:47:57 Signaler: Upptäckt 0 filer

Med trafik kommer du att se något i stil med:

2019-07-26 11:50:57 Signaler: Upptäckte sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signaler: Överförd sp1-0000000000003FBD.json framgångsrikt. 2019-07-26 11:50:57 Signaler: Upptäckte 1 fil, överförde 1 fil framgångsrikt

min-fritt utrymme

Detta talar om för PowerMTA vid vilken diskutrymmesgräns den ska börja radera de äldsta SparkPost JSON-händelsefilerna för att göra plats för nya filer när diskutrymmet börjar ta slut.

aktivera signaler

This tells PowerMTA to upload to Signals, in this case globally for all traffic (more info här, 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.

spårning av engagemang, kund-id
PowerMTA’s Engagement Tracking solution defaults till tracking domain for the SparkPost US-hosted service. You specify your SparkPost numeric customer ID; here’s instruktioner för att hitta den.

tracking-domän

För SparkPost EU-konton, lägg till följande rad:

tracking-domain pmta.eu.spgo.io # detta är slutpunkten för SparkPost EU

Anpassad spårningsdomän

Om du föredrar att använda din egen spårningsdomän (detta är bättre ur leveransbarhetssynpunkt) gör du följande:

  • 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 # om du har ett SparkPost US-konto track.mycompany.com CNAME pmta.eu.spgo.io # om du har ett SparkPost EU-konto

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 verifiera det. Wait a few minutes before trying this, to allow your DNS changes to propagate through the Internet, depending on your DNS provider.

  • Konfigurera PowerMTA att använda den domänen istället för standarddomänen, med

tracking-domain yourdomain.com # Lägg till din egen domän här

Du kan kontrollera att dina levererade e-postmeddelanden har "öppna pixlar" tillagda och länkarna inplastade genom att titta på e-postmeddelandets interna filer (i Gmail använder du menyn uppe till höger och väljer "Visa original").


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


Det är allt du behöver för att få SparkPost Signals att fungera med PowerMTA:s inbyggda Engagement Tracking.

Förhindra att specifika länkar i ditt html-e-postmeddelande spåras

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 kommer inte att omsluta länken. Den kommer också att ta bort attributet innan meddelandet skickas till mottagaren.


Välj vilka PowerMTA trafikströmmar som ska rapporteras till Signals

Du kan välja att signalerna ska vara aktiva:

  • Globalt (detta är vad vi använde i exemplet ovan)

  • För vissa virtuella MTA men inte för andra

  • För vissa virtuella MTA-pooler men inte för andra

  • För specifika "Avsändare" eller "Från" adresser som vidarebefordras av PowerMTA, i kombination med Virtual MTA / Virtual MTA pool val

This configuration is very powerful and is illustrated through a series of exempel på användningsfall (v5.0) in the User Guide.


Kontrollera att dina händelser når signalerna

Här är en vy över SparkPost Signals, ansluten till PowerMTA. Du kan se att hälsopoängen varierar.


Kampanjnamnen är tillgängliga som rapporteringsfacetter, tillsammans med Underkonto, IP-pool, Mailbox Provider och Sändningsdomän.

Förutom att titta på PowerMTA -loggar kan du kontrollera att händelsedata når SparkPost genom att titta på skärmen Signals Integration.


In your SparkPost Sök efter evenemang 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.


Använda meningsfulla namn som syns bra i rapporteringen

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 Sammanfattande rapport.

Som tidigare nämnts behöver du inte skapa dessa pooler i ditt SparkPost-konto. SparkPost hämtar dem från din PowerMTA -konfiguration.

Så här översätts PowerMTA konfigurationstermer till SparkPost-termer.

PowerMTA termSparkPost Rapporter / Signaler termRecipient Domain
(domain portion of “rcpt” field in Accounting file).Recipient DomainDen 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 kan dock tagga virtuella MTA:er, virtuella MTA-pooler eller Sender-or-From-domäner med ett underkonto-ID för SparkPost-rapporteringsändamål.

Underkonto ID (nummer)FBL (händelse)Klagomål på spam (händelse)Remote Bounce (händelse)Out-of-Band bounce (händelse)

 

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 Sammanfattande rapport 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 avsnitt 12.8 "Spåra en kampanj i PowerMTA med ett 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 vid end of denna artikel.

FBL-händelser (Spam Complaints) och bounces på distans (out-of-band)

PowerMTA kan ta emot och behandla FBL-händelser (kända i SparkPost som Spam Complaint-händelser) och fjärrbounces (kända i SparkPost som out-of-band bounces, eftersom svaret kommer tillbaka en tid efteråt, snarare än under SMTP-konversationen).

There are articles in the Port25 Stöd Forum on how to set up the Bounce-processor and the FBL-processor. If you are an existing PowerMTA user, you probably already have these.

Här är konfigurationen jag gjorde för en demo, baserad på dessa artiklar och inriktad på att hosta PowerMTA i Amazon EC2.

Om du är bekant med PowerMTA -konfigurationen i det här området kan du hoppa över den här delen, ner till nästa horisontella linje.

Injektionskonfiguration

Vi använder port 587 för injicerade meddelanden, som kommer via det offentliga Internet från en annan värd. Vi måste hindra dåliga aktörer från att upptäcka och missbruka den här tjänsten, så vi tillämpar autentisering med användarnamn/lösenord och valfri TLS, liknande SparkPost SMTP-injektionsslutpunkter.

Vi vill kunna skicka meddelanden från källor som är korrekt autentiserade till alla destinationer. Vi vill också ha en separat lyssnare på port 25 för FBL och bounce-svar på distans som inte kräver autentisering

# # IP-adress(er) och port(ar) där inkommande SMTP-anslutningar ska lyssnas på # 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.

Din installation kan vara annorlunda; om du till exempel har ett privat nätverk mellan injektorn och PowerMTA, behöver du inte lösenordsautentisering.

# 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 (se här. 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).

Omskrivningslistan mappar injicerade meddelanden så att de använder en specifik MAIL FROM-domän (även kallad bounce-domän eller Return-Path:).

# # 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 aktuella rekommendationer.

# # 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, föråldrad) 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

Vi ser:

*** TLS start misslyckades (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS försökte men misslyckades

Likewise for -tls-protokoll tlsv1_1.

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

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


FBL- och 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 angrepp med backscatter), 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 Hoppande handfat, so no need to register.


Testa SMTP-lyssnaren

Det är viktigt att testa att din SMTP-lyssnare kräver auktorisering för alla allmänna destinationer och avvisar alla meddelanden som inte är specifikt adresserade till FBL- och remote-bounce-domänerna.

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

Svaret visar, som väntat, att relaying inte är tillåtet:

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

(Slut på beskrivningen av demoinstallationen).

Installation och namngivning av VirtualMTA

PowerMTA VirtualMTA (och VirtualMTA-pooler) är kraftfulla funktioner för att hantera meddelandeströmmar, och PowerMTA / SparkPost Signals rapporteringsfunktioner fungerar bäst med dessa aktiva.

# # 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).


I sammanfattningsrapporten visas även IP Pool som en rapporteringsfacett för "Gruppera efter".


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 exempel på fullständig konfigurationsfil här.

Innan du går, här är bonusfunktionen som jag nämnde.

Bonusfunktion: Kontroll/filtrering av namn på X-Job

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 Reguljära uttryck i 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))

Givande

_!_#$%&'()*+,-./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, Betalningar & Sales. It's Bird

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

By clicking "See Bird" you agree to Bird's Meddelande om integritet.

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

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

By clicking "See Bird" you agree to Bird's Meddelande om integritet.