我有 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/UserDatabase和http://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 解决。
- 在 dovecot 中,您应该将 LMTP 服务设置为在 postfix 发送电子邮件时以临时拒绝 4XX(针对您的“特殊”域)进行回复。
- 在 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_domains
和relay_recipient_maps
来替换virtual_mailbox_domains
和virtual_mailbox_maps
。请参阅中继域类文档。