后缀dovecot禁用lmtp

我有3台服务器。 1 MX服务器与后缀和2 dovecot服务器。 MX服务器接收电子邮件,然后通过LMTP服务于特定的dovecot服务器。 所有来自同一个域的邮箱都在同一台服务器上。

有什么办法来临时禁用特定域的LMTP和deffer消息? 例如,在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正在监听端口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/UserDatabase和http://wiki2.dovecot.org/UserDatabase/ExtraFields )

我试图添加条件user_query “和domains.enable_lmtp = 1” ,但后来的邮件服务器成功地传递电子邮件给鸽舍服务器和鸽舍服务器返回到发件人错误“用户不存在”。

接下来,我试图在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中,当postfix发送邮件时,你应该设置LMTP服务来回复临时拒绝4XX(对于你的“特殊”域)。
  2. 在后缀,你需要configuration后缀,所以如果收件人的域匹配你的“特殊”域,它必须推迟电子邮件。

选项1是不可能的,因为-unlike postfix-dovecot不能被configuration为向特定域发出tempfail错误。 请参阅关于[Dovecot]configurationLMTP拒绝代码的讨论。

对于选项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来replacevirtual_mailbox_domainsvirtual_mailbox_maps 。 请参阅中继域类文档 。