我已经用 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]>
所有队列设置均保留默认值。后缀版本为 2.10.1。
为什么会发生这种情况,如何让 Postfix 对消息进行排队并在 10 分钟后重试?
补充:后缀配置(匿名):
[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]#
您将 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 用于强制认证用户提交。这样您就可以以一种合理可维护的方式在每个服务的基础上实施不同的规则,进一步简化处理中继流量与传入流量不同的任务。