52. pepsi-stage-block-language

Router un message selon la ou les langues humaines détectées dans son corps.

52.1. Rôle

pepsi-stage-block-language est un filtre de politique de langue. Il évalue la ou les langues notées sous state.language (écrites en amont par pepsi-stage-detect-language) par rapport à une liste blanche et une liste noire configurées, et achemine le message : au-dessus du score THRESHOLD il avance vers NEXT_STAGE, sinon ENFORCEMENT décide — hard (la valeur par défaut) le réachemine vers BOUNCE_STAGE en portant un state de DSN d’échec, soft le remet tout de même avec un Subject: marqué. Le corps n’est jamais chargé (le bloc d’en-têtes l’est, car le mode souple réécrit un en-tête) et l’étape ne met jamais le message en pause. Référence : pepsi-stage-block-language(1).

52.2. Calcul du score

state.language est une chaîne de style HTTP Accept-Language d’éléments code;q=quality, chaque quality étant la probabilité de détection de cette langue. L’étape la réduit à un seul nombre :

score = Σ q over languages listed in WHITELIST
      − Σ q over languages listed in BLACKLIST

Les langues qui ne figurent sur aucune des deux listes n’apportent rien. Avec l’anglais en liste blanche et le français en liste noire, en;q=0.7, fr;q=0.3 donne un score de 0.7 − 0.3 = 0.4. Un message dont le score est strictement supérieur à THRESHOLD avance ; sinon il est bloqué.

  • Courrier non détecté. Lorsqu’aucune langue n’a été détectée (state.language absent), le score est calculé par rapport à la pseudo-distribution none;q=1. Le littéral none peut lui-même apparaître dans WHITELIST/BLACKLIST, de sorte que l’opérateur décide du sort du courrier non détecté (mettre none en liste noire lui donne un score de −1, en liste blanche +1, ne le lister nulle part le laisse à 0).

  • Contournement par liste blanche. Un message portant un verdict explicite state.spam = false — posé par une correspondance pepsi-stage-check-whitelist en amont, ou par l’ingress pour la boîte aux lettres réservée <Postmaster> (RFC 5321 §4.5.1) — saute entièrement la politique de langue et avance vers NEXT_STAGE.

  • Ne jamais faire rebondir un rebond. Un message qui est déjà un rebond (l’expéditeur d’enveloppe nul) avance vers NEXT_STAGE quel que soit son score (RFC 5321 §6.1).

52.3. Application stricte et souple

ENFORCEMENT décide de ce qui arrive à un message qui échoue à la politique, et les deux modes sélectionnent exactement le même ensemble de messages — c’est là tout l’intérêt : le marquage prédit le rebond, de sorte qu’un opérateur peut régler WHITELIST/BLACKLIST/ THRESHOLD face à du trafic réel avant qu’aucun courrier ne soit refusé.

  • hard (la valeur par défaut) réachemine vers BOUNCE_STAGE avec un state de DSN d’échec permanent, de sorte que pepsi-stage-bounce n’émet un rebond que si le NOTIFY de l’expéditeur demande FAILURE (la valeur par défaut en son absence). Aucun en-tête n’est touché.

  • soft fait plutôt avancer le message vers NEXT_STAGE, en ajoutant SUBJECT_FLAG_LABEL (par défaut [!LANG]) à son Subject: et en ajoutant un en-tête X-Pepsi-Detected-Languages. Rien n’est rebondi, de sorte qu’aucun BOUNCE_STAGE n’est nécessaire.

Parce que ENFORCEMENT atteint l’étape à travers la couche de réglages par adresse, un compte peut être en apprentissage pendant que le reste du déploiement applique la politique. Réécrire le Subject: casse la signature DKIM de l’émetteur ainsi que notre propre AMS ARC, qui tous deux le sur-signent — sans conséquence sur une branche qui se termine par une remise locale, non sans conséquence sur une branche qui relaie plus loin, de sorte que le mode souple a sa place sur la première.

52.4. Fusion

L’étape a FUSION = yes par défaut : sous le binaire pepsi unifié avec [pepsi] ALLOW_FUSION activé (la valeur par défaut), un prédécesseur peut l’exécuter dans son propre processus worker plutôt que de la dispatcher séparément. Voir pepsi-dispatch.

52.5. Configuration

[stage-<name>] : PROGRAM = pepsi-stage-block-language, NEXT_STAGE (obligatoire — tout message que l’étape ne bloque pas y avance, y compris un expéditeur en liste blanche, un rebond, et tout message simplement marqué sous ``ENFORCEMENT = soft``), BOUNCE_STAGE, les listes de langues WHITELIST/BLACKLIST (au moins l’une doit être non vide, sinon tout message échouerait), le THRESHOLD numérique (par défaut 0.0), ENFORCEMENT (hard — la valeur par défaut — ou soft) et SUBJECT_FLAG_LABEL (par défaut [!LANG], utilisé uniquement en mode souple). pepsi-setup rejette un code de langue invalide ou un chevauchement entre les deux listes, et avertit d’un ENFORCEMENT = hard sans BOUNCE_STAGE (le premier message bloqué échouerait) ainsi que d’une BLACKLIST accompagnée d’une WHITELIST vide et d’un THRESHOLD non négatif. Voir pepsi-stage-block-language(1) et Configuration.

52.6. État

  • Entrées : state.language (traité comme none;q=1 en son absence) et, pour un message bloqué, state.dsn et le destinataire d’enveloppe.

  • Sorties : sur le chemin de passage, state est intact ; sur le chemin de blocage strict, les clés de DSN d’échec que pepsi-stage-bounce consomme (state.bounce) sont fusionnées ; sur le chemin souple, state est intact et c’est le bloc d’en-têtes qui est réécrit à la place.

  • Transitions : score au-dessus de THRESHOLD → avancer vers NEXT_STAGE ; score égal ou inférieur → réacheminer vers BOUNCE_STAGE (hard) ou avancer vers NEXT_STAGE en étant marqué (soft).

52.7. Voir aussi

pepsi-stage-detect-language, pepsi-stage-check-whitelist, pepsi-stage-bounce, Fonctionnalités prises en charge, pepsi-stage-block-language(1).