У меня проблема с настройкой постфикса. Я хотел настроить общий адрес электронной почты для домена. Мои виртуальные почтовые ящики и псевдонимы сохранены в базе данных 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'
Теперь все работает так, как ожидалось по исходному вопросу.