后缀 dovecot 禁用 lmtp

FuF*_*FuF 5 smtp postfix dovecot

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

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

在后缀上我使用 transport_maps

transport_maps = mysql:/etc/postfix/sql/transport.cf
Run Code Online (Sandbox Code Playgroud)

有了这个查询

 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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

我检查了 dovecot user_query 手册页,但没有什么可以帮助我(http://wiki2.dovecot.org/UserDatabasehttp://wiki2.dovecot.org/UserDatabase/ExtraFields

我试图向 user_query "AND domain.enable_lmtp = 1"添加条件,但是后缀服务器成功地将电子邮件传递给 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
Run Code Online (Sandbox Code Playgroud)

我希望 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
Run Code Online (Sandbox Code Playgroud)

mas*_*oeh 5

这个问题可以通过 postfix 或 dovecot 来解决。

  1. 在 dovecot 中,您应该将 LMTP 服务设置为在 postfix 发送电子邮件时使用临时拒绝 4XX(针对您的“特殊”域)进行回复。
  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;
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,我使用端口 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
Run Code Online (Sandbox Code Playgroud)

PS:因为您在 postfix 服务器中没有邮箱,所以最好使用relay_domainsrelay_recipient_maps替换virtual_mailbox_domainsvirtual_mailbox_maps。请参阅中继域类文档