Postfix: изменить отправителя в очереди сообщений

8

После полной переустановки у нас возникла проблема с настройкой: адрес отправителя был неправильным, и некоторые получатели (почтовые серверы) отклонили их.

Так что в очереди Postfix застряла куча писем.

В идеале, изменение адреса отправителя непосредственно в очереди сообщений, а затем очистка очереди будет оптимальным.

Я попробовал этот ответ, который решает эту проблему. Но сообщения не кажутся легко изменяемыми в версии, которую я имею (2.11.0).

Например, нет /var/spool/mqueuedir, но вместо этого/var/spool/postfix/...

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

и интерес представляет deferred. Я попытался изменить несколько файлов, изменив неправильный домен на правильный (и старался, чтобы только те были изменены).

Но затем эти письма были перемещены в corrupt, что означает, что простое изменение текста, кажется, не работает (сделано с vi).

Любой другой более чистый способ изменить отправителя в очереди почты?

e2-e4
источник

Ответы:

19

Я попробовал этот ответ, который решает эту проблему. Но сообщения не кажутся легко изменяемыми в версии, которую я имею (2.11.0).

Например, нет / var / spool / mqueue dir, но вместо этого / var / spool / postfix / ...

Я хочу уточнить две вещи.

  • Во-первых, этот ответ был применен к sendmail, а не к postfix.
  • Во-вторых, прямые манипуляции с необработанными файлами очереди вообще не поддерживались.

Итак, у вас есть несколько вариантов здесь

1. параметр smtp_generic_maps

Этот ответ вдохновлен этим превосходным ответом . Он автоматически перезапишет старый адрес на новый. Вы можете определить файл для отображения старого адреса на новый адрес.

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

/etc/postfix/generic:
    account@localdomain.example.com       account@example.com

Не забудь postmap /etc/postfix/genericи бегиpostfix reload

  • Перевернутая сторона : вам не нужно запрашивать сообщение
  • Недостаток: Postfix переписывает адреса отправителя и получателя, которые соответствуют account@localdomain.example.com.

2. sender_canonical_address

Чтобы преодолеть недостатки первого варианта, вы можете использовать sender_canonical_maps. Это решение основано на предложении автора Postfix . Как и в первом варианте, вы можете определить файл для сопоставления старого адреса с новым.

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

/etc/postfix/sender_canonical:
    account@localdomain.example.com       account@example.com

Беги, postmap /etc/postfix/sender_canonicalбеги postfix reload. Из-за потока очереди postfix, вы должны переместить очередь в очередь с помощью командыpostsuper -r queueid

  • Upside: Postfix не переписывает адрес получателя.
  • Недостаток: Вы должны переоформить все затронутые сообщения. Но вы можете вернуть все отсроченные одной командойpostsuper -r ALL deferred

3. прямое манипулирование постфиксной очередью

Это старые способы ручного изменения очереди для расширенной обработки. Этот ответ пришел из списков рассылки postfix-users

Короче говоря

  • Извлечь очередь

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • Повторно отправить очередь и удалить старую очередь

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

Для документации вышеупомянутой команды, обратитесь к этой странице

Примечание:
оригинальное решение из списков рассылки postfix-users , используется postcat -q queueid >tempfileдля извлечения очереди. Эта команда извлечет заголовок, тело и метаинформацию очереди. Как указал Азендейл ниже ,sendmail откажется отправить это искаженное письмо из-за мета-информации.

Использование -bhпараметра в дополнение к qпараметру заставит postcat фильтровать вывод только в заголовок и тело, не включая метаинформацию. Дополнительным преимуществом этого является то, что временный файл находится в формате, который большинство почтовых клиентов распознают как формат .eml, что позволяет просматривать итоговое (отредактированное) сообщение.

masegaloeh
источник
1
Я попробовал это, и, по крайней мере, с моей версией postfix, оно не отправляло сообщение, пока я не использовал что-то подобное postcat -qbh queueid >tempfile. (Дополнительное преимущество: тогда он в формате .eml.) Если бы я просто использовал -qего, то, похоже, ничего не делал, когда я запускал sendmail. Postfix версия 2.8.4. Кто-нибудь может это подтвердить? Если так, давайте отредактируем этот ответ.
Azendale
Привет @Azendale, я проверяю третье решение, и да, нам нужно использовать, qbhчтобы оно заработало. Добавление объяснения в обновленный ответ ... :)
masegaloeh
Спасибо ! Искал третье решение вроде. это просто прекрасно!
JazZ
1

Великий рецензия. У меня была проблема с почтовым сервером, который несколько дней работал с плохой конфигурацией, и поэтому было много очередей, которые нужно было отправить новому получателю. Итак, я создал два однострочных лайнера, чтобы пройти через все очереди:

Сначала найдите все очереди, отложите их, сохраните в виде файлов .eml и повторно отправьте:

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

Второй для удаления очередей:

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

Просто не забудьте проверить, что нет новых очередей, которые не находятся в режиме ожидания, перед запуском этого последнего кода. Сделайте это, выполнив это, и ищите идентификаторы очереди без '!' в конце:

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

Он мог легко поместить эти два элемента в один, но я чувствовал, что у меня больше контроля, проверяя, что письма действительно были получены перед удалением очередей.

Йорн
источник