
Immergiamoci nei dettagli di configurazione di PowerMTA per SparkPost Signals.
Esaminiamo i dettagli della configurazione di PowerMTA per SparkPost Signals. Avrai bisogno di:
Un host su cui eseguire l'ultima versione di PowerMTA – sia una macchina nuova che una esistente
Un account SparkPost con permessi di chiave API per “Incoming Events: Write” come descritto qui
Imposteremo PowerMTA per inviare eventi al tuo account SparkPost, quindi potrai utilizzare quanto segue:
Innanzitutto, installa (o aggiorna) PowerMTA 5.0 r4 o successiva, seguendo le istruzioni di installazione della versione 5.0 abituali, che sono piuttosto semplici. Poi, lavoreremo attraverso i seguenti passaggi:
Configura il connettore PowerMTA per SparkPost Signals
Imposta il monitoraggio degli impegni con un dominio di tracciamento personalizzato
Seleziona quali flussi di traffico PowerMTA riportare a Signals
Testare che i tuoi eventi raggiungano Signals
Rivedi come utilizzare nomi significativi che si mostrano bene nei report.
Tratteremo anche altri aspetti specifici della configurazione PowerPMTA utilizzati nella nostra demo di Signals:
Eventi FBL (Reclami di spam) e rimbalzi remoti (out-of-band)
Configurazione dell’inject, compreso DKIM
Configurazione FBL e OOB
Configurazione e denominazione di VirtualMTA (e come questo appare nei report di SparkPost Signals)
Infine, c'è una “funzione bonus” con codice per garantire che i nomi delle campagne siano compatibili con le convenzioni di nome di PowerMTA X-Job .
Configura connettore PowerMTA
La configurazione di Signals è descritta nella Guida Utente 5.0, sezione 10.1. Qui inizieremo con “Use Case #2”, che abilita Signals per tutto il traffico da questo host PowerMTA, e abilita il tracciamento dell'engagement di SparkPost.
# # SparkPost Signals # <signals> api-key ##my ingest API key here## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # questo attiva il tracciamento di click e aperture in PowerMTA customer-id 123 # Il tuo numero di account SparkPost qui </signals> enable-signals true
Ecco cosa fa ogni attributo:
api-key
Questo è unico per il tuo account SparkPost, è il valore che hai ottenuto da SparkPost in precedenza.
upload-url
Questo deve corrispondere all'indirizzo del tuo servizio API SparkPost, sia che si tratti degli Stati Uniti o dell'UE. Per maggiori informazioni vedi qui. I valori usuali sono:
SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events
SparkPost EU: https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
Questa direttiva è opzionale e quando abilitata, fornisce ulteriori informazioni nel file pmta.log, che possono essere utili durante la configurazione per confermare che tutto funzioni correttamente. Ogni minuto, anche quando non c'è traffico, vedrai:
2019-07-26 11:47:57 Signals: Scoperti 0 file
Con il traffico, vedrai qualcosa come:
2019-07-26 11:50:57 Signals: Scoperto sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Trasferito sp1-0000000000003FBD.json con successo. 2019-07-26 11:50:57 Signals: Scoperto 1 file, trasferito 1 file con successo
min-free-space
Questo indica a PowerMTA la soglia di spazio su disco a cui dovrebbe iniziare a eliminare i file evento JSON di SparkPost più vecchi per fare spazio a nuovi file quando lo spazio su disco sta per esaurirsi.
enable-signals
Questo dice a PowerMTA di caricare su Signals, in questo caso globalmente per tutto il traffico (maggiori informazioni qui, per v5.0). Puoi essere più selettivo su quale traffico caricare, se lo desideri.
Puoi anche contrassegnare un particolare traffico di PowerMTA per essere riportato come appartenente a un subaccount SparkPost – questo è un altro modo per distinguere un particolare flusso di traffico dall'altro.
engagement-tracking, customer-id
La soluzione di Engagement Tracking di PowerMTA predefinisce il dominio di tracciamento per il servizio ospitato da SparkPost negli Stati Uniti. Devi specificare il tuo ID cliente numerico SparkPost; ecco le istruzioni per trovarlo.
tracking-domain
Per gli account EU di SparkPost, aggiungi la seguente riga:
tracking-domain pmta.eu.spgo.io # questo è l'endpoint per SparkPost EU
Dominio di Tracciamento Personalizzato
Se preferisci usare il tuo dominio di tracciamento (è meglio dal punto di vista della deliverability), fai quanto segue:
Crea un dominio di tracciamento con il tuo provider DNS creando un record CNAME. Questo di solito sarà un sottodominio del tuo dominio di primo livello, es. track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io # se hai un account SparkPost US track.mycompany.com CNAME pmta.eu.spgo.io # se hai un account SparkPost EU
Puoi anche usare domini di tracciamento HTTPS, anche se questo è più complesso (vedi i passaggi di configurazione SparkPost per i domini di tracciamento HTTPS).
Registra il dominio di tracciamento nel tuo account SparkPost e verificalo. Attendi qualche minuto prima di provarlo, per permettere alle modifiche DNS di propagarsi attraverso Internet, a seconda del tuo provider DNS.
Configura PowerMTA per usare quel dominio invece di quello predefinito, con
tracking-domain yourdomain.com # Inserisci qui il tuo dominio
Puoi verificare che le tue email consegnate abbiano “open pixels” aggiunti e i link avvolti, guardando l'interno della mail (in Gmail, usa il menu in alto a destra e scegli “Mostra Originale”).

