
Plongeons dans les détails de la configuration de PowerMTA pour SparkPost Signals.
Explorons les détails de la configuration de PowerMTA pour SparkPost Signals. Vous allez avoir besoin de :
Un hôte pour exécuter la dernière version de PowerMTA – soit une nouvelle machine, soit une machine existante
Un compte SparkPost avec la permission de clé API pour « Événements entrants : Écriture » comme décrit ici
Nous allons configurer PowerMTA pour transmettre des événements à votre compte SparkPost, puis vous serez en mesure d'utiliser les éléments suivants :
D'abord, installez (ou mettez à niveau) vers PowerMTA 5.0 r4 ou supérieur, en suivant les instructions habituelles d'installation v5.0 qui sont assez simples. Ensuite, nous travaillerons à travers les étapes suivantes :
Configurer le connecteur PowerMTA pour SparkPost Signals
Configurer le suivi de l'engagement avec un domaine de suivi personnalisé
Sélectionner quels flux de trafic PowerMTA rapporter aux Signals
Tester que vos événements atteignent bien les Signals
Revoir comment utiliser des noms significatifs qui apparaissent bien dans les rapports.
Nous aborderons également les autres aspects spécifiques de la configuration de PowerPMTA utilisés dans notre démonstration Signals :
Événements FBL (plaintes de spam) et rejets distants (hors bande)
Configuration d'injection, y compris DKIM
Configuration FBL et OOB
Configuration et nommage des VirtualMTA (et comment cela apparaît dans vos rapports SparkPost Signals)
Enfin, il y a une « fonctionnalité bonus » avec un code pour s'assurer que les noms de vos campagnes sont compatibles avec les conventions de noms PowerMTA X-Job.
Configurer le connecteur PowerMTA
La configuration des Signals est décrite dans la section 10.1 du Guide de l'utilisateur 5.0. Ici, nous commencerons avec « Use Case #2 », qui active Signals pour tout le trafic de cet hôte PowerMTA et active le suivi de l'engagement de SparkPost.
# # SparkPost Signals # <signals> api-key ##ma clé API à ingérer ici## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # ceci active le suivi des ouvertures et des clics dans PowerMTA customer-id 123 # Votre numéro de compte SparkPost ici </signals> enable-signals true
Voici ce que fait chaque attribut :
api-key
Ceci est unique à votre compte SparkPost, c’est la valeur que vous avez obtenue de SparkPost plus tôt.
upload-url
Cela doit correspondre à l'adresse de votre service API SparkPost, qu'il soit aux États-Unis ou en UE. Pour plus d'informations, voir ici. Les valeurs habituelles sont :
SparkPost (US) : https://api.sparkpost.com/api/v1/ingest/events
SparkPost UE : https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
Cette directive est optionnelle et, lorsqu'elle est activée, elle donne un peu plus d'informations dans le fichier pmta.log, ce qui peut être utile lors de la configuration pour confirmer que tout fonctionne correctement. Chaque minute, même en l'absence de trafic, vous verrez :
2019-07-26 11:47:57 Signals : Découvert 0 fichiers
Avec du trafic, vous verrez quelque chose comme :
2019-07-26 11:50:57 Signals : Découvert sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals : Transféré sp1-0000000000003FBD.json avec succès. 2019-07-26 11:50:57 Signals : Découvert 1 fichier, transféré 1 fichier avec succès
min-free-space
Cela indique à PowerMTA le seuil d'espace disque à partir duquel il doit commencer à supprimer les fichiers d'événements JSON de SparkPost les plus anciens pour faire de la place pour de nouveaux fichiers lorsque l'espace disque est faible.
enable-signals
Ceci indique à PowerMTA de télécharger vers Signals, dans ce cas globalement pour tout le trafic (plus d'informations ici, pour v5.0). Vous pouvez être plus sélectif sur les flux de trafic à télécharger si vous le souhaitez.
Vous pouvez également marquer un trafic PowerMTA particulier à déclarer comme appartenant à un sous-compte SparkPost – c'est un autre moyen de distinguer un flux de trafic particulier d'un autre.
engagement-tracking, customer-id
La solution de suivi de l'engagement de PowerMTA par défaut utilise le domaine de suivi pour le service hébergé aux États-Unis de SparkPost. Vous spécifiez votre identifiant numérique de client SparkPost ; voici les instructions pour le trouver.
tracking-domain
Pour les comptes SparkPost UE, ajoutez la ligne suivante :
tracking-domain pmta.eu.spgo.io # ceci est l'endpoint pour SparkPost UE
Domaine de suivi personnalisé
Si vous préférez utiliser votre propre domaine de suivi (c'est mieux du point de vue de la livrabilité), procédez comme suit :
Créez un domaine de suivi avec votre fournisseur DNS en créant un enregistrement CNAME. Ce sera généralement un sous-domaine de votre domaine de niveau supérieur, par exemple track.mycompany.com .
track.mycompany.com CNAME pmta.spgo.io # si vous avez un compte SparkPost US track.mycompany.com CNAME pmta.eu.spgo.io # si vous avez un compte SparkPost UE
Vous pouvez également utiliser des domaines de suivi HTTPS, bien que cela soit plus complexe (voir les étapes de configuration de SparkPost ici).
Enregistrez le domaine de suivi dans votre compte SparkPost et vérifiez-le. Attendez quelques minutes avant d'essayer ceci, afin de permettre à vos modifications DNS de se propager sur Internet, selon votre fournisseur DNS.
Configurez PowerMTA pour utiliser ce domaine au lieu du domaine par défaut, avec
tracking-domain yourdomain.com # Mettez votre propre domaine ici
Vous pouvez vérifier que vos e-mails livrés ont des “pixels ouverts” ajoutés et les liens enveloppés, en regardant les détails internes du courrier (dans Gmail, utilisez le menu en haut à droite et choisissez “Afficher l'original”).

Vous remarquerez les pixels ouverts au début et à la fin du HTML dans l'e-mail. Chaque lien HTML est également modifié pour avoir REF pointant vers le domaine de suivi.

C'est tout ce dont vous avez besoin pour que SparkPost Signals fonctionne avec le suivi de l'engagement intégré de PowerMTA.
Empêcher les liens spécifiques dans votre e-mail html d'être suivis
Vous pouvez empêcher PowerMTA de suivre certains liens en définissant l'attribut personnalisé data-msys-clicktrack à “0” :
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA n'enveloppera pas le lien. Il supprimera également cet attribut avant de transmettre le message à votre destinataire.
Sélectionnez les flux de trafic PowerMTA à signaler à Signals
Tester que vos événements atteignent Signals
Voici une vue de SparkPost Signals, connecté à PowerMTA. Vous pouvez voir que le score de santé varie.

Les noms de Campagne sont disponibles comme facettes de reporting, ainsi que Subaccount, IP Pool, Mailbox Provider, et Sending Domain.
En plus de regarder les journaux PowerMTA, vous pouvez vérifier que les données d'événements atteignent SparkPost en regardant l'écran d'Intégration Signals.

Dans votre écran de Recherche d'Événements SparkPost, vous devriez voir apparaître des événements dans quelques minutes. Cela inclura des événements d'Injection et de Livraison, ainsi que Bounce, et potentiellement Out-of-Band Bounce et des événements de Plainte Spam, si vous avez déjà configuré PowerMTA pour les gérer à votre place.
Si vous avez activé le Suivi d'Engagement, vous verrez également des événements open, initial_open, et click.
Utiliser des noms significatifs qui apparaissent bien dans les rapports
Configurer les noms de Pool VirtualMTA PowerMTA et les noms de Job pour qu'ils soient significatifs et lisibles par l'humain vaut vraiment la peine de le faire. Ceux-ci apparaissent directement dans vos facettes de SparkPost Signals et dans le rapport de synthèse.
Comme mentionné précédemment, vous n'avez pas besoin de créer ces pools dans votre compte SparkPost. SparkPost les récupère à partir de votre configuration PowerMTA.
Voici comment les termes de configuration PowerMTA se traduisent en termes SparkPost.
Terme PowerMTA / SparkPost Reports / SignalsRecipient Domain
(partie domaine du champ “rcpt” dans le fichier de comptabilité).Recipient DomainLa partie domaine de l'en-tête “Sender” ou “From” dans le message relayé par PowerMTA.
(partie domaine de “orig” dans le fichier de comptabilité).Sending DomainVirtualMTA (nom)—VirtualMTA Pool (nom)
(“vmtaPool” dans le fichier de comptabilité)IP Pool (nom)smtp-source-host a.b.c.d
(“dlvSourceIp” dans le fichier de comptabilité)Sending IP a.b.c.dJob (nom)
(“jobId” dans le fichier de comptabilité)Campaign ID (nom)—Template (nom)“Subaccount” n'est pas un concept natif de PowerMTA.
Cependant, PowerMTA peut étiqueter les VirtualMTAs, Virtual MTA Pools, ou les domaines Sender-or-From avec un ID de sous-compte à des fins de reporting SparkPost.
Subaccount ID (numéro)FBL (événement)Spam Complaint (événement)Remote Bounce (événement)Out-of-Band bounce (événement)
Configurer au moins une adresse smtp-source-host permet également à SparkPost d'identifier correctement l'adresse IP d'envoi, de sorte qu'elle apparaisse sur les événements d'injection et de livraison, ainsi que dans la vue du rapport de synthèse.
Les noms de Job sont configurés dans PowerMTA via un en-tête dans le message injecté. En plus de permettre un contrôle individuel des travaux (pause/reprise, etc.), ce qui est utile en soi, PowerMTA transmet les noms aux rapports de Signal SparkPost sous forme de “campaign ID”. Voir le Guide de l'utilisateur section v5.0 12.8 “Tracking a campaign in PowerMTA with a JobID”.
Il y a quelques précautions à prendre en compte concernant la dénomination des jobs. Bien que SparkPost (avec le format JSON et l'échappement JSON) permette des caractères comme <SPACE> dans les noms de campagne, les en-têtes de courrier sont plus restrictifs. Les caractères valides autorisés dans l'en-tête X-Job sont :
A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~
En d'autres termes, les caractères interdits incluent <SPACE>, les guillemets doubles “ et l'accent grave `. Si vous êtes habitué à travailler avec des noms de X-Job, cela ne sera pas surprenant, et vos noms de ID de campagne “fonctionneront” simplement sur les rapports SparkPost. Si, comme moi, vous avez appris SparkPost en premier, vous pourriez vouloir un outil pour garantir que vos valeurs X-Job sont sûres ; voir la fonction bonus à la fin de cet article.
Événements FBL (plaintes spam) et rebonds distants (hors bande)
PowerMTA peut recevoir et traiter les événements FBL (connu dans SparkPost sous le nom d'événements de plainte pour spam) et les rebonds distants (connu dans SparkPost sous le nom de rebonds hors bande, car la réponse revient quelque temps plus tard, plutôt que pendant la conversation SMTP).
Il y a des articles dans le forum de support Port25 sur comment configurer le Bounce Processor et le FBL Processor. Si vous êtes déjà un utilisateur de PowerMTA, vous avez probablement déjà cela.
Voici la configuration que j’ai faite pour une démo, basée sur ces articles et orientée vers l'hébergement de PowerMTA dans Amazon EC2.
Si vous êtes familier avec la configuration de PowerMTA dans ce domaine, vous pouvez passer cette partie, jusqu'à la prochaine ligne horizontale.
Configuration d'injection
Nous utiliserons le port 587 pour les messages injectés, qui passeront par Internet public depuis un autre hôte. Nous devons empêcher les mauvais acteurs de découvrir et d'abuser de ce service, nous appliquons donc une authentification par nom d'utilisateur/mot de passe et un TLS facultatif, similaire aux points d'injection SMTP de SparkPost.
Nous voulons pouvoir envoyer des messages depuis des sources correctement authentifiées vers n'importe quelle destination. Nous voulons également un écouteur distinct sur le port 25 pour les réponses FBL et de rebond à distance qui ne nécessitent pas d'authentification.
# # Adresse(s) IP et port(s) sur lesquels écouter les connexions SMTP entrantes # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25
Dans les déclarations <source> suivantes, nous utilisons une authentification par nom d'utilisateur/mot de passe et un TLS facultatif pour se défendre contre l'injection de messages malveillants. Nous définissons également des limites de débit sur les connexions effectuant des tentatives de mot de passe échouées.
Votre configuration peut être différente; par exemple, si vous avez un réseau privé entre l'injecteur et PowerMTA, vous n'aurez pas besoin d'authentification par mot de passe.
# Une règle source pour toute injection, interne ou externe. Appliquer l'authentification, sauf pour les rebonds et FBLs # <source 0/0> log-connections false log-commands false # ATTENTION : verbeux ! juste pour dev log-data false # ATTENTION : encore plus verbeux ! smtp-service true # autoriser le service 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 # uniquement si l'authentification réussit default-virtual-mta default process-x-job true </source>
La déclaration <source {auth}> (voir ici. v5.0) s'applique une fois l'authentification réussie. Ici, elle permet le relais continu, configure le groupe MTA virtuel par défaut à utiliser, et ajoute l'en-tête X-Job (qui sera rapporté par SparkPost Signals comme campaign_id).
La liste de réécriture mappe les messages injectés pour utiliser un domaine MAIL FROM spécifique (alias domaine de rebond ou Return-Path:).
# # Réécrire l'adresse MAIL FROM pour correspondre au domaine de rebond # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>
Ensuite, nous configurons notre configuration TLS et le nom d'utilisateur/mot de passe SMTP, selon les recommandations actuelles.
# # Sécuriser le service entrant avec nom d'utilisateur, mot de passe et 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 # # Utilisateurs SMTP (authentifiés via SMTP AUTH) # <smtp-user SMTP_Injection> password ##METTEZ ICI VOTRE MOT DE PASSE## authentication-method password </smtp-user>
Nous pouvons vérifier que le TLS v1.0 (non sécurisé, obsolète) n'est pas accepté en utilisant mon outil de test SMTP préféré, swaks.
swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1
Nous voyons :
*** Échec du démarrage TLS (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS tenté mais échoué
De même pour –tls-protocol tlsv1_1.
Appliquons également une signature DKIM sur nos messages sortants, car c'est une bonne pratique (j'ai suivi ces instructions pour configurer la clé).
# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem
FBL and OOB configuration
Maintenant .. enfin .. nous déclarons quels domaines spécifiques sont ouverts pour les réponses de rebond à distance et FBL. Nous ne voulons pas les relayer n'importe où (pour prévenir les attaques de rebond), juste traiter ces réponses en interne.
# # Activer le traitement des rebonds et FBL sur des domaines spécifiques # 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>
Vous pouvez voir que j'ai configuré deux domaines de rebond, car je jouais avec l'utilisation/non-utilisation de la règle de réécriture mfrom.
Le domaine FBL est généralement ensuite enregistré avec des services externes tels que Microsoft SNDS ; voir cet article pour plus d'informations. Pour cette démo, les FBL proviendront de Bouncy Sink, donc pas besoin de s'inscrire.
Test du listener SMTP
Il est important de tester que votre écouteur SMTP exige une autorisation pour toutes les destinations générales, rejetant tous les messages qui ne sont pas spécifiquement adressés aux domaines FBL et de rebonds distants.
swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com
La réponse, comme prévu, montre que le relais est refusé :
550 5.7.1 relais refusé pour le destinataire dans "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>
(Fin de la description de la configuration de démonstration).
Configuration et nomination de VirtualMTA
Les PowerMTA VirtualMTAs (et les pools de VirtualMTA) sont des fonctionnalités puissantes pour gérer les flux de messages, et les fonctionnalités de rapport PowerMTA / SparkPost Signals fonctionnent mieux avec celles-ci actives.
# # Routez tout le trafic sortant à travers ce Virtual MTA / pool. # Déclarez ici l'adresse IP de livraison, afin que les événements d'injection de signaux SparkPost (alias "réception") # transportent l'attribut sending_IP correct # <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. connexions *par domaine* bounce-after 4j12h # 4 jours, 12 heures retry-after 10m # 10 minutes dkim-sign oui </domain> </virtual-mta-pool>
Le paramètre virtual-mta-pool est signalé dans SparkPost comme "IP Pool", et est disponible comme une facette de rapport de SparkPost Signals (le menu déroulant sous les graphiques).

Le rapport récapitulatif montre également IP Pool comme une facette de rapport "Group By".

Comme noté plus tôt dans cet article, configurer au moins une adresse smtp-source-host permet également à SparkPost d'identifier correctement l'adresse IP d'envoi, afin qu'elle apparaisse dans les événements d'injection et de livraison, ainsi que dans le rapport récapitulatif :

C’est tout ce dont vous avez besoin pour obtenir une intégration de base fonctionnant entre PowerMTA et SparkPost Signals. Vous trouverez l’exemple complet de fichier de config ici.
Avant de partir, voici la fonctionnalité bonus que j'ai mentionnée.
Bonus feature : X-Job name checking/filtering
Pour garantir que n'importe quelle chaîne de caractères est sécurisée pour être utilisée comme nom de PowerMTA X-Job, voici une simple fonction Python pour mapper tout caractère non sécurisé à un trait de soulignement “_”
import re def pmtaSafeJobID(s): """ :param s: str :return: str Mappez une chaîne d'ID de campagne arbitraire en caractères autorisés pour l'entête PMTA X-Job. Voir https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid Refuser spécifiquement <sp> " ` mais autoriser la plupart des autres caractères. """ # Note, Il faut échapper ' - [ ] et double-échapper \ - voir https://docs.python.org/3/library/re.html disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]' return re.sub(disallowedChars, '_', s)
Cela utilise les expressions régulières Python d'une manière spécifique. Il déclare l'ensemble des caractères refusés en utilisant l'opérateur de « complément d'ensemble » ^ plutôt que de lister tous les caractères autorisés. Cela signifie que nous capturons (et sécurisons) des caractères au-delà de l'ensemble habituel de 7 bits. Nous pouvons le montrer à l'aide de ce fragment de test :
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
En donnant
_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcde fghijklmnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________
Vous pouvez voir que <SPACE>, les guillemets doubles “, et le backtick `, ainsi que tous les caractères au-delà de ~ sont mappés à un trait de soulignement.