我已经用 Postfix、Roundcube 和 Dovecot 设置了邮件服务器。一切运行良好 - 几乎。
在我的国家,有一个名为 inbox.lv 的流行免费电子邮件服务。他们设置了一条反垃圾邮件规则,当新服务器尝试向他们发送电子邮件时,他们首先将其列入灰名单 10 分钟,并要求服务器重新发送电子邮件。这很公平。
但是,当使用 Postfix 发送外发电子邮件(无论是从 Roundcube 还是 Thunderbird)时,它不会将消息排队。相反,它会立即返回错误。还有一个日志条目(我添加了换行符/空格以便于阅读;IP 和电子邮件地址已删除以保护隐私):
May 31 23:17:18 21 postfix/smtpd[24814]: NOQUEUE: reject: RCPT from unknown[MY.IP.ADDRESS.HERE]:
450 4.1.1 <[email protected]>: Recipient address rejected: unverified address:
host mx1.inbox.lv[194.152.32.74] said: 450 4.7.1 <unknown[SERVER.IP.ADDRESS.HERE]>:
Client host rejected: greylisted, please retry in 597 seconds (in reply to RCPT TO command);
from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<[192.168.1.216]>
所有队列设置均保留默认设置。Postfix 版本为 2.10.1。
为什么会发生这种情况?我如何让 Postfix 将消息排队并在 10 分钟后重试?
添加:Postfix 配置(匿名):
[root@myserver etc]# postconf mail_version
mail_version = 2.10.1
[root@myserver etc]# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
html_directory = no
inet_interfaces = all
inet_protocols = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
message_size_limit = 100000000
milter_default_action = accept
mydestination = localhost
mydomain = mydomain.lv
myhostname = mydomain.lv
mynetworks_style = host
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
non_smtpd_milters = $smtpd_milters
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_milters = inet:127.0.0.1:8891
smtpd_recipient_restrictions = reject_unverified_recipient
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mydomain.lv/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mydomain.lv/privkey.pem
smtpd_tls_security_level = may
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = d1.lv d2.lv d3.lv d4.lv
virtual_mailbox_limit = 0
virtual_transport = lmtp:unix:/var/run/dovecot/lmtp
[root@myserver etc]# postconf -M
smtp inet n - n - - smtpd
submission inet n - n - - smtpd
smtps inet n - n - - smtpd
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
[root@myserver etc]#
答案1
您已将 Postfix 配置为连接到远程目标,并向其询问收件人 - 这是必需的前你可以接受任何内容进入你的本地队列。
smtpd_recipient_restrictions =
reject_unverified_recipient
在通用邮件服务器上,这不适用于任何但您控制的域名或您与其运营商有协议的域名。
询问远程服务器是否有特定用户,但不发送邮件,将使相当多的服务器不想与您交互。在知道您将发送什么之前,它们无法轻易判断您是试图洗白下一个受害者名单的垃圾邮件发送者,还是打算发送邮件的人。
解决该问题并解决原始问题的最简单的改变是:
smtpd_recipient_restrictions =
permit_sasl_authenticated
,
reject_unauth_destination
, reject_unverified_recipient
因为限制是按照指定的顺序处理的,所以这将豁免您的已验证用户和不相关的中继请求(无论如何都会被拒绝)。这样,您仍然可以reject_unverified_recipient
对传入消息强制执行(其中 dovecot 可能会立即确认地址)。但不必向远程服务器抱怨您当时还没有收到邮件的收件人。但是,如果您希望为相互写消息的用户启用此功能,则必须比这更复杂。postfix 文档中的 ADDRESS_VERIFICATION_README 文件有点旧,但仍应为您提供一般概述。
我通常建议使用 master.cf(至少在最近一段时间内,它附带了合适的模板)来设置部分分离的 smtpd 实例,一个在端口 25 上用于一般互联网使用,一个在端口 465 上用于强制认证的用户提交。这样,您就可以以合理可维护的方式针对每个服务实施不同的规则,从而进一步简化将中继流量与传入流量区别对待的任务。