postfix dovecot 禁用 lmtp

postfix dovecot 禁用 lmtp

我有 3 台服务器。1 台带 postfix 的 MX 服务器和 2 台 dovecot 服务器。MX 服务器接收电子邮件,然后通过 LMTP 将其发送到特定的 dovecot 服务器。来自同一域的所有邮箱都在同一台服务器上。

有没有办法暂时禁用 LMTP 并延迟特定域的消息?例如在 dovecot 服务器之间迁移域的情况。

在 postfix 上我使用 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 正在监听端口 24 上的 lmtp,dovecot 中的 user_query 是

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/UserDatabasehttp://wiki2.dovecot.org/UserDatabase/ExtraFields

我曾尝试向 user_query 添加条件“并且域.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

答案1

该问题可以通过 postfix 或 dovecot 解决。

  1. 在 dovecot 中,您应该将 LMTP 服务设置为在 postfix 发送电子邮件时以临时拒绝 4XX(针对您的“特殊”域)进行回复。
  2. 在 postfix 中,您需要配置 postfix,以便如果收件人域与您的“特殊”域匹配,它必须推迟电子邮件。

选项1不可能,因为与 postfix 不同,dovecot 无法配置为向特定域发出临时失败错误。请参阅[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_domainsrelay_recipient_maps来替换virtual_mailbox_domainsvirtual_mailbox_maps。请参阅中继域类文档

相关内容