
Laten we ons verdiepen in de details van het instellen van PowerMTA voor SparkPost Signals.
Laten we ingaan op de details van het opzetten van PowerMTA voor SparkPost Signals. Je hebt het volgende nodig:
Een host om de nieuwste versie van PowerMTA op te draaien - ofwel nieuw, of op een bestaande machine
Een SparkPost-account met API-sleuteltoestemming voor "Incoming Events: Write" zoals hier beschreven
We zullen PowerMTA instellen om gebeurtenissen naar je SparkPost-account te streamen, waarna je het volgende kunt gebruiken:
Samenvatting rapport
Bounces rapport
Accepted rapport
Delayed rapport
Installeer eerst (of upgrade) naar PowerMTA 5.0 r4 of later, volgens de gebruikelijke v5.0 installatierichtlijnen die vrij eenvoudig zijn. Dan werken we de volgende stappen door:
Configureer PowerMTA-connector naar SparkPost Signals
Stel Engagement Tracking in met een aangepaste trackingdomein
Selecteer welke PowerMTA-verkeerstreams aan Signals moeten worden gerapporteerd
Testen of je gebeurtenissen Signals bereiken
Bekijk hoe je zinvolle namen gebruikt die goed zichtbaar zijn in rapportages.
We behandelen ook de andere specifieke PowerPMTA-configuratieaspecten die in onze Signals-demo worden gebruikt:
FBL-gebeurtenissen (Spam Klachten) en externe (out-of-band) bounces
Injectieconfiguratie, inclusief DKIM
FBL en OOB-configuratie
VirtualMTA-instelling en naamgeving (en hoe dit in je SparkPost Signals-rapporten verschijnt)
Ten slotte is er een "bonusfunctie" met code om ervoor te zorgen dat je campagnenamen compatibel zijn met PowerMTA X-Job benoemingsconventies.
Configureer PowerMTA-connector
De Signals-configuratie wordt beschreven in de 5.0 User Guide sectie 10.1. Hier beginnen we met “Use Case #2”, waarmee Signals wordt ingeschakeld voor al het verkeer vanaf deze PowerMTA-host, en SparkPost engagement tracking wordt ingeschakeld.
# # SparkPost Signals # <signals> api-key ##mijn ingest API-sleutel hier## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # dit schakelt de open- en kliktracking in PowerMTA in customer-id 123 # Uw SparkPost-accountnummer hier </signals> enable-signals true
Hier is wat elk attribuut doet:
api-key
Dit is uniek voor uw SparkPost-account, het is de waarde die u eerder van SparkPost hebt gekregen.
upload-url
Dit moet overeenkomen met het adres van uw SparkPost API-service, of het nu in de VS of EU is. Voor meer informatie zie hier. De gebruikelijke waarden zijn:
SparkPost (VS): https://api.sparkpost.com/api/v1/ingest/events
SparkPost EU: https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
Deze richtlijn is optioneel en geeft, wanneer ingeschakeld, iets meer informatie in het pmta.log-bestand, wat nuttig kan zijn tijdens de setup om te bevestigen dat alles correct werkt. Elke minuut, zelfs als er geen verkeer is, ziet u:
2019-07-26 11:47:57 Signals: 0 bestanden ontdekt
Met verkeer ziet u zoiets als:
2019-07-26 11:50:57 Signals: sp1-0000000000003FBD.json ontdekt 2019-07-26 11:50:57 Signals: sp1-0000000000003FBD.json succesvol overgedragen. 2019-07-26 11:50:57 Signals: 1 bestand ontdekt, 1 bestand succesvol overgedragen
min-free-space
Dit vertelt PowerMTA de drempel voor schijfruimte waarop het moet beginnen met het verwijderen van de oudste SparkPost JSON-gebeurtenisbestanden om ruimte te maken voor nieuwe bestanden wanneer de schijfruimte laag wordt.
enable-signals
Dit vertelt PowerMTA om te uploaden naar Signals, in dit geval globaal voor al het verkeer (meer informatie hier, voor v5.0). U kunt selectiever zijn over welke datastromen u wilt uploaden als u dat wilt.
U kunt ook bepaalde PowerMTA-verkeer markeren als behorend tot een SparkPost subaccount – dit is een andere manier om één specifieke datastroom van een andere te onderscheiden.
engagement-tracking, customer-id
PowerMTA’s Engagement Tracking-oplossing standaard naar het tracking domein voor de SparkPost US-hosted service. U specificeert uw SparkPost numerieke klant-ID; hier zijn instructies voor het vinden ervan.
tracking-domain
Voor SparkPost EU-accounts, voeg de volgende regel toe:
tracking-domain pmta.eu.spgo.io # dit is het eindpunt voor SparkPost EU
Aangepast Tracking Domein
Als u liever uw eigen tracking domein wilt gebruiken (dit is beter vanuit een leverbaarheidsperspectief), doe dan het volgende:
Maak tracking domein met uw DNS-provider door een CNAME-record te maken. Dit zal meestal een subdomein van uw topleveldomein zijn, bijv. track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io # als u een SparkPost US-account hebt track.mycompany.com CNAME pmta.eu.spgo.io # als u een SparkPost EU-account hebt
U kunt ook HTTPS tracking domeinen gebruiken, hoewel dit meer betrokken is (zie de SparkPost configuratiestappen voor HTTPS tracking domeinen).
Registreer tracking domein in uw SparkPost-account en verifieer het. Wacht een paar minuten voordat u dit probeert om uw DNS-wijzigingen te laten verspreiden over het internet, afhankelijk van uw DNS-provider.
Configureer PowerMTA om dat domein te gebruiken in plaats van de standaard, met
tracking-domain yourdomain.com # Zet hier uw eigen domein
U kunt controleren dat uw bezorgde e-mails “open pixels” hebben toegevoegd en de links zijn ingebed door naar de interne details van de e-mail te kijken (in Gmail, gebruik het menu rechtsboven en kies “Origineel weergeven”).

