如何强制 PHP 通过本地 Postfix SMTP,而不是直接到达目的地?

如何强制 PHP 通过本地 Postfix SMTP,而不是直接到达目的地?

我有一个带有表单的网站,用户可以向我们发送请求。此外,该站点还会向客户发送预定义的电子邮件。该表单收到垃圾邮件(大惊喜),当使用某些电子邮件时,我试图阻止电子邮件出去,[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         |  |
|  |                     |  |           |  |                     |  |
|  +---------------------+  |           |  +---------------------+  |
|                           |           |                           |
+---------------------------+           +---------------------------+

笔记:这里什么?— 我认为这是使用sendmailpostdrop。你可否确认?

我认为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不会应用于它。

您基本上有四种选择:

  1. 阻止直接在 Web 表单中(而不是在邮件服务器中)向不需要的地址发送邮件
  2. 写(或在网上找到)米尔特这将执行您需要的邮件过滤,并通过non_smtpd_miltersPostfix 配置中的设置调用它
  3. mail()在您的 PHP 代码中,不要使用简单的函数,而是使用PHP邮件程序图书馆发送邮件。 PHPMailer 可以配置为通过 SMTP 发送邮件。
  4. /usr/sbin/sendmail文件替换为包装脚本这将检查提供的收件人地址并删除“坏”地址(这有点棘手,因为收件人地址可以在命令行上指定,或者 - 当使用-t参数时sendmail- 在消息标题中指定),然后调用“ real”sendmail 二进制文件,您必须将其重命名为其他名称。您也可以保持/usr/sbin/sendmail原样,并sendmail_path在 PHP 配置中使用指向您的脚本的参数。我想你甚至可以安装类似的东西邮件传输协议并将sendmail_path参数设置为指向它,这将有效地强制您的mail()函数通过 SMTP 发送邮件。

相关内容