lumnik. / scénarios Tous les scénarios

Le relais SMTP a changé de mot de passe: trois alertes de chambre froide ne partent pas, l'astreinte le sait

Objectif Envoyer par mail les sorties de plage d'une chambre froide, savoir le jour même qu'un mail n'est pas parti et pourquoi, puis le renvoyer sans doublon.

Une centrale pharmaceutique stocke ses médicaments entre 2 et 8 °C dans deux chambres froides. L'enregistreur exporte ses relevés une fois par jour; une sortie de plage part par mail au responsable qualité, par le relais SMTP de l'entreprise.

cold-rooms-20261108.csv
reading_id;room;probe;read_at;temp_c
CF-1-2026110800;CF-1;PT100-0412;2026-11-08 00:00;4.7
CF-2-2026110800;CF-2;PT100-0418;2026-11-08 00:00;6.1
CF-1-2026110801;CF-1;PT100-0412;2026-11-08 01:00;5.3
CF-2-2026110801;CF-2;PT100-0418;2026-11-08 01:00;5.2
CF-1-2026110802;CF-1;PT100-0412;2026-11-08 02:00;6.0
CF-2-2026110802;CF-2;PT100-0418;2026-11-08 02:00;5.8
CF-1-2026110803;CF-1;PT100-0412;2026-11-08 03:00;5.2
CF-2-2026110803;CF-2;PT100-0418;2026-11-08 03:00;5.4
CF-1-2026110804;CF-1;PT100-0412;2026-11-08 04:00;4.0
CF-2-2026110804;CF-2;PT100-0418;2026-11-08 04:00;6.2
CF-1-2026110805;CF-1;PT100-0412;2026-11-08 05:00;5.8
CF-2-2026110805;CF-2;PT100-0418;2026-11-08 05:00;4.0
CF-1-2026110806;CF-1;PT100-0412;2026-11-08 06:00;6.0
CF-2-2026110806;CF-2;PT100-0418;2026-11-08 06:00;4.8
CF-1-2026110807;CF-1;PT100-0412;2026-11-08 07:00;4.9
CF-2-2026110807;CF-2;PT100-0418;2026-11-08 07:00;4.8
CF-1-2026110808;CF-1;PT100-0412;2026-11-08 08:00;5.5
CF-2-2026110808;CF-2;PT100-0418;2026-11-08 08:00;4.6
CF-1-2026110809;CF-1;PT100-0412;2026-11-08 09:00;4.9

… 29 lignes de plus

cold-rooms-20261109.csv
reading_id;room;probe;read_at;temp_c
CF-1-2026110900;CF-1;PT100-0412;2026-11-09 00:00;3.9
CF-2-2026110900;CF-2;PT100-0418;2026-11-09 00:00;4.8
CF-1-2026110901;CF-1;PT100-0412;2026-11-09 01:00;4.2
CF-2-2026110901;CF-2;PT100-0418;2026-11-09 01:00;4.4
CF-1-2026110902;CF-1;PT100-0412;2026-11-09 02:00;4.2
CF-2-2026110902;CF-2;PT100-0418;2026-11-09 02:00;3.8
CF-1-2026110903;CF-1;PT100-0412;2026-11-09 03:00;4.5
CF-2-2026110903;CF-2;PT100-0418;2026-11-09 03:00;4.7
CF-1-2026110904;CF-1;PT100-0412;2026-11-09 04:00;5.2
CF-2-2026110904;CF-2;PT100-0418;2026-11-09 04:00;6.1
CF-1-2026110905;CF-1;PT100-0412;2026-11-09 05:00;5.2
CF-2-2026110905;CF-2;PT100-0418;2026-11-09 05:00;4.1
CF-1-2026110906;CF-1;PT100-0412;2026-11-09 06:00;4.2
CF-2-2026110906;CF-2;PT100-0418;2026-11-09 06:00;4.5
CF-1-2026110907;CF-1;PT100-0412;2026-11-09 07:00;4.0
CF-2-2026110907;CF-2;PT100-0418;2026-11-09 07:00;4.5
CF-1-2026110908;CF-1;PT100-0412;2026-11-09 08:00;4.2
CF-2-2026110908;CF-2;PT100-0418;2026-11-09 08:00;5.5
CF-1-2026110909;CF-1;PT100-0412;2026-11-09 09:00;4.3

… 29 lignes de plus

IT
$ relay: alertes-qualite now logs in with the new password only

preuves: replay.log, hub-monday.txt, deliveries-monday.txt, relay-inbox-monday.txt, relay-tuesday.txt, inbox-tuesday.txt, deliveries-tuesday.txt, webhook-received.txt, hub-fixed.txt, replay.txt, replay-sent.txt, deliveries-fixed.txt, relay-inbox-fixed.txt · transform v1