U zult de open pixels aan het begin en einde van de HTML in de e-mail opmerken. Elke HTML-link wordt ook veranderd om REF naar het tracking domein te laten verwijzen.

Dat is alles wat u nodig hebt om SparkPost Signals te laten werken met PowerMTA's ingebouwde Engagement Tracking.
Voorkomen dat specifieke links in uw html e-mail worden gevolgd
U kunt PowerMTA voorkomen om specifieke links te volgen door het aangepaste attribuut data-msys-clicktrack in te stellen op “0” :
<a href="#" data-msys-clicktrack="0">Voorbeeld</a>
PowerMTA zal de link niet inpakken. Het zal dat attribuut ook verwijderen voordat het bericht naar uw ontvanger wordt verzonden.
Selecteer welke PowerMTA-verkeersstromen moeten worden gerapporteerd aan Signals
Testen of je evenementen Signals bereiken
Hier is een weergave van SparkPost Signals, verbonden met PowerMTA. Je kunt zien dat de gezondheidsscore varieert.

De Campagnenamen zijn beschikbaar als rapportage-facetten, samen met Subaccount, IP Pool, Mailbox Provider, en Sending Domain.
Naast het bekijken van de PowerMTA logs, kun je controleren of de evenementengegevens SparkPost bereiken door naar het Signals Integration scherm te kijken.

