Postfix
如何強制 PHP 通過我的本地 Postfix SMTP 而不是直接到達目的地?
我有一個帶有表單的網站,使用者可以在其中向我們發送請求。此外,該站點向客戶發送預定義的電子郵件。表單收到垃圾郵件(大吃一驚),當使用某些電子郵件時,我試圖阻止電子郵件發出,
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 | | | | | | | | | | | +---------------------+ | | +---------------------+ | | | | | +---------------------------+ +---------------------------+
筆記:這裡是什麼?— 我認為這是使用
sendmail
andpostdrop
。你確定嗎?我認為伺服器 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
不會應用於它。你基本上有四個選擇:
- 阻止在您的網路表單中直接向不需要的地址發送郵件,而不是在郵件伺服器中
- 編寫(或在網路中的某處找到)一個milter,它將執行您需要的郵件過濾,並通過
non_smtpd_milters
您的 Postfix 配置中的設置呼叫它mail()
在您的 PHP 程式碼中,使用PHPMailer庫而不是簡單的函式來發送郵件。PHPMailer 可以配置為通過 SMTP 發送郵件。- 用包裝腳本替換
/usr/sbin/sendmail
文件,該腳本將檢查提供的收件人地址並刪除“壞”地址(這有點棘手,因為收件人地址可以在命令行上指定,或者 - 當使用參數時- 在消息中headers),然後呼叫“真正的” sendmail 二進製文件,您必須將其重命名為其他名稱。您也可以保持原樣並在您的 PHP 配置中使用指向您的腳本的參數。我認為您甚至可以安裝msmtp之類的東西並將參數設置為指向它,這將有效地強制您的函式通過 SMTP 發送郵件。-t``sendmail``/usr/sbin/sendmail``sendmail_path``sendmail_path``mail()