我已POSTFIX
设置过滤某些电子邮件地址。该main.cf
文件包含:
smtpd_recipient_restrictions =
check_recipient_access hash:/etc/postfix/blacklist,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
permit
当我尝试向黑名单上的某个地址发送电子邮件时,我得到了554 5.7.1 Access denied.
应有的错误。此外,当我尝试使用 telnet 发送时,消息被阻止。但是,此服务器安装了一个基于 swiftmailer 的邮件软件,php
并使用 swiftmailer 发送消息。当我尝试使用此软件发送消息时,任何发送到被阻止地址的消息都会通过。
这可能是什么原因?我该如何追踪和调试它?
答案1
如果本地机器运行 smtp 服务器,则有两种发送邮件的方法。
您可以使用 smtp 协议(就像任何其他远程客户端一样),连接到本地主机端口 25 并进行整个 smtp 通信。在这种情况下,smtpd 客户端限制适用。
或者您只sendmail
使用适当的参数运行二进制文件。在这种情况下,您不使用 smtp 协议,因此不会强制执行限制。
例如,Linux 上的 php mail() 函数将使用第二种方法,使用默认命令,或者在assendmail -t -i
中配置的任何命令php.ini
sendmail_path
Swiftmailer 支持这两种方法,因此你可以更改代码以使用 smtp 而不是 sendmail。请参阅此处http://swiftmailer.org/docs/sending.html
答案2
如果您添加-v
命令,例如smtpd
在/etc/postfix/master.cf
和中postfix reload
,您将看到大量有关 Postfix 如何检查您的来信的详细信息。
无论如何,smtpd_recipient_restrictions
通常会检查RCPT TO
命令。并且当您的 PHP 应用程序通过时smtpd_recipient_restrictions
,它必须通过pickup
(sendmail-like
命令)而不是通过 SMTP。
在我看来,将mail()
函数赋予 PHP 是自找麻烦。我建议您禁用它(有多种方法...):
# env -i php-7.0 -r 'echo function_exists("mail") ? "yes\n" : "no\n";'
no
过滤也pickup
更加复杂。
我也怀疑主题是否清楚。在我看来,你试图限制 PHP 应用程序本身的发送,因此最好使用其他限制,例如 HELO、发送者或通过提交端口的 AUTH。