了解 sendmail 二進製文件
我有一個網站,上面有一些基於 PHP 的 CMS,我是唯一的使用者。這個網站有一個簡單的聯繫表格(姓名、電子郵件、電話和正文),我通過它收到非註冊使用者的郵件。
一方面,我想將電子郵件從該表單直接傳輸到我的電子郵件帳戶。
另一方面,我寧願不設置任何 DNS 記錄,因為我對垃圾郵件目錄至少有一次沒有問題,因為我會將站點機器的 IP 放在一個好列表中。
我了解在任何 Linux 系統上使用 SMTP 協議基本上有三種方法(通過 PHP
mail()
函式):
- 安裝和配置郵件傳輸代理(如
postfix
)。- 安裝和配置電子郵件代理利用程序(如
ssmtp
),其中還包括向可能的黑客顯示配置文件中的代理電子郵件帳戶地址和密碼ssmtp
,以便程序可以將該帳戶用作代理。- 根據這個答案,第三種方式,可能被命名為sendmail binary。
是否有sendmail 二進制這樣的概念,如果有,它與前兩個選項有何不同?
這不是第三種方式。
這是兩種方式中的第一種:
- 執行一個著名的程序並將信封和消息作為輸入,或者
- 與遠端/本地 SMTP 送出伺服器建立 TCP 連接並使用 SMTP 送出協議。
(第三種方式是將老式郵件注入協議與本地/遠端伺服器說,但我想認為世界上二十年來已經接受了正確的 SMTP 送出,與 SMTP 中繼不同,現在。)
1980 年代的舊 BSD Sendmail 程序,曾經但不再是一個非常流行的郵件子系統,它允許郵件使用者代理、當時的郵件閱讀器和新聞閱讀器以及通過郵件報告內容的各種子系統,通過執行該程序將消息信封作為命令行參數,將消息內容(標題和正文)作為程序的標準輸入。
mailx
並沒有像他們的前輩那樣直接將郵件注入使用者郵箱。相反,他們使用相關的命令行參數派生了一個執行 Sendmail 的子程序,並通過管道將消息內容髮送到該子程序。該程序通常不在 shell 的命令搜尋路徑上,而是有一個眾所周知的路徑名,可以完全使用它來執行它。MUA 通常具有可配置的選項以允許使用者覆蓋已編譯的路徑名,但如果沒有這些,MUA 將在名為
/usr/ucb/sendmail
(or/usr/libexec/sendmail
, or/usr/lib/sendmail
, or/usr/sbin/sendmail
, 或其他類似文件名的文件中執行程序,從作業系統到作業系統)。這個包含Sendmail程序的**二進製程序映像文件成為事實上的郵件送出方案。取代 BSD Sendmail 的替代郵件傳輸系統最終提供了他們自己的程序,仍然被稱為是因為這是硬連線到 MUA 的名稱,它將與他們的各種不同系統互操作。
sendmail
最初的程序當然是 BSD Sendmail 本身,這是一個徒勞無功的程序,它同時完成了 MTS 的所有工作。這可以在各種不同的模式下操作,可以通過多個選項進行選擇。送出只是其中一種模式,恰好是預設模式。
-b*x*``-bm
許多替代 MTS 根本不以這種方式工作,其替代
sendmail
程序的功能僅限於郵件送出。
- qmail 尤其如此。
- 最值得注意的是,Exim 的情況並非如此,它仍然在一個巨大的程序中完成所有工作,甚至添加了一大堆其他 模式,其中一些 Sendmail 在此後的幾年中也積累了,包括一個額外的模式,它通過 SMTP 送出標準輸入/輸出。
-b*x*
- Zmailer 也
sendmail
支持一大堆模式,但在幕後將工作外包給了多個本地程序。- MMDF 是少數不提供
sendmail
shim 的之一,但要求使用者使用上述 MUA 配置設置來指向其submit
程序。MMDF doco 給出瞭如何配置 Mutt 的範例:設置 sendmail='/usr/mmdf/bin/submit -mlnre'
Windows NT 從來沒有真正類似的東西,這就是為什麼你會發現跨平台軟體普遍談論不同的行為。它也缺乏簡單地期望每個主機都以某種形式具有郵件功能的傳統。(例如,直到今天,FreeBSD 的各個部分都希望能夠將郵件發送給使用者和系統管理員,作為例行公事。)
(OS/2 也沒有傳統,甚至不是多使用者。但是,它也帶有一個 BSD Sendmail 埠。我曾經為 OS/2 編寫了一個替代 MTS,並為 IBM 提供的
sendmail.exe
.與 Zmailer 的類似sendmail
,它在幕後將事情外包給本地程序。)然而,在 Unices 上,郵件系統的存在被視為已讀。此外,在伺服器偵聽 TCP 套接字的想法變得普遍之前,這種機制不僅僅是郵件的規範。一個人執行一個 set-GID/set-UID 程序,並為其提供命令行參數和標準輸入數據以送出列印作業、安排 UUCP 作業和安排
at
作業。替換
sendmail
程序通常不像 BSD Sendmail 程序那樣設置 UID/設置 GID。(有時,就像 mini-qmail 和其他系統將所有郵件推送到另一台主機上的隊列一樣,根本不需要任何 set-ID 程序。其他時候,set-ID 程序是 MTS 的本機程序sendmail
包裝的程序。)並且它們通常只支持送出。但這仍然是迄今為止送出郵件的兩種方式之一。進一步閱讀
有三種方法可以從 php 中獲取郵件。
mail()
說話/usr/lib/sendmail
或類似mail()
向 MTA 發送 SMTP(主要用於 Windows)- phpmailer 是一個直接與 SMTP 對話的 PHP 對象,以及類似的啟用 TCP 的 PHP 程式碼
您列出的 3 個選項都是變體選項 1。
Postfix 和 ssmtp 都提供了一個 sendmail 二進製文件,php 在你呼叫之後呼叫它
mail()
。第四種訪問 sendmail 的方法是使用
popen()
,如果你走那條路線,一定要shellescape()
在所有參數上使用,由於幾年前未能逃脫 args,有一個主要的 WordPress 漏洞利用。這會導致功能從mail()
.在所有情況下,對您的伺服器的成功攻擊都會暴露您的 SMTP 憑據,因此它們不應與其他系統共享。或者應該是不可移植的類型(例如:如果您的伺服器的 SMTP 帳戶被鍵入到您的伺服器的 IP 地址)。切勿使用您的 IMAP 密碼,如果密碼洩露,您的身份(域名等)可能會被盜。