У меня 3 сервера. 1 сервер MX с постфиксом и 2 сервера dovecot. Сервер MX получает электронные письма, а затем передает их через LMTP на конкретный сервер Dovecot. Все почтовые ящики из одного домена находятся на одном сервере.
Есть ли способ временно отключить LMTP и отложить сообщения для определенного домена? Например, в случае миграции доменов между серверами dovecot.
На постфиксе я использую transport_maps
transport_maps = mysql:/etc/postfix/sql/transport.cf
С этим запросом
query = SELECT concat('lmtp:',servers.address, ':24') FROM servers
JOIN domains ON (domains.server_id=servers.ID)
WHERE domains.name LIKE SUBSTRING_INDEX("%s", "@", -1)
LIMIT 1;
Dovecot прослушивает lmtp на порту 24, user_query в dovecot -
user_query = SELECT 1
FROM domains
JOIN mailboxes ON (domains.ID=mailboxes.domain_id)
WHERE
domains.name LIKE '%d'
AND mailboxes.name LIKE '%n'
AND domains.server_id='X'
LIMIT 1;
Я проверил справочную страницу dovecot user_query, но ничто не может мне помочь (http://wiki2.dovecot.org/UserDatabase и http://wiki2.dovecot.org/UserDatabase/ExtraFields)
Я попытался добавить условие в user_query «И domains.enable_lmtp = 1», но затем сервер postfix успешно отправил электронное письмо на сервер dovecot, и сервер dovecot вернул отправителю ошибку «Пользователь не существует».
Затем я попытался добавить такое же условие к запросу сервера на сервере postfix. Запрос ничего не вернул (некуда транспортировать), электронная почта была удалена и в журнале написано
postfix/virtual[724]: fatal: bad string length 0 < 1: virtual_mailbox_base =
postfix/master[32263]: warning: process /usr/libexec/postfix/virtual pid 724 exit status 1
postfix postfix/master[32263]: warning: /usr/libexec/postfix/virtual: bad command startup -- throttling
Я надеялся, что postfix поместит сообщения в отложенную очередь, но этого не произошло. Сообщения были удалены. То же самое произошло, когда я изменил транспортный сервер на несуществующий адрес.
Так я что-то не так делаю? Есть ли способ решить мою проблему?
Мой postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
config_directory = /etc/postfix
content_filter = smtp-amavis:[127.0.0.1]:10024
mydestination = $myhostname, localhost.$mydomain, localhost
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client_hostname, reject_unknown_reverse_client_hostname
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_hostname,
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_unknown_recipient_domain, reject_non_fqdn_recipient, check_policy_service unix:/var/spool/postfix/postgrey/socket, check_policy_service unix:private/recipient_restrictions
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes
smtpd_use_tls = yes
transport_maps = mysql:/etc/postfix/sql/transport.cf
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = mysql:/etc/postfix/sql/mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/mailbox_maps.cf
Эту проблему можно решить с помощью postfix или dovecot.
Опция 1 невозможно, потому что -в отличие от postfix- dovecot нельзя настроить для выдачи ошибки tempfail конкретному домену. См. Обсуждение на [Dovecot] Конфигурация кода отклонения LMTP.
Для вариант 2, вам необходимо перенести "специальный" домен на нерабочий адрес, например вы можете доставить его на закрытый порт на вашем LMTP-сервере. Для этого вам понадобится второй transport_maps
с таким запросом
#/etc/postfix/sql/transport-defer.cf
query = SELECT concat('lmtp:',servers.address, ':2424') FROM servers
JOIN domains ON (domains.server_id=servers.ID)
WHERE domains.name LIKE SUBSTRING_INDEX("%s", "@", -1)
AND domains.enable_lmtp != 1
LIMIT 1;
В приведенном выше запросе я использую порт 2424 как закрытый порт, чтобы postfix откладывал сообщение.
Затем положите его рядом с mysql:/etc/postfix/sql/transport.cf
#main.cf
transport_maps = mysql:/etc/postfix/sql/transport.cf mysql:/etc/postfix/sql/transport-defer.cf
PS: Поскольку у вас нет почтового ящика на сервере postfix, было бы предпочтительнее использовать relay_domains
и relay_recipient_maps
заменить virtual_mailbox_domains
и virtual_mailbox_maps
. Видеть документация класса домена ретрансляции.