Déploiement des Signaux pour On-Premises : Intégration PowerMTA
Oiseau
30 août 2019
1 min read

Points Clés
Objet : Ce guide explique comment intégrer PowerMTA 5.0+ avec SparkPost Signals pour diffuser les données d'événements et d'engagement (rebonds, ouvertures, clics, plaintes pour spam) des MTAs locaux directement dans la couche analytique de SparkPost.
Configuration de base :
Ajoutez enable-signals true et définissez votre point de terminaison SparkPost ingest (https://api.sparkpost.com/api/v1/ingest/events ou l'équivalent UE).
Utilisez une clé API valide avec l'autorisation « Événements entrants : Écriture ».
Spécifiez customer-id et, éventuellement, configurez des domaines de suivi personnalisés pour améliorer la délivrabilité.
Configuration du suivi : Le suivi d'engagement de PowerMTA injecte automatiquement des pixels d'ouverture et de clics dans les emails HTML. Vous pouvez désactiver le suivi par lien avec l'attribut data-msys-clicktrack="0".
Rapports sélectifs : Les Signaux peuvent être activés globalement ou limités à certains VirtualMTAs, pools ou domaines d'expéditeurs, permettant un contrôle précis des données.
Tests & vérification : Utilisez le tableau de bord d'intégration des Signaux et les journaux PowerMTA pour confirmer l'ingestion d'événements et suivre les scores de santé, les rebonds et les métriques d'engagement en temps réel.
Optimisation de la délivrabilité :
Utilisez des noms significatifs pour VirtualMTA et Job — ceux-ci se mappent directement aux pools IP et aux IDs de campagne dans les rapports SparkPost.
Configurez la signature DKIM, l'application TLS, et des règles de relais appropriées pour prévenir les injections non autorisées.
Configuration avancée : L'article inclut également des extraits prêts à l'emploi pour la gestion des demandes avec FBL et des rebonds hors bande, l'injection SMTP authentifiée (port 587), et le code Python pour nettoyer les en-têtes X-Job pour compatibilité.
Points forts des Q&A
Que fait réellement l'intégration Signals ?
Il télécharge automatiquement les événements de message de PowerMTA (injection, livraison, rebond, engagement) dans votre compte SparkPost afin que vous puissiez accéder à des tableaux de bord comme le Health Score, les rapports de Délai et la Surveillance des Pièges à Spam.
Pourquoi intégrer Signals avec un MTA sur site ?
De nombreuses entreprises utilisent une infrastructure de messagerie auto-hébergée pour des raisons de conformité mais souhaitent tout de même bénéficier des capacités d'analyse et de suivi de SparkPost. Signals comble cet écart sans migrer la distribution de courrier vers le cloud.
Comment puis-je vérifier que les événements sont bien envoyés à SparkPost ?
Vérifiez les logs de PowerMTA pour
Signals: Transferred ... successfullyet confirmez les entrées d'événements sous Signals → Events Search dans SparkPost.Puis-je utiliser mon propre domaine de suivi ?
Oui — configurez un CNAME tel que
track.mycompany.com → pmta.spgo.io(US) oupmta.eu.spgo.io(EU), puis enregistrez-le et vérifiez-le dans SparkPost pour maintenir la cohérence de la marque et de la réputation.Qu'en est-il de la confidentialité des données ou de l'utilisation du disque ?
La directive
min-free-spacesupprime automatiquement les anciens fichiers d'événements JSON lorsque l'espace disque est insuffisant, empêchant l'accumulation locale de données de télémétrie.Quel est le « bonus feature » à la fin ?
Un utilitaire regex Python (
pmtaSafeJobID) qui garantit que les noms de campagne/d'emploi utilisent uniquement des caractères valides dans le format d'en-têteX-Jobde PowerMTA, remplaçant les caractères non sécurisés par des underscores.
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 des Signaux est décrite dans la section 10.1 du Guide de l'utilisateur 5.0. Ici, nous commencerons par le "Cas d'utilisation #2", qui active les Signaux pour tout le trafic provenant de cet hôte PowerMTA, et active le suivi de l'engagement SparkPost.
Voici ce que fait chaque attribut :
api-key
C'est unique à votre compte SparkPost, c'est la valeur que vous avez obtenue de SparkPost précédemment.
upload-url
Cela doit correspondre à l'adresse de votre service API SparkPost, qu'il soit aux États-Unis ou dans l'UE. 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 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 lorsqu'il n'y a pas de trafic, vous verrez :
2019-07-26 11:47:57 Signals: Discovered 0 files
Avec du trafic, vous verrez quelque chose comme :
min-free-space
Cela indique à PowerMTA le seuil d'espace disque à partir duquel il doit commencer à supprimer les fichiers d'événements JSON SparkPost les plus anciens pour faire de la place pour de nouveaux fichiers lorsque l'espace disque est faible.
enable-signals
Cela indique à PowerMTA de télécharger vers les Signaux, dans ce cas globalement pour tout le trafic (plus d'informations ici, pour la 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 être signalé comme appartenant à un sous-compte SparkPost – c'est une autre façon de distinguer un flux de trafic particulier d'un autre.
engagement-tracking, customer-id
La solution de suivi de l'engagement de PowerMTA utilise par défaut le domaine de suivi pour le service hébergé par SparkPost US. 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 ce qui 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 .
Vous pouvez également utiliser des domaines de suivi HTTPS, mais cela est plus complexe (voir les étapes de configuration SparkPost pour les domaines de suivi HTTPS).
Enregistrez le domaine de suivi dans votre compte SparkPost, et vérifiez-le. Attendez quelques minutes avant d'essayer, pour permettre à vos modifications DNS de se propager sur Internet, selon votre fournisseur DNS.
Configurez PowerMTA pour utiliser ce domaine à la place du défaut, avec
tracking-domain yourdomain.com # Mettez votre propre domaine ici
Vous pouvez vérifier que vos emails délivrés ont des "pixels d'ouverture" ajoutés et les liens enveloppés, en regardant l'intérieur du mail (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'email. Chaque lien HTML est également modifié pour avoir REF pointant vers le domaine de suivi.

C'est tout ce dont vous avez besoin pour obtenir SparkPost Signals fonctionnant avec le suivi de l'engagement intégré de PowerMTA.
Empêcher des liens spécifiques dans votre email HTML d'être suivis
Vous pouvez empêcher PowerMTA de suivre des liens spécifiques, en définissant l'attribut personnalisé data-msys-clicktrack à "0" :
<a href="#" data-msys-clicktrack="0">Example</a>
PowerMTA ne va pas envelopper 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 pools VirtualMTA de PowerMTA et les noms de tâches pour qu'ils soient significatifs et lisibles est une tâche qui en vaut la peine. Ceux-ci apparaissent directement dans vos facettes de Signaux SparkPost et dans le rapport de synthèse.
Comme mentionné précédemment, il n'est pas nécessaire 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 / Terme Rapports / Signaux SparkPost Domaine du destinataire
Cependant, PowerMTA peut marquer les virtualMTAs, les pools de virtual MTA ou les domaines Sender-or-From avec un ID de sous-compte pour les besoins des rapports de SparkPost.
Configurer au moins une adresse smtp-source-host permet également à SparkPost d’identifier correctement l'adresse IP d'envoi afin qu'elle apparaisse sur les événements d'injection et de livraison, ainsi que dans la vue de synthèse du rapport.
Les noms de tâches sont définis dans PowerMTA par le biais d'un en-tête dans le message injecté. En plus de permettre le contrôle individuel des tâches (pause/reprise, etc.), ce qui est utile en soi, PowerMTA transmet les noms aux rapports Signaux de SparkPost sous l'intitulé “ID de campagne”. Voir le guide utilisateur v5.0 section 12.8 “Suivi d'une campagne dans PowerMTA avec un JobID”.
Il y a quelques éléments à prendre en compte concernant la nomination des tâches. Bien que SparkPost (avec le format JSON et l'échappement JSON) autorise des caractères tels que <ESPACE> dans les noms de campagnes, 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 non autorisés incluent <ESPACE>, les guillemets doubles “ et l'accent grave `. Si vous avez l'habitude de travailler avec des noms de tâches X-Job, cela ne vous surprendra pas et vos noms d'ID de campagne fonctionneront “simplement” dans les rapports SparkPost. Si, comme moi, vous avez appris SparkPost en premier, vous pourriez vouloir un outil pour vous assurer que vos valeurs X-Job sont sûres ; voyez 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 viendront d'Internet public d'un autre hôte. Nous devons empêcher que des acteurs malveillants découvrent et abusent de ce service, donc nous appliquons l'authentification par nom d'utilisateur/mot de passe et TLS optionnel, similaire aux points d'injection SMTP de SparkPost.
Nous voulons être capables d'envoyer des messages depuis des sources correctement authentifiées vers n'importe quelle destination. Nous voulons également un écouteur séparé sur le port 25 pour les FBL et les réponses de rebond à distance qui ne nécessitent pas d'authentification.
Dans les déclarations <source> suivantes, nous utilisons l'authentification par nom d'utilisateur/mot de passe et TLS optionnel pour se défendre contre l'injection de messages malveillants. Nous fixons également des limites de taux 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.
La déclaration <source {auth}> (voir ici. v5.0) s'applique une fois l'authentification réussie. Ici, elle permet la relayeuse continue, 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 le domaine de rebond ou Return-Path:).
Ensuite, nous configurons notre configuration TLS et le nom d'utilisateur / mot de passe SMTP, selon les recommandations actuelles.
Nous pouvons vérifier que le TLS v1.0 (non sécurisé, obsolète) n'est pas accepté à l'aide de mon outil de test SMTP préféré, swaks.
Nous voyons :
Pareillement 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é).
FBL and OOB configuration
Maintenant .. enfin .. nous déclarons quels domaines spécifiques sont ouverts pour les rebonds à distance et les réponses FBL. Nous ne voulons pas les relayer ailleurs (pour prévenir les attaques de rebond), juste traiter ces réponses en interne.
Vous pouvez voir que j'ai configuré deux domaines de rebond, car je jouais avec l'utilisation/la non-utilisation de la règle de réécriture mfrom .
Le domaine FBL est généralement alors enregistré auprès de services externes tels que Microsoft SNDS; consultez cet article pour plus d'informations. Pour cette démo, les FBL viendront de la Bouncy Sink, donc pas besoin de s'enregistrer.
Test du listener SMTP
Il est important de tester que votre auditeur 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 remote-bounce.
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
PowerMTA VirtualMTAs (et pools de VirtualMTA) sont des fonctionnalités puissantes pour gérer les flux de messages, et les fonctionnalités de reporting PowerMTA/SparkPost Signals fonctionnent mieux avec ceux-ci actifs.
Le paramètre virtual-mta-pool est signalé dans SparkPost comme "IP Pool", et est disponible comme une facette de reporting SparkPost Signals (le menu déroulant sous les graphiques).

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

Comme mentionné 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 sur les événements d'injection et de livraison, ainsi que sur 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 config ici.
Avant de partir, voici la fonctionnalité bonus que j'ai mentionnée.
Bonus feature : X-Job name checking/filtering
Pour garantir que toute chaîne de caractères est sûre à utiliser comme nom de PowerMTA X-Job, voici une fonction Python simple pour convertir tous les caractères non sécurisés en un underscore « _ »
Cela utilise les expressions régulières Python de manière spécifique. Il déclare l'ensemble des caractères refusés en utilisant l'opérateur « complément d'ensemble » ^ plutôt que de lister tous les caractères autorisés. Cela signifie que nous capturons (et sécurisons) les caractères au-delà de l'ensemble habituel de 7 bits. Nous pouvons le montrer en utilisant ce fragment de test :
s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))
Ce qui donne
Vous pouvez voir que <SPACE>, les guillemets doubles “, et l'accent grave `, ainsi que tous les caractères au-delà de ~ sont convertis en underscore.



