53. pepsi-stage-vacation

Répondre au courrier qui arrive pendant l’absence du destinataire.

53.1. Rôle

pepsi-stage-vacation est le répondeur d’absence. Lorsque le destinataire d’enveloppe est absent le jour où l’étape s’exécute, elle envoie à l’expéditeur l’avis d’absence de ce destinataire et marque le Subject: de la copie transmise. Le message lui-même continue toujours vers NEXT_STAGE : l’étape ajoute une réponse, elle ne retient, ne supprime ni ne fait rebondir aucun courrier. Référence : pepsi-stage-vacation(1).

53.2. L’absence de qui

L’étape lit ses options à travers la couche de redéfinition par adresse : ce sont donc celles du destinataire d’enveloppe. C’est ce qui permet à une seule étape de servir les deux cas que la fonctionnalité doit couvrir :

[stage-<name>] in pepsi.conf     the operator's default: normally nobody away
  < config_override 'global'       a national holiday, for everybody
  < config_override 'domain:<d>'   a holiday for one served domain
  < config_override 'address:<a>'  a leave the operator enters for someone
  < pepsi.settings[<a>]            the account owner's own leave dates

La chaîne n’est pas une invention de cette étape — Configuration la décrit, et toutes les étapes en bénéficient — mais c’est l’étape qui s’en sert intégralement. Les opérateurs saisissent un jour férié avec pepsi-config, le congé d’un utilisateur avec pepsi-settings ; inscrire vacation dans les EDITABLE_STAGES de pepsi-stage-edit-settings permet aux titulaires de comptes de fixer leurs propres dates par e-mail.

Une ligne portant encore plusieurs destinataires qui partagent une même configuration (deux alias d’une personne, ou tout le monde pendant un jour férié) est scindée en un destinataire par ligne avant qu’aucun avis ne soit construit : chaque avis vient d”*une adresse, et chaque limitation de débit vaut *pour une adresse.

53.3. Quand un avis est envoyé

Lorsque la date du jour — dans le fuseau horaire du serveur, résolue au moment où l’étape s’exécute — tombe dans l’un des VACATION_RANGES (journées entières, bornes comprises ; 2026-08-01: est un congé à durée indéterminée) et que le message est de ceux auxquels il convient de répondre. Le jeu de règles RFC 3834 complet est dans la page de manuel ; en bref, Pepsi ne répond pas aux rebonds, au courrier de liste de diffusion, à tout ce qui est marqué Auto-Submitted: ou Precedence: bulk, aux expéditeurs de service tels que MAILER-DAEMON ou <list>-request, aux rapports de remise, au courrier qu’une étape amont a marqué comme spam, au courrier que le destinataire s’est envoyé à lui-même, ni au courrier qui ne nomme pas le destinataire dans To:/Cc:. En outre, un correspondant reçoit au plus une réponse par SUPPRESS_DAYS (7 par défaut).

Un répondeur d’absence est le seul composant qui émet un message par message reçu : quatre choses le bornent donc à la fois — l”expéditeur d’enveloppe nul de l’avis (rien ne peut y répondre), le Auto-Submitted: auto-replied qu’il porte, la limitation de débit par correspondant (un répondeur qui ignore les deux coûte encore un message par semaine), et le jeton de file d’attente UNIQUE qui empêche une étape réessayée d’envoyer une seconde copie.

53.4. Le message

Le texte de l’avis est un modèle Mustache tenu dans une option INI plutôt que dans un fichier de TEMPLATE_DIR, parce que c’est le message que les utilisateurs écrivent eux-mêmes et que la couche de paramètres porte des options, pas des fichiers. Par langue candidate, l’étape préfère MESSAGE_<LANG> dans la section propre à l’étape (le texte de l’utilisateur) et se rabat sur <LANG> dans DEFAULT_MESSAGE_SECTION — par défaut [pepsi-vacation-default-message], qui est livrée avec dix langues dans ${DATADIR}/config.d, de sorte qu’une valeur par défaut fonctionnelle existe avant que quiconque ne configure quoi que ce soit.

La langue est choisie d’après state.language (écrit par pepsi-stage-detect-language) et se rabat sur DEFAULT_LANGUAGE. Les champs sont {{SENDER_NAME}}, {{VACATION_START}}, {{VACATION_END}} et {{EMERGENCY_CONTACT}} ; les deux derniers sont absents plutôt que vides lorsqu’ils ne s’appliquent pas, de sorte qu’un modèle puisse brancher. Comme une option INI tient sur une ligne, deux espaces deviennent un saut de ligne (quatre, un saut de paragraphe).

53.5. Placement

Après pepsi-stage-detect-language (pour la langue), après pepsi-stage-check-whitelist et pepsi-stage-anti-spam (afin que le spam et le courrier impayé n’attirent aucune réponse), et après pepsi-stage-aliases si des alias sont en usage (la configuration est indexée sur le destinataire d’enveloppe, qui doit alors être l’adresse de l’utilisateur lui-même).

Réécrire le Subject: invalide la signature DKIM de l’auteur et la signature de message ARC propre à Pepsi, qui toutes deux le couvrent — sans conséquence sur une branche se terminant par une remise locale, ce qu’est le placement ci-dessus et celui sur lequel pepsi-stage-decrypt s’appuie déjà. Sur une branche qui relaie le message plus loin, mettez VACATION_TAG = none.

53.6. Configuration

[stage-<name>] : PROGRAM = pepsi-stage-vacation, NEXT_STAGE (obligatoire), RESPONSE_STAGE (obligatoire — où l’avis est injecté pour être signé et relayé), VACATION_RANGES, DEFAULT_LANGUAGE, DEFAULT_MESSAGE_SECTION, EMERGENCY_CONTACT, VACATION_TAG, SUPPRESS_DAYS, REQUIRE_ADDRESSED_TO et SUBJECT_PREFIX. pepsi-setup rejette une plage de dates erronée, un NEXT_STAGE/RESPONSE_STAGE non résoluble, et une configuration sans message pour DEFAULT_LANGUAGE. Voir pepsi-stage-vacation(1) et Configuration.

53.7. État

  • Entrées : state.language (pour la langue de l’avis), state.local_origin (un message soumis localement ne reçoit jamais de réponse), state.spam.

  • Sorties : state.vacation note qu’un avis est parti, pour qui, pour quelle plage et dans quelle langue — de sorte que pepsi-stage-if puisse brancher dessus et que pepsi-queue l’affiche. Rien d’autre dans state n’est touché, et state.dsn est préservé.

  • Transitions : toujours avancer vers NEXT_STAGE ; un avis distinct à expéditeur nul est injecté à RESPONSE_STAGE.

53.8. Base de données

pepsi.vacation_reply (une ligne par correspondant à qui il a été répondu) et vacation_should_reply(), qui revendique et note le droit de répondre en une seule instruction, de sorte que deux workers ne puissent pas répondre tous deux au même correspondant. Les lignes vieillies sont élaguées au passage ; il n’y a aucune tâche à planifier.

53.9. Voir aussi

pepsi-stage-detect-language, pepsi-stage-edit-settings, pepsi-settings, pepsi-config, Fonctionnalités prises en charge, pepsi-stage-vacation(1).