Noterai i pixel di apertura all'inizio e alla fine dell'HTML nell'email. Ogni link HTML è anche modificato per avere REF che punta al dominio di tracciamento.

Questo è tutto ciò che serve per far funzionare SparkPost Signals con il Tracking dell'Engagement integrato di PowerMTA.
Prevenire il tracciamento di specifici link nel tuo email html
Puoi impedire a PowerMTA di tracciare specifici link, impostando l'attributo personalizzato data-msys-clicktrack su “0” :
<a href="#" data-msys-clicktrack="0">Esempio</a>
PowerMTA non avvolgerà il link. Rimuoverà anche quell'attributo prima di trasmettere il messaggio al destinatario.
Seleziona quali flussi di traffico PowerMTA riportare a Signals
Testing che i tuoi eventi stanno raggiungendo Signals
Qui c'è una vista di SparkPost Signals, collegata a PowerMTA. Puoi vedere che il punteggio di salute sta variando.

I nomi delle campagne sono disponibili come faccette di reportistica, insieme a Subaccount, IP Pool, Mailbox Provider e Sending Domain.
Oltre a esaminare i log di PowerMTA, puoi verificare che i dati degli eventi stiano raggiungendo SparkPost guardando alla schermata di Integrazione Signals.

Nella tua schermata di ricerca eventi SparkPost, dovresti vedere gli eventi apparire entro pochi minuti. Questi includeranno eventi di Injection e Delivery, oltre a Bounce, e potenzialmente Out-of-Band Bounce ed eventi di reclamo di spam, se hai già configurato PowerMTA per gestirli per te.
Se hai abilitato il Tracciamento di Coinvolgimento, vedrai anche eventi di open, initial_open, e click.
Usare nomi significativi che compaiono bene nei report
Impostare i nomi del Pool VirtualMTA di PowerMTA e i nomi dei lavori in modo che siano significativi e leggibili è davvero utile. Questi appaiono direttamente nei tuoi aspetti di SparkPost Signals e nel report di riepilogo.
Come accennato in precedenza, non è necessario creare questi pool nel tuo account SparkPost. SparkPost li acquisisce dalla configurazione di PowerMTA.
Ecco come i termini di configurazione di PowerMTA si traducono nei termini di SparkPost.
PowerMTA termSparkPost Reports / Signals termRecipient Domain
(parte di dominio del campo “rcpt” nel file di contabilità).Recipient DomainLa parte di dominio dell'intestazione “Sender” o “From” nel messaggio inoltrato da PowerMTA.
(parte di dominio di “orig” nel file di contabilità).Sending DomainVirtualMTA (name)—VirtualMTA Pool (name)
(“vmtaPool” nel file di contabilità)IP Pool (name)smtp-source-host a.b.c.d
(“dlvSourceIp” nel file di contabilità)Sending IP a.b.c.dJob (name)
(“jobId” nel file di contabilità)Campaign ID (name)—Template (name)“Subaccount” non è un concetto nativo di PowerMTA.
Tuttavia, PowerMTA può taggare virtualMTAs, virtual MTA Pools, o i domini Sender-or-From con un ID di subaccount per scopi di reporting su SparkPost.
Subaccount ID (number)FBL (event)Spam Complaint (event)Remote Bounce (event)Out-of-Band bounce (event)
Impostare almeno un indirizzo smtp-source-host consente anche a SparkPost di identificare correttamente l'indirizzo IP di invio in modo che appaia negli eventi di Injection e Delivery, così come nella vista del report di riepilogo.
I nomi dei lavori sono impostati in PowerMTA tramite un'intestazione nel messaggio iniettato. Oltre a consentire il controllo individuale dei lavori (pausa/riprendi ecc.) che è utile in sé, PowerMTA trasmette i nomi attraverso al reporting di SparkPost Signals come “campaign ID”. Vedi Guida Utente v5.0 sezione 12.8 “Tracking a campaign in PowerMTA with a JobID”.
Ci sono alcune cose da tenere a mente riguardo alla denominazione dei lavori. Mentre SparkPost (con formato JSON e escape JSON) permette caratteri come <SPACE> nei nomi delle campagne, le intestazioni delle mail sono più restrittive. I caratteri validi ammessi nell'intestazione X-Job sono:
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
In altre parole, i caratteri non ammessi includono <SPACE>, le virgolette doppie “ e l'apostrofo `. Se sei abituato a lavorare con i nomi X-Job, questo non ti sorprenderà, e i nomi degli ID di campagna funzioneranno “perfettamente” nel reporting di SparkPost. Se come me, hai imparato prima SparkPost, potresti volere uno strumento per garantire che i tuoi valori X-Job siano sicuri; vedi la funzionalità bonus alla fine di questo articolo.
Eventi FBL (Spam Complaints) e rimbalzi remoti (out-of-band)
PowerMTA può ricevere e elaborare eventi FBL (noti in SparkPost come eventi di reclamo di spam) e bounce remoti (noti in SparkPost come bounce out-of-band, poiché la risposta arriva un po' di tempo dopo, anziché durante la conversazione SMTP).
Ci sono articoli nel Port25 Support Forum su come impostare il Bounce Processor e il FBL Processor. Se sei un utente PowerMTA esistente, probabilmente li hai già.
Ecco la configurazione che ho fatto per una demo, basata su questi articoli e orientata verso l'hosting di PowerMTA in Amazon EC2.
Se hai familiarità con la configurazione di PowerMTA in quest'area, puoi saltare questa parte, fino alla prossima linea orizzontale.
Configurazione Injection
Utilizzeremo la porta 587 per i messaggi iniettati, che arriveranno tramite Internet pubblico da un altro host. Dobbiamo impedire che attori malintenzionati scoprano e abusino di questo servizio, quindi applichiamo l'autenticazione nome utente/password e TLS opzionale, simile ai punti di iniezione SMTP di SparkPost.
Vogliamo essere in grado di inviare messaggi da fonti correttamente autenticate a qualsiasi destinazione. Vogliamo anche un ascoltatore separato sulla porta 25 per le risposte FBL e di rimbalzo remoto che non richiedono autenticazione.
# # Indirizzo/i IP e porta/e su cui ascoltare le connessioni SMTP in entrata # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
Nelle seguenti dichiarazioni <source>, utilizziamo l'autenticazione nome utente/password e TLS opzionale per difenderci dall'iniezione di messaggi dannosi. Impostiamo anche limiti di velocità sulle connessioni che fanno tentativi di password falliti.
La tua configurazione potrebbe essere diversa; ad esempio, se hai una rete privata tra l'iniettore e PowerMTA, non avrai bisogno dell'autenticazione della password.
# Una regola di origine per tutte le iniezioni, interne o esterne. Forza l'auth, tranne per i rimbalzi e i FBL # <source 0/0> log-connections false log-commands false # AVVISO: verboso! solo per sviluppo log-data false # AVVISO: ancora più verboso! smtp-service true # consenti servizio SMTP 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 # solo se l'auth riesce default-virtual-mta default process-x-job true </source>
La dichiarazione <source {auth}> (vedi qui. v5.0) si applica una volta superata l'autenticazione. Qui, consente il ritrasporto, imposta il gruppo MTA virtuale predefinito da utilizzare e aggiunge l'intestazione X-Job (che verrà riportata da SparkPost Signals come campaign_id).
La lista di riscrittura mappa i messaggi iniettati per utilizzare un dominio MAIL FROM specifico (alias dominio di rimbalzo o Return-Path:).
# # Riscrivi l'indirizzo MAIL FROM per corrispondere al dominio di rimbalzo # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
Poi configuriamo la nostra configurazione TLS e nome utente/password SMTP, secondo le raccomandazioni attuali.
# # Proteggi il servizio in entrata con nome utente, password e 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 # # Utenti SMTP (autenticati tramite SMTP AUTH) # <smtp-user SMTP_Injection> password ##INSERISCI QUI LA TUA PASSWORD## authentication-method password </smtp-user>
Possiamo verificare che il TLS v1.0 (insicuro, deprecato) non sia accettato usando il mio strumento di test SMTP preferito, swaks.
swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1
Vediamo:
*** Avvio TLS fallito (connect(): errore:00000000:lib(0):func(0):motivo(0)) *** STARTTLS tentato ma fallito
Lo stesso vale per –tls-protocol tlsv1_1.
Applichiamo anche la firma DKIM sui nostri messaggi in uscita, poiché è una buona pratica (ho seguito queste istruzioni per configurare la chiave).
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
FBL e OOB configuration
Ora .. finalmente .. dichiariamo quali domini specifici sono aperti per i rimbalzi remoti e le risposte FBL. Non vogliamo inoltrarli da nessuna parte (per prevenire gli attacchi di backscatter), semplicemente processiamo internamente quelle risposte.
# # Abilita l'elaborazione dei Rimbalzi e FBL su domini specifici # 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>
Puoi vedere che ho configurato due domini di rimbalzo, poiché stavo sperimentando con e senza la regola di riscrittura mfrom.
Il dominio FBL viene solitamente registrato con servizi esterni come Microsoft SNDS; vedi questo articolo per maggiori informazioni. Per questa dimostrazione, i FBL arriveranno dal Bouncy Sink, quindi non è necessario registrarsi.
Test della funzione di ascolto SMTP
È importante testare che il tuo listener SMTP richieda l'autorizzazione per qualsiasi destinazione generale, rifiutando qualsiasi messaggio che non sia specificamente indirizzato ai domini FBL e remote-bounce.
swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com
La risposta, come previsto, mostra che il relay è negato:
550 5.7.1 relay negato per il destinatario in "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>
(Fine della descrizione dell'impostazione demo).
Configurazione e nominazione di VirtualMTA
PowerMTA VirtualMTAs (e pool di VirtualMTA) sono funzionalità potenti per gestire flussi di messaggi, e le funzionalità di reporting di PowerMTA / SparkPost Signals funzionano al meglio con questi attivi.
# # Instrada tutto il traffico in uscita attraverso questo virtual mta / pool. # Dichiara l'indirizzo IP di consegna qui, in modo che gli eventi di iniezione (aka "reception") di SparkPost segnali # portino l'attributo sending_IP corretto # <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. connessioni *per dominio* bounce-after 4d12h # 4 giorni, 12 ore retry-after 10m # 10 minuti dkim-sign sì </domain> </virtual-mta-pool>
La configurazione del virtual-mta-pool è riportata in SparkPost come “IP Pool” ed è disponibile come un aspetto di reportistica SparkPost Signals (il menu a discesa sotto i grafici).

Il Rapporto di Sintesi mostra anche IP Pool come un aspetto di reportistica “Group By”.

Come indicato all'inizio di questo articolo, impostare almeno un indirizzo smtp-source-host consente a SparkPost di identificare correttamente l'indirizzo IP di invio, in modo che venga visualizzato negli eventi di Iniezione e Consegna e nel Rapporto di Sintesi:

Questo è tutto ciò di cui hai bisogno per ottenere un'integrazione di base funzionante tra PowerMTA e SparkPost Signals. Troverai qui l'esempio completo di file di configurazione.
Prima di andare, ecco la funzione bonus che ho menzionato.
Funzione bonus: controllo/filtraggio nome X-Job
Per garantire che qualsiasi stringa di caratteri sia sicura per l'uso come nome X-Job di PowerMTA, ecco una semplice funzione Python per mappare qualsiasi carattere non sicuro a un trattino di sottolineatura “_”
import re def pmtaSafeJobID(s): """ :param s: str :return: str Mappa una stringa ID di campagna arbitraria nei caratteri consentiti per l'intestazione PMTA X-Job. Vedi https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Specifica di escludere <sp> " ` ma consentire la maggior parte degli altri caratteri. """ # Nota: bisogna sfuggire ' - [ ] e doppio-escapare \ - vedi https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]' return re.sub(disallowedChars, '_', s)
Questo utilizza le espressioni regolari di Python in un modo specifico. Dichiara l'insieme dei caratteri non consentiti utilizzando l'operatore “complemento dell'insieme” ^ piuttosto che elencare tutti i caratteri consentiti. Questo significa che catturiamo (e rendiamo sicuri) caratteri al di là del solito set di 7 bit. Possiamo mostrarlo utilizzando questo frammento di test:
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
Risultando
_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________
Puoi vedere che <SPACE>, i doppi apici “ e l'accento grave `, così come tutti i caratteri oltre ~, sono mappati su un trattino di sottolineatura.