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

Псевдоним Postfix - все работает не так, как ожидалось

У меня проблема с настройкой постфикса. Я хотел настроить общий адрес электронной почты для домена. Мои виртуальные почтовые ящики и псевдонимы сохранены в базе данных postgresql. Запросы, определенные в файлах vdomains.cf, vmailbox.cf и valias.cf, соответственно:

query = SELECT 1 FROM domains WHERE domain = '%s'

query = SELECT CONCAT(domains.domain, '/', mailboxes.address, '/') AS maildir FROM mailboxes LEFT JOIN domains ON mailboxes.domain = domains.id WHERE mailbox='%s'

query = SELECT dst FROM virtual_aliases WHERE src = '%s'

Эти файлы связаны с main.cf этим блоком

virtual_mailbox_domains = pgsql:/etc/postfix/vdomains.cf
virtual_alias_maps = pgsql:/etc/postfix/valias.cf
virtual_mailbox_base = /srv/mail
virtual_mailbox_maps = pgsql:/etc/postfix/vmailbox.cf
virtual_uid_maps = pgsql:/etc/postfix/vuidmaps.cf
virtual_gid_maps = pgsql:/etc/postfix/vdomainmaps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp

Это отлично работает для известных получателей, и сервер отклоняет всех неизвестных получателей. Псевдоним также работает, если я определяю один адрес в сопоставлении таблицы псевдонимов с другим существующим адресом в таблице почтового ящика.

Проблема в том, что таблица псевдонимов разрешается раньше, чем таблица почтовых ящиков, что создает большую проблему, когда я хочу создать псевдоним для всеобъемлющего электронного письма следующим образом:

src          dst
@domain.com  catchall@domain.com

Это разрешается до фактического почтового ящика, и поэтому все электронные письма, в том числе предназначенные для существующих пользователей, пересылаются на адрес catchall@domain.com.

Согласно нескольким ответам здесь, в стеке или на других сайтах, эта настройка должна работать и, вероятно, работает для некоторых людей, поэтому я считаю, что я что-то делаю не так.

И последнее - моя установка - Debian Jessie с Postfix 2.11.3.

Любая помощь очень ценится, заранее спасибо

Наконец-то я нашел решение. Вероятно, это не лучший вариант, но я не смог найти более правильного, прочитав всю соответствующую документацию по постфиксам и множество других сообщений. Отсутствие ответа на этот вопрос - еще один показатель того, что «правильного» решения может не существовать.

Мой способ обхода довольно прост. Я обнаружил, что если вы укажете все существующие адреса в таблице виртуальных псевдонимов следующим образом:

test@testdomain.com    test@testdomain.com
test2@testdomain.com   test2@testdomain.com

(в основном тот же источник и место назначения)

он работает так, как ожидалось по первоначальному замыслу. (это было предложение, которое я нашел в другом вопросе по той же теме). Что ж, помещать эту информацию в таблицу virtual_aliases явно неправильно (дублирование информации, ...), поэтому я придумал более элегантное решение:

CREATE OR REPLACE VIEW v_virtual_aliases AS 
 SELECT mailboxes.mailbox AS src,
    mailboxes.mailbox AS dst
   FROM mailboxes
UNION ALL
 SELECT virtual_aliases.src,
    virtual_aliases.dst
   FROM virtual_aliases;

Это просто создает представление со всей информацией из таблицы virtual_aliases в сочетании со всеми существующими почтовыми ящиками из реальной таблицы почтовых ящиков. Таким образом, данные не дублируются, а псевдонимы работают должным образом - только для адресов, для которых нет записи в таблице почтовых ящиков. Учитывая этот запрос, производительность не должна быть проблемой даже для больших баз данных.

Затем я обновил файл valias.cf соответственно:

query = SELECT dst FROM virtual_aliases WHERE src = '%s'

Теперь все работает так, как ожидалось по исходному вопросу.