cold-rooms-20261110.csv
reading_id;room;probe;read_at;temp_c
CF-1-2026111000;CF-1;PT100-0412;2026-11-10 00:00;4.1
CF-2-2026111000;CF-2;PT100-0418;2026-11-10 00:00;5.1
CF-1-2026111001;CF-1;PT100-0412;2026-11-10 01:00;6.2
CF-2-2026111001;CF-2;PT100-0418;2026-11-10 01:00;6.0
CF-1-2026111002;CF-1;PT100-0412;2026-11-10 02:00;8.4
CF-2-2026111002;CF-2;PT100-0418;2026-11-10 02:00;5.1
CF-1-2026111003;CF-1;PT100-0412;2026-11-10 03:00;9.7
CF-2-2026111003;CF-2;PT100-0418;2026-11-10 03:00;4.5
CF-1-2026111004;CF-1;PT100-0412;2026-11-10 04:00;10.3
CF-2-2026111004;CF-2;PT100-0418;2026-11-10 04:00;3.8
CF-1-2026111005;CF-1;PT100-0412;2026-11-10 05:00;3.9
CF-2-2026111005;CF-2;PT100-0418;2026-11-10 05:00;6.0
CF-1-2026111006;CF-1;PT100-0412;2026-11-10 06:00;4.5
CF-2-2026111006;CF-2;PT100-0418;2026-11-10 06:00;3.9
CF-1-2026111007;CF-1;PT100-0412;2026-11-10 07:00;5.8
CF-2-2026111007;CF-2;PT100-0418;2026-11-10 07:00;3.9
CF-1-2026111008;CF-1;PT100-0412;2026-11-10 08:00;4.2
CF-2-2026111008;CF-2;PT100-0418;2026-11-10 08:00;4.9
CF-1-2026111009;CF-1;PT100-0412;2026-11-10 09:00;4.5

… 29 lignes de plus

$ lm notify replay 17
delivery 17: sent

$ lm notify replay 18
delivery 18: sent

$ lm notify replay 19
delivery 19: sent

$ lm notify replay 16
Error: API error 409: this mail was sent; it is not sent twice

$ lm notify deliveries
ID  RECIPIENT                        EVENT                            STATUS          ATTEMPTS  WHEN              ERROR
11  qualite-m2@pharma-depot.example  decision.cold-room-excursion-m2  given up: send  3         2026-11-08 21:18  authentication refused (SMTP 535)
10  qualite-m2@pharma-depot.example  decision.cold-room-excursion-m2  given up: send  3         2026-11-08 21:18  authentication refused (SMTP 535)
9   qualite-m2@pharma-depot.example  decision.cold-room-excursion-m2  given up: send  3         2026-11-08 21:18  authentication refused (SMTP 535)
7   qualite-m1@pharma-depot.example  decision.cold-room-excursion-m1  given up: send  3         2026-11-08 21:13  authentication refused (SMTP 535)
6   qualite-m1@pharma-depot.example  decision.cold-room-excursion-m1  given up: send  3         2026-11-08 21:13  authentication refused (SMTP 535)
5   qualite-m1@pharma-depot.example  decision.cold-room-excursion-m1  given up: send  3         2026-11-08 21:13  authentication refused (SMTP 535)
19  qualite-a@pharma-depot.example   decision.cold-room-excursion-a   sent            4         2026-11-08 21:56  
18  qualite-a@pharma-depot.example   decision.cold-room-excursion-a   sent            4         2026-11-08 21:56  
17  qualite-a@pharma-depot.example   decision.cold-room-excursion-a   sent            4         2026-11-08 21:56  
16  qualite-a@pharma-depot.example   decision.cold-room-excursion-a   sent            1         2026-11-08 21:55  
15  qualite-m3@pharma-depot.example  decision.cold-room-excursion-m3  sent            4         2026-11-08 21:20  
14  qualite-m3@pharma-depot.example  decision.cold-room-excursion-m3  sent            4         2026-11-08 21:20  
13  qualite-m3@pharma-depot.example  decision.cold-room-excursion-m3  sent            4         2026-11-08 21:20  
12  qualite-m3@pharma-depot.example  decision.cold-room-excursion-m3  sent            1         2026-11-08 21:19  
8   qualite-m2@pharma-depot.example  decision.cold-room-excursion-m2  sent            1         2026-11-08 21:17  
4   qualite-m1@pharma-depot.example  decision.cold-room-excursion-m1  sent            1         2026-11-08 21:12  
3   qualite@example.com              decision.trial-mail-excursion    sent            4         2026-11-08 17:15  
2   qualite@example.com              decision.trial-mail-excursion    sent            4         2026-11-08 17:15  
1   qualite@example.com              decision.trial-mail-excursion    sent            1         2026-11-08 17:08  

Limites

  • Le mail renvoyé arrive après la panne: ici, des heures après la sortie de plage. Le hub ne bloque pas les lots; il prévient.
  • Un mot de passe changé abandonne chaque mail: un événement par mail, pas un par panne.
  • Le webhook dit le numéro du mail et la cause, jamais le texte de l'alerte: l'astreinte sait qu'il faut renvoyer, pas ce que disait le mail.
  • Le renvoi se fait mail par mail.
  • Les mots de passe se changent dans la configuration du hub, avec un redémarrage.
  • Relevés, chambres et sondes synthétiques; le relais est un Mailpit local.

Chambres froides · 2-8 °C

Une sortie de plage part par mail.

Au responsable qualité, par le relais SMTP de l'entreprise.

temp_c>8

Le problème

Le relais change de mot de passe. Le hub garde l'ancien.

  • Trois alertes de CF-1 ne partent pas.
  • Le responsable qualité ne reçoit rien, et ne sait pas qu'il devait recevoir.

Ce qui n'est pas modifié

Le relais et l'enregistreur restent tels quels.

  • L'export est celui de l'enregistreur.
  • Le hub se connecte au relais comme n'importe quel logiciel.

Ce qu'il a fallu écrire

lm integration add relay-watch \
  --events notification.mail.given-up

Un mail abandonné prévient l'astreinte.

  • Puis le nouveau mot de passe.
  • Et lm notify replay pour chaque mail.

Ce qui a été corrigé

Un mot de passe refusé et un relais mort se lisaient pareil (#1905).

  • Un mail abandonné est un événement (#1906).
  • L'objet du mail est la phrase de la décision (#1910).

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →