
Plongeons dans les détails de la configuration de PowerMTA pour SparkPost Signals.
Plongeons dans 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 une permission de clé API pour « Événements entrants : Écrire » comme décrit ici
Nous allons configurer PowerMTA pour envoyer des événements à votre compte SparkPost, puis vous pourrez utiliser les éléments suivants :
Tout d'abord, installez (ou mettez à niveau) vers PowerMTA 5.0 r4 ou une version ultérieure, en suivant les instructions habituelles d'installation v5.0 qui sont assez simples. Ensuite, nous passerons en revue les étapes suivantes :
Configurer le connecteur PowerMTA vers SparkPost Signals
Configurer le suivi de l'engagement avec un domaine de suivi personnalisé
Sélectionner les flux de trafic PowerMTA à signaler à Signals
Tester que vos événements atteignent Signals
Revoir comment utiliser des noms significatifs qui apparaissent bien dans les rapports.
Nous couvrirons également d'autres aspects spécifiques de la configuration de PowerPMTA utilisés dans notre démo Signals :
Événements FBL (plaintes pour spam) et rebonds à distance (hors bande)
Configuration de l'injection, y compris DKIM
Configuration FBL et OOB
Configuration et nommage 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 nom X-Job de PowerMTA.
Configurer le connecteur PowerMTA
La configuration de 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 provenant de cet hôte PowerMTA, et activera le suivi de l'engagement SparkPost.
# # SparkPost Signals # <signals> api-key ##ma clé API d'insertion ici## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # cela 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
C'est unique pour votre compte SparkPost, c'est la valeur que vous avez reçue de SparkPost plus tôt.
upload-url
Cela doit correspondre à l'adresse de votre service API SparkPost, qu'il soit US ou EU. Pour plus d'informations, voir ici. Les valeurs habituelles sont :
SparkPost (US) : https://api.sparkpost.com/api/v1/ingest/events
SparkPost EU : https://api.eu.sparkpost.com/api/v1/ingest/events
log-verbose
Cette directive est facultative et lorsqu'elle est activée, fournit 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 lorsqu'il n'y a pas 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 auquel il doit commencer à supprimer les plus anciens fichiers d'événements JSON SparkPost pour laisser de la place aux nouveaux fichiers lorsque l'espace disque commence à manquer.
enable-signals
Cela 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 pour le 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 se base par défaut sur le domaine de suivi pour le service hébergé par SparkPost aux États-Unis. Vous spécifiez votre ID client numérique SparkPost ; voici les instructions pour le trouver.
tracking-domain
Pour les comptes SparkPost EU, ajoutez la ligne suivante :
tracking-domain pmta.eu.spgo.io # c'est le point de terminaison pour SparkPost EU
Domaine de suivi personnalisé
Si vous préférez utiliser votre propre domaine de suivi (c'est mieux du point de vue de la délivrabilité), faites le suivant :
Créez un domaine de suivi avec votre fournisseur DNS en créant un enregistrement CNAME. Il s'agira généralement d'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 EU
Vous pouvez également utiliser des domaines de suivi HTTPS, bien que cela soit plus complexe (voir les étapes de configuration de SparkPost pour les domaines de suivi HTTPS).
Enregistrez le domaine de suivi dans votre compte SparkPost, et vérifiez-le. Attendez quelques minutes avant de l'essayer, pour permettre à vos modifications DNS de se propager à travers Internet, selon votre fournisseur DNS.
Configurez PowerMTA pour utiliser ce domaine au lieu de celui 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 d'ouverture” ajoutés et que les liens sont encapsulés, en regardant les détails des e-mails (dans Gmail, utilisez le menu en haut à droite et choisissez “Afficher l'original”).

Vous remarquerez les pixels d'ouverture 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 faire fonctionner SparkPost Signals avec le suivi d'engagement intégré de PowerMTA.
Empêcher le suivi de certains liens dans votre e-mail HTML
Vous pouvez empêcher PowerMTA de suivre certains liens, en définissant l'attribut personnalisé data-msys-clicktrack sur “0” :
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA ne placera pas le lien dans un paquet. 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 arriveront par Internet public depuis un autre hôte. Nous devons empêcher les acteurs malveillants de découvrir et d'abuser de ce service, c'est pourquoi nous appliquons une authentification par nom d'utilisateur/mot de passe et un TLS optionnel, similaire aux points de terminaison d'injection SMTP de SparkPost.
Nous voulons être capables d'envoyer des messages provenant de sources correctement authentifiées vers n'importe quelle destination. Nous voulons également un écouteur séparé sur le port 25 pour les réponses FBL et les rebonds à 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 optionnel pour nous défendre contre l'injection de messages malveillants. Nous fixons également des limites de débit sur les connexions qui tentent des mots de passe incorrects.
Votre configuration peut différer; 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 toutes les injections, internes ou externes. Appliquer l'authentification, sauf pour les rebonds et les FBL # <source 0/0> log-connections false log-commands false # AVERTISSEMENT : verbeux! juste pour le développement log-data false # AVERTISSEMENT : 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 # seulement 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 que l'authentification est passée. Ici, elle permet le relais vers l'avant, configure le groupe MTA virtuel par défaut à utiliser, et ajoute l'en-tête X-Job (qui sera rapporté par SparkPost Signals en tant que 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 ##PUT YOUR PASSWORD HERE## authentication-method password </smtp-user>
Nous pouvons vérifier que le TLS (non sécurisé, obsolète) v1.0 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 :
*** L'initialisation de TLS a échoué (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS tenté mais échoué
De même pour –tls-protocol tlsv1_1.
Appliquons également la 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 relayer ceux-ci n'importe où (pour éviter les attaques par rétrodiffusion), 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 enregistré auprès de services externes tels que Microsoft SNDS ; voir cet article pour plus d'informations. Pour cette démo, les FBL viendront du Bouncy Sink, donc pas besoin de s'enregistrer.
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.