In je SparkPost Evenementen Zoeken scherm, zou je evenementen binnen een paar minuten moeten zien verschijnen. Deze bevatten Injectie en Bezorging evenementen, evenals Bounce, en mogelijk Out-of-Band Bounce en Spam Klacht evenementen, als je PowerMTA al hebt geconfigureerd om dat voor je af te handelen.
Als je Betrokkenheid Volgen hebt ingeschakeld, zie je ook open, initial_open, en click evenementen.
Gebruik betekenisvolle namen die goed zichtbaar zijn in rapportages
Het instellen van de PowerMTA VirtualMTA Pool namen en Job namen zodat ze betekenisvol en leesbaar zijn, is zeker de moeite waard. Deze verschijnen rechtstreeks in je SparkPost Signals-facetten en het Samenvatting-rapport.
Zoals eerder vermeld, hoef je deze pools niet in je SparkPost-account aan te maken. SparkPost haalt ze op uit je PowerMTA-configuratie.
Hier is hoe PowerMTA-configuratietermen vertalen naar SparkPost-termen.
PowerMTA termSparkPost Reports / Signals termOntvanger Domein
(domeingedeelte van het “rcpt”-veld in het Accounting-bestand).Ontvanger DomeinHet domeingedeelte van de “Sender” of “From” header in het bericht dat door PowerMTA wordt doorgestuurd.
(domeingedeelte van “orig” in Accounting-bestand).Verzendend DomeinVirtualMTA (naam)—VirtualMTA Pool (naam)
(“vmtaPool” in accounting-bestand)IP Pool (naam)smtp-bron-host a.b.c.d
(“dlvSourceIp” in accounting-bestand)Verzendend IP a.b.c.dJob (naam)
(“jobId” in accounting-bestand)Campagne ID (naam)—Template (naam)“Subaccount” is geen inheems PowerMTA-concept.
PowerMTA kan echter virtualMTAs, virtual MTA Pools of Sender-or-From domeinen taggen met een subaccount ID voor het SparkPost rapportagedoeleinden.
Subaccount ID (nummer)FBL (evenement)Spam Klacht (evenement)Remote Bounce (evenement)Out-of-Band bounce (evenement)
Het instellen van ten minste één smtp-bron-host adres stelt SparkPost ook in staat om het verzendende IP-adres correct te identificeren zodat het verschijnt bij Injectie- en Bezorgingsevenementen, evenals in de Samenvatting-rapportweergave.
Job namen worden ingesteld in PowerMTA via een header in het geïnjecteerde bericht. Naast het mogelijk maken van individuele jobcontrole (pauzeren/hervatten enz.) die op zichzelf nuttig is, geeft PowerMTA de namen door aan SparkPost Signals rapportage als “campagne ID”. Zie Gebruikershandleiding v5.0 sectie 12.8 “Het bijhouden van een campagne in PowerMTA met een JobID”.
Er zijn een paar dingen om rekening mee te houden met betrekking tot jobbenaming. Terwijl SparkPost (met JSON-formaat en JSON-escaping) tekens zoals <SPATIE> in campagnenamen toestaat, zijn e-mailkoppen restrictiever. Geldige karakters toegestaan in de X-Job header zijn:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
Met andere woorden, niet-toegestane karakters omvatten <SPATIE>, dubbele aanhalingstekens “ en backtick `. Als je gewend bent te werken met X-Job namen, zal dit niet verrassend zijn, en je campagne ID-namen zullen “gewoon werken” op SparkPost rapportage. Als je, net als ik, SparkPost eerst hebt geleerd, wil je misschien een tool hebben om ervoor te zorgen dat je X-Job-waarden veilig zijn; zie de bonusfunctie aan het einde van dit artikel.
FBL gebeurtenissen (Spam Klachten) en externe (out-of-band) bounces
PowerMTA kan FBL-gebeurtenissen ontvangen en verwerken (bekend in SparkPost als Spamklacht-gebeurtenissen) en externe bounces (bekend in SparkPost als out-of-band bounces, omdat het antwoord enige tijd later terugkomt, in plaats van tijdens de SMTP-sessie).
Er zijn artikelen in het Port25 Support Forum over hoe je de Bounce Processor en de FBL Processor instelt. Als je al een PowerMTA-gebruiker bent, heb je deze waarschijnlijk al.
Hier is de configuratie die ik voor een demo heb gemaakt, gebaseerd op deze artikelen en gericht op het hosten van PowerMTA in Amazon EC2.
Als je bekend bent met PowerMTA-configuratie in dit gebied, kun je dit gedeelte overslaan tot aan de volgende horizontale lijn.
Injectieconfiguratie
We gebruiken poort 587 voor geïnjecteerde berichten, die over het publieke internet van een andere host zullen komen. We moeten voorkomen dat kwaadwillende actoren deze dienst ontdekken en misbruiken, dus passen we gebruikersnaam/wachtwoordauthenticatie en optionele TLS toe, vergelijkbaar met SparkPost SMTP-injectie-eindpunten.
We willen berichten kunnen verzenden van bronnen die correct zijn geauthenticeerd naar elke bestemming. We willen ook een aparte luisterdienst op poort 25 voor FBL- en externe bounce-antwoorden die geen authenticatie vereisen.
# # IP-adressen en poorten waarop geluisterd moet worden naar inkomende SMTP-verbindingen # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
In de volgende <source> declaraties, gebruiken we gebruikersnaam/wachtwoordauthenticatie en optionele TLS om ons te beschermen tegen het injecteren van ongewenste berichten. We stellen ook limieten op verbindingen met mislukte wachtwoordpogingen.
Je configuratie kan verschillen; bijvoorbeeld, als je een privé-netwerk hebt tussen injector en PowerMTA, heb je geen wachtwoordverificatie nodig.
# Eén bronregel voor alle injecties, intern of extern. Auth afdwingen, behalve voor bounces en FBL's # <source 0/0> log-verbindingen false log-commando's false # WAARSCHUWING: gedetailleerd! enkel voor ontwikkeling log-gegevens false # WAARSCHUWING: nog gedetailleerder! smtp-dienst true # SMTP-dienst toestaan smtp-max-auth-mislukking-snelheid 1/min ongecodeerde-plain-auth niet toestaan starttls toestaan rewrite-list mfrom </source> <source {auth}> altijd-relay-toestaan ja # alleen als de authenticatie slaagt standaard-virtuele-mta-standaard process-x-job true </source>
De <source {auth}> declaratie (zie hier. v5.0) is van toepassing zodra authenticatie is geslaagd. Hier staat het doorsturen toe, stelt de standaard virtuele MTA-groep in om te gebruiken, en voegt de X-Job-header toe (die door Bird Signals zal worden gerapporteerd als campaign_id).
De rewrite-lijst wijst geïnjecteerde berichten toe aan een specifiek MAIL FROM-domein (ook bekend als bounce-domein of Return-Path:).
# # Schrijf het MAIL FROM-adres om om overeen te komen met het bounce-domein # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
Dan stellen we onze TLS-configuratie in en SMTP-gebruikersnaam / wachtwoord, volgens de huidige aanbevelingen.
# # Beveilig de inkomende dienst met gebruikersnaam, wachtwoord en TLS. SMT 2020-06-15 # smtp-server-tls-certificaat /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-gebruikers (verificatie via SMTP AUTH) # <smtp-user SMTP_Injection> wachtwoord ##VOER HIER JE WACHTWOORD IN## verificatiemethode wachtwoord </smtp-user>
We kunnen controleren of de (onveilige, verouderde) TLS v1.0 niet wordt geaccepteerd met mijn favoriete SMTP testtool, swaks.
swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1
We zien:
*** TLS start-up mislukt (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS geprobeerd maar mislukt
Evenzo voor –tls-protocol tlsv1_1.
Laten we ook DKIM-ondertekening toepassen op onze uitgaande berichten, want het is een goede gewoonte (ik volgde deze instructies om de sleutel in te stellen).
# # DKIM # domeinsleutel mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
FBL en OOB configuratie
Nu .. eindelijk .. verklaren we welke specifieke domeinen openstaan voor externe bounce- en FBL-reacties. We willen deze niet ergens anders doorsturen (om backscatter-aanvallen te voorkomen), alleen intern die reacties verwerken.
# # Schakel Bounce- en FBL-verwerking in op specifieke domeinen # 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>
Je kunt zien dat ik twee bounce-domeinen heb ingesteld, aangezien ik aan het experimenteren was met het wel of niet gebruiken van de mfrom herschrijvingsregel.
Het FBL-domein wordt meestal geregistreerd bij externe diensten zoals Microsoft SNDS; zie dit artikel voor meer informatie. Voor deze demo zullen de FBL's afkomstig zijn van de Bouncy Sink, dus registratie is niet nodig.
Testen van de SMTP-listener
Het is belangrijk om te testen dat uw SMTP-listener autorisatie vereist voor alle algemene bestemmingen, en alle berichten afwijst die niet specifiek gericht zijn aan de FBL- en remote-bounce-domeinen.
swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com
De reactie, zoals verwacht, toont aan dat het doorsturen is geweigerd:
550 5.7.1 doorsturen geweigerd voor ontvanger in "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>
(Einde van demoinstallatiebeschrijving).
VirtualMTA setup en naamgeving
PowerMTA VirtualMTAs (en VirtualMTA-pools) zijn krachtige functies voor het beheren van berichtstromen, en PowerMTA / SparkPost Signals rapportagefuncties werken het beste met deze actief.
# # Leid al het uitgaand verkeer door deze virtuele mta / pool. # Verklaar hier het bezorg-IP-adres, zodat SparkPost signalen injectie (ook bekend als "ontvangst") gebeurtenissen correct de sending_IP-attribuut # <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. verbindingen *per domein* bounce-after 4d12u # 4 dagen, 12 uur retry-after 10m # 10 minuten dkim-sign ja </domain> </virtual-mta-pool>
De instelling virtual-mta-pool wordt in SparkPost gerapporteerd als “IP Pool”, en is beschikbaar als een SparkPost Signals rapportagefacet (het dropdownmenu onder de grafieken).

Het Samenvattingsrapport toont ook IP Pool als een “Groeperen op” rapportagefacet.

Zoals eerder in dit artikel opgemerkt, maakt het instellen van ten minste één smtp-source-host adres het ook mogelijk voor SparkPost om het verzend-IP-adres correct te identificeren, zodat het verschijnt bij Injectie- en Bezorggebeurtenissen, en in het Samenvattingsrapport:

Dat is alles wat je nodig hebt om een basisintegratie tussen PowerMTA en SparkPost Signals werkend te krijgen. Je vindt het volledige configuratievoorbeeld hier.
Voordat je gaat, hier is het bonuskenmerk dat ik noemde.
Bonusfunctie: X-Job naam controleren/filteren
Om ervoor te zorgen dat elke tekenreeks veilig is voor gebruik als een PowerMTA X-Job-naam, hier is een eenvoudige Python-functie om eventuele onveilige tekens naar een underscore "_" te transformeren.
import re def pmtaSafeJobID(s): """ :param s: str :return: str Map een willekeurige campagne-ID-tekenreeks naar toegestane tekens voor de PMTA X-Job header. Zie https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Specifiek niet toestaan <sp>, " ` maar de meeste andere tekens wel toestaan. """ # Opmerking moet ' - [ ] ontsnappen en dubbel-ontsnappen \ - zie https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]' return re.sub(disallowedChars, '_', s)
Dit gebruikt Python-reguliere expressies op een specifieke manier. Het definieert de set van niet-toegestane karakters met behulp van de "setcomplement" operator ^ in plaats van alle toegestane tekens op te sommen. Dat betekent dat we tekens buiten de gebruikelijke 7-bits set vangen (en veilig maken). We kunnen dat laten zien met dit testfragment:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
Geeft
_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________
Je kunt zien dat <SPACE>, dubbele aanhalingstekens “, en backtick `, evenals alle tekens voorbij ~ worden omgezet in een underscore.