Postfix: changer d'expéditeur dans les messages en file d'attente

8

Suite à une réinstallation complète, nous avons eu un problème avec la configuration: l'adresse de l'expéditeur était incorrecte et certains destinataires (serveurs de messagerie) les ont rejetés.

Il y a donc un tas de mails coincés dans la file d'attente Postfix.

Idéalement, un changement de l'adresse de l'expéditeur directement dans les e-mails en file d'attente, puis le vidage de la file d'attente serait optimal.

J'ai essayé cette réponse qui résout ce problème. Mais les messages ne semblent pas être facilement modifiables dans la version que j'ai (2.11.0).

Par exemple, il n'y a pas de /var/spool/mqueuerépertoire, mais, à la place,/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

et le dir d'intérêt est deferred. J'ai essayé de modifier quelques fichiers en changeant le mauvais domaine avec le bon (et j'ai veillé à ce que seuls ceux-ci soient modifiés).

Mais ensuite, ces e-mails ont été déplacés vers corrupt, ce qui signifie qu'un simple changement de texte ne semble pas fonctionner (fait avec vi).

Une autre façon plus propre de changer l'expéditeur dans les e-mails en file d'attente?

e2-e4
la source

Réponses:

19

J'ai essayé cette réponse qui résout ce problème. Mais les messages ne semblent pas être facilement modifiables dans la version que j'ai (2.11.0).

Par exemple, il n'y a pas de répertoire / var / spool / mqueue, mais, à la place, / var / spool / postfix / ...

Je veux clarifier deux choses.

  • Tout d'abord, cette réponse a été appliquée à sendmail NOT postfix.
  • Deuxièmement, les fichiers de file d'attente brute de manipulation directe n'étaient pas du tout pris en charge.

Donc, vous avez plusieurs options ici

1. Paramètre smtp_generic_maps

Cette réponse s'inspire de cette excellente réponse . Il réécrira automatiquement l'ancienne adresse en nouvelle adresse. Vous pouvez définir un fichier pour mapper l'ancienne adresse à la nouvelle adresse.

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    [email protected]       [email protected]

N'oubliez pas de postmap /etc/postfix/genericcourirpostfix reload

  • À l'envers: vous n'avez pas besoin de remettre le message en file d'attente
  • Inconvénient: Postfix réécrira l' adresse de l'expéditeur et du destinataire correspondant [email protected].

2. sender_canonical_address

Pour surmonter l'inconvénient de la première option, vous pouvez utiliser sender_canonical_maps. Cette solution basée sur la suggestion de l'auteur de Postfix . Identique à la première option, vous pouvez définir un fichier pour mapper l'ancienne adresse à la nouvelle adresse.

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    [email protected]       [email protected]

Exécutez postmap /etc/postfix/sender_canonicalpuis exécutez postfix reload. En raison du flux de la file d'attente postfix, vous devez remettre en file d'attente la file d'attente affectée avec la commandepostsuper -r queueid

  • À l'envers: Postfix ne réécrit pas l'adresse du destinataire.
  • Inconvénient: vous devez remettre en file d'attente tous les messages concernés. Mais vous pouvez requeue tout différé avec une seule commandepostsuper -r ALL deferred

3. manipulation directe de la file d'attente postfix

Il s'agit d'anciennes méthodes manuelles pour modifier la file d'attente pour un traitement avancé. Cette réponse est venue des listes de diffusion des utilisateurs de postfix

En bref

  • Extraire la file d'attente

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • Renvoyer la file d'attente et supprimer l'ancienne file d'attente

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

Pour la documentation de la commande ci-dessus, reportez-vous à cette page

Remarque:
solution originale issue des listes de diffusion des utilisateurs de postfix , à utiliser postcat -q queueid >tempfilepour extraire la file d'attente. Cette commande extraira l'en-tête, le corps et les méta-informations de la file d'attente. Comme indiqué Azendale ci - dessous , sendmailrefusera d'envoyer cet e-mail mal formé en raison de méta-informations.

L'utilisation d'un -bhparamètre en plus du qparamètre fera filtrer postcat la sortie vers l'en-tête et le corps uniquement, sans inclure les méta-informations. Un avantage secondaire de ceci est que le fichier temporaire est au format que la plupart des clients de messagerie reconnaissent comme format .eml, vous permettant d'afficher le message résultant (modifié).

masegaloeh
la source
1
J'ai essayé cela, et au moins avec ma version de postfix, il ne semblait pas envoyer le message jusqu'à ce que j'utilise quelque chose comme postcat -qbh queueid >tempfile. (Avantage secondaire: il est alors au format .eml.) Si je viens de l'utiliser, -qil ne semble rien faire lorsque je lance sendmail. Postfix version 2.8.4. Quelqu'un peut-il confirmer cela? Si oui, modifions cette réponse.
Azendale
Salut @ Azendale, j'ai retesté la troisième solution et oui, nous devons l'utiliser qbhpour la faire fonctionner. Ajout de l'explication dans la réponse mise à jour ... :)
masegaloeh
Merci ! Je cherchais une troisième solution comme. c'est juste parfait!
JazZ
1

Grand livre. J'ai eu un problème avec un serveur de messagerie qui fonctionnait depuis quelques jours avec une mauvaise configuration et donc il y avait beaucoup de files d'attente qui devaient être renvoyées avec le nouveau destinataire. J'ai donc créé deux liners pour parcourir toutes les files d'attente:

Premier à trouver toutes les files d'attente, à les mettre en attente, à les enregistrer en tant que fichiers .eml et à les renvoyer:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

Deuxième pour supprimer les files d'attente:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

N'oubliez pas de vérifier qu'aucune nouvelle file d'attente n'est en attente avant d'exécuter ce dernier code. Pour ce faire, émettez ceci et recherchez les identifiants de file d'attente sans '!' à la fin:

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

On pouvait facilement mettre ces deux doublures en une, mais je sentais que j'avais plus de contrôle en vérifiant que les mails étaient bien reçus avant de supprimer les files d'attente.

Jorn
la source