Déploiement des Signaux pour On-Premises : Intégration PowerMTA

Oiseau

30 août 2019

Email

1 min read

Déploiement des Signaux pour On-Premises : Intégration PowerMTA

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 ... successfully et 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) ou pmta.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-space supprime 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ête X-Job de 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.

# # 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   # this turns on the open and click tracking in PowerMTA
customer-id 123                 # Your SparkPost account number here
</signals>

enable-signals true

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 :

2019-07-26 11:50:57 Signals: Discovered sp1-0000000000003FBD.json
2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json successfully.
2019-07-26 11:50:57 Signals: Discovered 1 file, transferred 1 file successfully

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 .

track.mycompany.com CNAME pmta.spgo.io      # if you have a SparkPost US account
track.mycompany.com CNAME pmta.eu.spgo.io   # if you have a SparkPost EU account

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").

Show original option highlighted


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.

HTML code highlighted


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

Vous pouvez sélectionner des signaux pour être actifs :

  • Globalement (c'est ce que nous avons utilisé dans l'exemple ci-dessus)

  • Pour certains MTAs virtuels et pas d'autres

  • Pour certains pools de MTAs virtuels et pas d'autres

  • Pour des adresses "Sender" ou "From" spécifiques relayées par PowerMTA, en combinaison avec les sélections de Virtual MTA / pool de Virtual MTA

Cette configuration est très puissante et est illustrée à travers une série de cas d'utilisation d'exemple (v5.0) dans le Guide de l'utilisateur.

Vous pouvez sélectionner des signaux pour être actifs :

  • Globalement (c'est ce que nous avons utilisé dans l'exemple ci-dessus)

  • Pour certains MTAs virtuels et pas d'autres

  • Pour certains pools de MTAs virtuels et pas d'autres

  • Pour des adresses "Sender" ou "From" spécifiques relayées par PowerMTA, en combinaison avec les sélections de Virtual MTA / pool de Virtual MTA

Cette configuration est très puissante et est illustrée à travers une série de cas d'utilisation d'exemple (v5.0) dans le Guide de l'utilisateur.

Vous pouvez sélectionner des signaux pour être actifs :

  • Globalement (c'est ce que nous avons utilisé dans l'exemple ci-dessus)

  • Pour certains MTAs virtuels et pas d'autres

  • Pour certains pools de MTAs virtuels et pas d'autres

  • Pour des adresses "Sender" ou "From" spécifiques relayées par PowerMTA, en combinaison avec les sélections de Virtual MTA / pool de Virtual MTA

Cette configuration est très puissante et est illustrée à travers une série de cas d'utilisation d'exemple (v5.0) dans le Guide de l'utilisateur.

Tester que vos événements atteignent Signals

Voici une vue de SparkPost Signals, connecté à PowerMTA. Vous pouvez voir que le score de santé varie.

Health score dashboard


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.

Signals integration screen

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

(domain portion of “rcpt” field in Accounting file).Recipient Domain
The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA.
  
(domain portion of “orig” in Accounting file).Sending Domain
VirtualMTA (name)—VirtualMTA Pool (name)
  
(“vmtaPool” in accounting file)IP Pool (name)
smtp-source-host a.b.c.d
  
(“dlvSourceIp” in accounting file)Sending IP a.b.c.d
Job (name)
  
(“jobId” in accounting file)Campaign ID (name)—Template (name)
“Subaccount” is not a native PowerMTA concept

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.

Subaccount ID (number)
FBL (event)
Spam Complaint (event)
Remote Bounce (event)
Out-of-Band bounce (event)

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.

# IP address(es) and port(s) on which to listen for incoming SMTP connections
smtp-listener 0.0.0.0:587
smtp-listener 0.0.0.0:25

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.

# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs #
<source 0/0>
log-connections false
log-commands false    # WARNING: verbose! just for dev
log-data false        # WARNING: even more verbose!
smtp-service true     # allow SMTP service
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   # only if the auth succeeds
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 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:).

# # Rewrite the MAIL FROM address to match the bounce domain #
<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.

# # Secure the inbound service with username, password and 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

# # SMTP users (authenticated via SMTP AUTH) #
<smtp-user SMTP_Injection>
password ##PUT YOUR PASSWORD HERE##
authentication-method password
</smtp-user>

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.

swaks --server pmta.signalsdemo.trymsys.net --port 587 \
  --to test@trymsys.net \
  --from any@sparkpost.com \
  --tls \
  --tls-protocol tlsv1

Nous voyons :

*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0))
*** STARTTLS attempted but failed

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é).

# # 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 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.

# # Enable Bounce and FBL processing on specific domains #
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/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.

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

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.

# # Route all outgoing traffic through this virtual mta / pool. #
# Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events
# will carry the correct sending_IP attribute #
<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. connections *per domain*
        bounce-after    4d12h   # 4 days, 12 hours
        retry-after     10m     # 10 minutes
        dkim-sign       yes
    </domain>
</virtual-mta-pool>

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).

Health score dashboard


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

Summary report dashboard


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 :

Summary report with the group by filter set to "Sending IP"

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 « _ »

import re

def pmtaSafeJobID(s):
    """
    :param s: str
    :return: str
    Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header.
    See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid
    Specifically disallow <sp> " ` but allow through most other chars.
    """
    # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html
    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]'
    return re.sub(disallowedChars, '_', s)

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

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________

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.

Autres news

Lire la suite de cette catégorie

A person is standing at a desk while typing on a laptop.

La plateforme AI-native complète qui évolue avec votre business.

A person is standing at a desk while typing on a laptop.

La plateforme AI-native complète qui évolue avec votre business.