Ajout filtrage mails en cours d'envoi + petite réorganisation des commandes de la section file d'attente

This commit is contained in:
whirigoyen 2022-04-07 15:22:15 +02:00
parent 5d2bc71539
commit 4684b0a6e0

View file

@ -221,6 +221,7 @@ c=connection setup time including DNS, HELO and TLS;
d=message transmission time.
~~~
### File d'attente
Postfix utilise différentes files d'attente (ou queues). Les files d'attente principales sont _incoming_, _active_ et _deferred_ :
@ -235,6 +236,9 @@ Il existe aussi d'autres files d'attente, qui servent beaucoup moins fréquemmen
Ces files d'attente sont des répertoires situés dans `/var/spool/postfix`dans lesquels chaque message est stocké dans un fichier (sur une seule ligne), avec une arborescence de 16 répertoires (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) pour optimiser lorsqu'un grand nombre de messages est dans une file d'attente. On peut gérer ces files d'attente grâce à des commandes d'administration.
#### Lecture et analyse de la file d'attente
`mailq` (ou `sendmail -bp`) liste toutes les files d'attente. Cela nous donne pour chaque message :
* Queue ID
@ -250,69 +254,25 @@ Voici dans quel ordre sont listés les messages :
* Messages de la queue _deferred_
* Messages de la queue _hold_ (un point d'exclamation figure à côté du queue ID)
Exemples pratiques :
**Afficher le contenu d'un message :**
~~~
## Afficher le contenu d'un message
# postcat -vq <queue_id>
## Copier un message dans un fichier
# postcat -vq <queue_id> > themessage.txt
## Supprimer un message (ou tous) des files d'attente
# postsuper -d <queue_id>
# postsuper -d ALL
## Supprimer tous les messages de la queue deferred
# postsuper -d ALL deferred
## Placer en « hold » un message (ou tous)
# postsuper -h <queue_id>
# postsuper -h ALL
## Placer en « hold » tous les messages de la queue deferred
# postsuper -h ALL deferred
## Libérer un message (ou tous) en « hold »
# postsuper -H <queue_id>
# postsuper -H ALL
# Refaire passer un message (ou tous) par les process de livraison
# postsuper -r <queue_id>
# postsuper -r ALL
## Purger des fichiers temporaires (en cas de crash par exemple)
# postsuper -p
## Réparer/vérifier l'arborescence des files d'attente
# postsuper -s
~~~
Pour compter le nombre d'e-mails par adresses expéditrice dans la `mailq` :
**Exclure les mails en cours d'envoi de l'affichage de la file d'attente :**
~~~
# mailq | sed -r '/[[:alnum:]]{11}\*/,+2d'
~~~
**Compter le nombre d'e-mails par adresse expéditrice dans la `mailq` :**
~~~bash
mailq | awk '$1 ~ /^[0-9A-F]+$/ { a[$NF]++ } END { for (i in a) printf "%d %s\n", a[i], i } | sort -n'
~~~
On pourra utiliser ces commandes sur des ensembles de messages via des scripts du type :
~~~
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /user@example\.com$/ { print $1 }' | tr -d '*!' | postsuper -h -
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /example\.com$/ { print $1 }' | tr -d '*!' | postsuper -d -
# mailq | awk '/^[0-9A-Z]+/&&/sender@example\.com$/{print $1}' | tr -d '*!' | postsuper -h -
# mailq | awk '/^[0-9A-Z]+/&&/example\.com$/{print $1}' | tr -d '*!' | postsuper -d -
# mailq > mailq.log ; for var in $(grep <from@example.com> mailq.log | cut -b '1-12'); do postsuper -d $var; done
# # Supprimer les e-mails envoyés par someone@some.where
# mailq | awk '/^[0-9A-F]+[!*]? /&&/someone@some\.where$/{gsub("[!*]", "", $1); print $1 | "postsuper -d -"}'
# # Supprimer les courriels envoyé vers @example.com
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com$/ { r = $1; gsub(/[!*]/, "", r); print r }' | postsuper -d -
~~~
Obtenir la liste les senders triés par ordre croissant du nombre de-mails en attente denvoi
**Obtenir la liste les expéditeurs triés par ordre croissant du nombre de-mails en attente denvoi :**
~~~
# mailq | awk '/^[0-9A-F]+[*!]? /{a[$NF]++}END{for(i in a)print a[i],i | "sort -n"}'
@ -320,16 +280,8 @@ Obtenir la liste les senders triés par ordre croissant du nombre de-mails en
*Note* : le `BEGIN { RS = "" }` est nécessaire car la sortie de mailq peut être sur plusieurs lignes, et le `tr -d '*!'` permet de ne pas prendre les messages en « hold ».
*À savoir* : la commande `postsuper -r` est pratique dans les cas où l'on a modifié des alias ou des ré-écritures, elle va déposer les messages concerné dans la queue _maildrop_ et lui attribuer un nouveau <queue_id>. Attention, cela ne va pas provoquer un envoi immédiat car le traitement des files d'attente est différé. Si l'on veut un ré-envoi immédiat d'un message :
~~~
# postsuper -r <queue_id>
# mailq -q
~~~
/!\\ Attention, `mailq -q` (ou `sendmail -q`) réactive immédiatemment l'ensemble des messages en file d'attente, il faut donc l'utiliser avec modération, surtout sur les serveurs avec des files d'attentes chargées.
La commande **qshape** permettant par exemple de lister les messages dans la file d'attente _deffered_ :
**Lister les messages dans la file d'attente _deffered_ :**
~~~
# qshape deferred
@ -345,6 +297,78 @@ La commande **qshape** permettant par exemple de lister les messages dans la fil
orangr.fr 1 0 0 0 0 0 0 0 0 0 1
prange.fr 1 0 0 0 0 0 0 0 0 0 1
ornage.fr 1 0 0 0 0 0 0 0 0 0 1
# Affichage par sender
# qshape -s deferred
~~~
#### Opérations sur la file d'attente
**Suppressions :**
~~~
## Supprimer un message (ou tous) des files d'attente :
# postsuper -d <queue_id>
## Supprimer tous les messages de la queue deferred
# postsuper -d ALL deferred
## Supprimer tous les messages des files d'attente :
# postsuper -d ALL
# mailq -q
~~~
/!\\ Attention, `postsuper -d ALL` et `mailq -q` réactivent immédiatement l'ensemble des messages en file d'attente, il faut donc les utiliser avec modération, surtout sur les serveurs avec des files d'attentes chargées.
**Divers :**
~~~
## Libérer un message (ou tous) en « hold »
# postsuper -H <queue_id>
# postsuper -H ALL
# Refaire passer un message (ou tous) par les process de livraison
# postsuper -r <queue_id>
# postsuper -r ALL
## Purger des fichiers temporaires (en cas de crash par exemple)
# postsuper -p
## Réparer/vérifier l'arborescence des files d'attente
# postsuper -s
~~~
La commande `postsuper -r` est pratique dans les cas où l'on a modifié des alias ou des ré-écritures, elle va déposer les messages concerné dans la queue _maildrop_ et lui attribuer un nouveau <queue_id>. Attention, cela ne va pas provoquer un envoi immédiat car le traitement des files d'attente est différé. Si l'on veut un ré-envoi immédiat d'un message :
**Hold :**
~~~
## Placer en « hold » un message (ou tous)
# postsuper -h <queue_id>
# postsuper -h ALL
## Placer en « hold » tous les messages de la queue deferred
# postsuper -h ALL deferred
~~~
**Traitement par lot via un pré-filtrage avec Awk :**
On pourra utiliser ces commandes sur des ensembles de messages via des scripts du type :
~~~
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /user@example\.com$/ { print $1 }' | tr -d '*!' | postsuper -h -
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /example\.com$/ { print $1 }' | tr -d '*!' | postsuper -d -
# mailq | awk '/^[0-9A-Z]+/&&/sender@example\.com$/{print $1}' | tr -d '*!' | postsuper -h -
# mailq | awk '/^[0-9A-Z]+/&&/example\.com$/{print $1}' | tr -d '*!' | postsuper -d -
# mailq > mailq.log ; for var in $(grep <from@example.com> mailq.log | cut -b '1-12'); do postsuper -d $var; done
## Supprimer les e-mails envoyés par someone@some.where
# mailq | awk '/^[0-9A-F]+[!*]? /&&/someone@some\.where$/{gsub("[!*]", "", $1); print $1 | "postsuper -d -"}'
## Supprimer les courriels envoyé vers @example.com
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com$/ { r = $1; gsub(/[!*]/, "", r); print r }' | postsuper -d -
~~~
Supprimer les mails correspondant à ce type de ligne :
@ -353,12 +377,11 @@ Supprimer les mails correspondant à ce type de ligne :
6B28125849 3039 Fri Sep 25 07:27:53 MAILER-DAEMON
(host mx2.foo.com[1.2.3.4] said: 452 Too many incoming emails for this account (in reply to RCPT TO command))
mail.example.com
~~~
~~~
# mailq | awk '/^[0-9A-F]+/&&/MAILER-DAEMON$/{id=$1} /mail@example.com$/{print id}' | postsuper -d -
~~~
### Notifications
Postfix envoie des notifications à ajuster avec l'option `notify_classes`.