我有一个带有表单的网站,用户可以向我们发送请求。此外,该站点还会向客户发送预定义的电子邮件。该表单收到垃圾邮件(大惊喜),当使用某些电子邮件时,我试图阻止电子邮件出去,[email protected]
因为目的地已经告诉我们(至少一次)该电子邮件无效。
+-----------------+
| Webform |
+------+----------+
|
v
+-----------------+
| PHP |
+------+-------+--+
| |
| +-----------------+
| |
| send form data to us | send thank you note
v v
+----------------------+ +--------------------+
| [email protected] | | [email protected] |
+----------------------+ +--------------------+
我想至少阻止右侧的电子邮件(发送至 的电子邮件[email protected]
)。
为此,我有一个bad_recipients
包含正则表达式列表的文件:
/.*hack.*@example.com/ REJECT
...
这在我的计算机上效果很好,但在本地 PHP 脚本中,所有电子邮件都会通过。
+---------------------------+ +---------------------------+
| | | |
| +---------------------+ | | +---------------------+ |
| | | | SMTP | | | |
| | My Computer Postfix +--|-----------|->| Server Postfix +--|---> destination
| | | | | | | |
| +---------------------+ | | +---------------------+ |
| ^ | | ^ |
| | What here? | | | What here? |
| +----------+----------+ | | +----------+----------+ |
| | | | | | | |
| | My Computer Tool | | | | PHP Website | |
| | | | | | | |
| +---------------------+ | | +---------------------+ |
| | | |
+---------------------------+ +---------------------------+
笔记:这里什么?— 我认为这是使用sendmail
和postdrop
。你可否确认?
我认为PHP网站是当地的服务器后缀不使用邮件传输协议。相反,它会使用sendmail
,这意味着它绕过邮件传输协议保护措施:
smtpd_recipient_restrictions=check_recipient_access regexp:/etc/postfix/bad_recipients, ...
然而,PHP 显然是为 SMTP 设置的:
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25
除非该设置被忽略,因为我不在 Win32 下,因此这些参数在 Linux 上将被完全忽略? (我上线了乌班图.)
有没有办法强制 Postfix 检查收件人列表,即使通过 发送电子邮件也是如此sendmail
?
另一个与潜力相关的问题sendmail
问题。但答案是完全阻止发件人(据我所知),而不是让电子邮件通过,但仍然验证收件人的电子邮件地址。
您知道如何确保收件人始终被阻止吗?
答案1
是的,PHP 配置中的 SMTP 服务器和端口设置仅适用于 Windows 版本的 PHP。在Linux(以及其他类Unix系统)下,PHP直接使用/usr/sbin/sendmail
命令来发送邮件。
正如您正确假设的那样,邮件不会通过 SMTP 进入,而是直接注入到 Postfix 队列中,因此smtpd_recipient_restrictions
不会应用于它。
您基本上有四种选择:
- 阻止直接在 Web 表单中(而不是在邮件服务器中)向不需要的地址发送邮件
- 写(或在网上找到)米尔特这将执行您需要的邮件过滤,并通过
non_smtpd_milters
Postfix 配置中的设置调用它 mail()
在您的 PHP 代码中,不要使用简单的函数,而是使用PHP邮件程序图书馆发送邮件。 PHPMailer 可以配置为通过 SMTP 发送邮件。- 将
/usr/sbin/sendmail
文件替换为包装脚本这将检查提供的收件人地址并删除“坏”地址(这有点棘手,因为收件人地址可以在命令行上指定,或者 - 当使用-t
参数时sendmail
- 在消息标题中指定),然后调用“ real”sendmail 二进制文件,您必须将其重命名为其他名称。您也可以保持/usr/sbin/sendmail
原样,并sendmail_path
在 PHP 配置中使用指向您的脚本的参数。我想你甚至可以安装类似的东西邮件传输协议并将sendmail_path
参数设置为指向它,这将有效地强制您的mail()
函数通过 SMTP 发送邮件。