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

postfix dovecot отключить lmtp

У меня 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. В dovecot вы должны настроить службу LMTP на ответ временным отклонением 4XX (для вашего «особого» домена) при отправке почты postfix.
  2. В postfix вам нужно настроить postfix, чтобы он откладывал электронную почту, если домен получателя совпадает с вашим «специальным» доменом.

Опция 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. Видеть документация класса домена ретрансляции.