Postfix

如何強制 PHP 通過我的本地 Postfix SMTP 而不是直接到達目的地?

  • August 15, 2022

我有一個帶有表單的網站,使用者可以在其中向我們發送請求。此外,該站點向客戶發送預定義的電子郵件。表單收到垃圾郵件(大吃一驚),當使用某些電子郵件時,我試圖阻止電子郵件發出,hacker@example.com因為目的地已經(至少一次)告訴我們該電子郵件無效。

+-----------------+
| Webform         |
+------+----------+
      |
      v
+-----------------+
| PHP             |
+------+-------+--+
      |       |
      |       +-----------------+
      |                         |
      | send form data to us    | send thank you note
      v                         v
+----------------------+  +--------------------+
| contact@example.com  |  | hacker@example.com |
+----------------------+  +--------------------+

我想至少阻止右側的電子郵件(發送到的電子郵件hacker@example.com)。

為此,我有一個bad_recipients包含正則表達式列表的文件:

/.*hack.*@example.com/ REJECT
...

這在我的電腦上效果很好,但在本地 PHP 腳本中,所有的電子郵件都會通過。

+---------------------------+           +---------------------------+
|                           |           |                           |
|  +---------------------+  |           |  +---------------------+  |
|  |                     |  |  SMTP     |  |                     |  |
|  | My Computer Postfix +--|-----------|->| Server Postfix      +--|---> destination
|  |                     |  |           |  |                     |  |
|  +---------------------+  |           |  +---------------------+  |
|             ^             |           |             ^             |
|             | What here?  |           |             | What here?  |
|  +----------+----------+  |           |  +----------+----------+  |
|  |                     |  |           |  |                     |  |
|  | My Computer Tool    |  |           |  | PHP Website         |  |
|  |                     |  |           |  |                     |  |
|  +---------------------+  |           |  +---------------------+  |
|                           |           |                           |
+---------------------------+           +---------------------------+

筆記:這裡是什麼?— 我認為這是使用sendmailand postdrop。你確定嗎?

我認為伺服器 Postfix本地的PHP 網站不使用SMTP。相反,它會使用,這意味著它繞過了SMTP保護: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 上將被完全忽略?(我在Ubuntu上。)

有沒有辦法強制 Postfix 即使在通過 發送電子郵件時也檢查收件人列表sendmail

與潛在問題相關的另一個sendmail問題。但答案是完全阻止發件人(據我了解),反對讓電子郵件通過,但仍要驗證收件人的電子郵件地址。

您是否知道如何確保收件人始終被阻止?

是的,PHP 配置中的 SMTP 伺服器和埠設置僅適用於 Windows 版本的 PHP。在 Linux(和其他類 Unix 系統)下,PHP 直接使用/usr/sbin/sendmail命令發送郵件。

正如您正確假設的那樣,郵件不會通過 SMTP 進入,而是直接注入 Postfix 隊列,因此smtpd_recipient_restrictions不會應用於它。

你基本上有四個選擇:

  1. 阻止在您的網路表單中直接向不需要的地址發送郵件,而不是在郵件伺服器中
  2. 編寫(或在網路中的某處找到)一個milter,它將執行您需要的郵件過濾,並通過non_smtpd_milters您的 Postfix 配置中的設置呼叫它
  3. mail()在您的 PHP 程式碼中,使用PHPMailer庫而不是簡單的函式來發送郵件。PHPMailer 可以配置為通過 SMTP 發送郵件。
  4. 用包裝腳本替換/usr/sbin/sendmail文件,該腳本將檢查提供的收件人地址並刪除“壞”地址(這有點棘手,因為收件人地址可以在命令行上指定,或者 - 當使用參數時- 在消息中headers),然後呼叫“真正的” sendmail 二進製文件,您必須將其重命名為其他名稱。您也可以保持原樣並在您的 PHP 配置中使用指向您的腳本的參數。我認為您甚至可以安裝msmtp之類的東西並將參數設置為指向它,這將有效地強制您的函式通過 SMTP 發送郵件。-t``sendmail``/usr/sbin/sendmail``sendmail_path``sendmail_path``mail()

引用自:https://unix.stackexchange.com/questions/713705