Назад | Перейти на главную страницу

Постфикс: изменить отправителя в сообщениях в очереди

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

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

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

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

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

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

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

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

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

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

Например, нет каталога / var / spool / mqueue, а вместо него / 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. Это решение основано на Предложение автора постфикса. Как и в первом варианте, вы можете определить файл для сопоставления старого адреса новому адресу.

/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

  • Достоинства: 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, что позволяет просматривать полученное (отредактированное) сообщение.

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

Первый, который находит все очереди, приостанавливает их, сохраняет как файлы .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 }'

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