После полной переустановки у нас возникла проблема с конфигурацией: адрес отправителя был неправильным, и некоторые получатели (почтовые серверы) его отклонили.
Итак, куча писем застряла в очереди 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 / ...
Я хочу прояснить две вещи.
Итак, у вас есть несколько вариантов
Этот ответ вдохновлен этим отличный ответ. Он автоматически перепишет старый адрес на новый. Вы можете определить файл для сопоставления старого адреса новому адресу.
/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
account@localdomain.example.com
. Чтобы преодолеть обратную сторону первого варианта, вы можете использовать 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
postsuper -r ALL deferred
Это старые способы ручного изменения очереди для расширенной обработки. Этот ответ пришел от списки рассылки 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 }'
Он мог легко объединить эти два лайнера в один, но я чувствовал, что могу лучше контролировать, проверяя, действительно ли письма получены, прежде чем удалять очереди.