Aller au contenu

Règles

phil/bounce-parser

Une règle est la réponse de l'application à un message qu'aucune norme ne décrit : un motif sur un champ du message, le genre de rebond qu'il signifie, et l'action à laquelle il mène.

use Phil\BounceParser\BounceAction;
use Phil\BounceParser\BounceKind;
use Phil\BounceParser\Rule\Field;
use Phil\BounceParser\Rule\Rule;
use Phil\BounceParser\Rule\Rules;
use Phil\BounceParser\Rule\RuleScope;

$rules = new Rules(
    Rule::containing('quota', Field::Body, 'over quota', BounceKind::Soft),
    Rule::matching('gone', Field::Body, '/account (has been )?(disabled|closed)/i', BounceKind::Hard, BounceAction::Suppress),
    Rule::containing('ticket', Field::Header, 'helpdesk', BounceKind::AutoReply, header: 'X-Mailer'),
    Rule::containing('policy is gone', Field::Diagnostic, 'user does not exist', BounceKind::Hard, scope: RuleScope::Always),
);

Déclarer

ConstructeurMotif
Rule::matching($name, $field, $pattern, $kind, $action, $scope, $header)Une expression régulière PCRE avec ses délimiteurs et ses options
Rule::containing($name, $field, $text, $kind, $action, $scope, $header)Un texte que contient le champ, sans égard à la casse, en UTF-8

L'action vaut par défaut l'action du genre (BounceAction::for()). Un motif qui n'est pas une expression régulière valide, un texte vide, ou une règle sur Field::Header sans nom de champ lève Exception\InvalidRule au moment de sa déclaration, et non à l'arrivée d'un message. Un motif qui échoue sur un message — trop de retours arrière, UTF-8 brisé — ne lui correspond pas.

Champs

FieldLe texte
SubjectL'objet, ses mots encodés décodés
FromLe champ From tel qu'écrit
BodyLes parties texte du message, et non celles du message qu'il retourne, l'une après l'autre, jusqu'à la limite de texte
DiagnosticLes diagnostics des destinataires d'une notification d'état de remise, un par ligne
HeaderChaque valeur du champ nommé, une par ligne

Portées

RuleScopeLa règle est essayée sur
Unrecognised (par défaut)Les messages dont le genre est inconnu : non reconnus, un rebond écrit en texte sans code, une notification sans destinataire
AlwaysChaque message, pour qu'elle puisse corriger ce qu'a décidé l'analyseur

Ordre

Les règles sont essayées dans leur ordre, et la première qui correspond décide : le rapport garde son format et ses destinataires, et prend le genre, l'action et le nom de la règle. Rules::with($rule) ajoute une règle à la fin ; with($rule, before: 'name') et with($rule, after: 'name') la placent à côté d'une règle désignée par son nom — before l'emporte quand les deux sont donnés. Rien n'est ordonné par numéro. Deux règles du même nom, ou un nom de placement qui n'existe pas, lèvent Exception\InvalidRule.

Écrire une règle à partir d'un message

Un message laissé en révision contient les mots dont une règle a besoin : la phrase du serveur dans son texte, son objet, ou un champ qu'il ajoute. Écrivez le texte le plus étroit qui nomme le cas, essayez la règle sur les messages gardés en révision, et gardez peu de règles : chacune coûte une comparaison sur chaque message de sa portée.