我创建了一个基于 Web 的应用程序,但当它尝试发送电子邮件时失败了。Postfix 在其 mail.log 中记录了以下内容:
postfix/smtpd[22261]: warning: hostname srv.eastinc.nl does not resolve to address 192.168.3.101
postfix/smtpd[22261]: connect from unknown[192.168.3.101]
postfix/smtpd[22261]: NOQUEUE: reject: RCPT from unknown[192.168.3.101]: 554 5.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<domain.eastinc.nl>
postfix/smtpd[22261]: disconnect from unknown[192.168.3.101]
我很确定 srv.eastinc.nl 解析为 192.168.3.101,因为 nslookup 就是这样说的。Postfix 配置:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
delay_warning_time = 2h
home_mailbox = Maildir/
inet_interfaces = all
mailbox_size_limit = 0
mydestination = eastinc.nl, mail.eastinc.nl, srv.eastinc.nl, localhost.eastinc.nl, localhost
myhostname = mail.eastinc.nl
mynetworks = localhost 192.168.3.101 127.0.0.1 srv.eastinc.nl
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost = smtp.ziggo.nl:25
smtp_always_send_ehlo = yes
smtp_sasl_auth_enable = no
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_tls_cert_file = /etc/ssl/certs/mailcert.pem
smtpd_tls_key_file = /etc/ssl/private/mail.key
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
如果我理解正确的话,192.168.3.101 和 srv.eastinc.nl 都应该能够通过 Postfix 中继邮件。有什么办法可以实现吗?
答案1
您的配置中有以下限制:
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
当客户端通过 RFC 4954(AUTH)协议成功验证后允许请求。
拒绝该请求,除非以下情况之一成立:
Postfix 是邮件转发器:解析后的 RCPT TO 域与 $relay_domains 或其子域匹配,并且不包含发件人指定的路由(user@elsewhere@domain),
Postfix 是最终目的地:解析的 RCPT TO 域与 $mydestination、$inet_interfaces、$proxy_interfaces、$virtual_alias_domains 或 $virtual_mailbox_domains 匹配,并且不包含发件人指定的路由(user@elsewhere@domain)。
当 Postfix 不是发件人地址的最终目的地,并且 MAIL FROM 域具有 1) DNS MX 和 DNS A 记录,或者 2) 格式错误的 MX 记录(例如,长度为零的 MX 主机名的记录)时,拒绝请求(Postfix 版本 2.3 及更高版本)。
答复由unknown_address_reject_code参数(默认值:450)、unknown_address_tempfail_action(默认值:defer_if_permit)或550(nullmx,Postfix 3.0及更高版本)指定。有关详细信息,请参阅相应的参数说明。
因此,我的猜测是:任何从 192.168.3.101 主机(它是服务器本身吗?)连接的人都会发送未经身份验证的邮件(日志中没有关于身份验证的任何信息)。因此,您需要以下限制才能这样做:
当客户端 IP 地址与 $mynetworks 中列出的任何网络或网络地址匹配时允许该请求。
smtpd_recipient_restrictions
在前面加上permit_mynetworks
。
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
UDP
有时候真的很糟糕,permit_mynetworks
因为任何主机$mynetworks
无需身份验证即可提交邮件。
因此,最好通过 smtp 从您的应用程序提交带有身份验证的邮件,而不要使用sendmail()/mail()
函数
答案2
最近,我从 Windows Outlook 客户端发送电子邮件时遇到了同样的问题。
笔记:此错误尤其发生在通过 Outlook 桌面应用程序发送电子邮件时。
以下是从 Outlook 代理发送电子邮件时在 /var/log/mail.log 中发现的错误消息。
NOQUEUE: reject: RCPT from unknown[XXX.XXX.XXX.XXX]: 450 4.7.1 <DESKTOPOABC123>: Helo command rejected: Host not found; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<DESKTOPOABC123>
为了修复该问题,我执行了以下操作,以便能够通过 Outlook 代理发送电子邮件。
步骤1: 在 /etc/postfix/main.cf 文件中注释掉“smtpd_recipient_restrictions”参数中的以下条目。
第2步:重新启动postfix服务代理。
$ sudo systemctl 重新启动 postfix