2012-08-04 121 views
31

PHP的mail函數似乎在乾淨的系統上傳遞郵件,沒有明顯的配置由管理員或網站管理員完成(在php.ini等沒有SMTP配置)。 mail函數如何將郵件傳遞到遠程服務器?PHP的`mail`如何工作?

+0

爲什麼要完成該配置?除非你的意思是將郵件發送給網站管理員,否則網站管理員無法配置任何東西。 – 11684 2012-08-04 20:21:47

+0

你問的是錯誤的問題 - PHP中的mail()函數沒有錯 - 它不是不可靠的。問題是郵件的內容和分發。更好的問題是'我怎樣才能避免我的郵件以垃圾郵件文件夾結尾?'。 – Repox 2012-08-04 20:22:32

+0

他說'可靠',但這真的不是一個問題...這裏 – Alex 2012-08-04 20:26:05

回答

22

在* nix上調用sendmail二進制文件,然後使用郵件配置路由電子郵件。在Windows上,它發送到SMTP服務器。在這兩種情況下,系統管理員都會設置郵件系統。

+2

感謝您回答我問的問題。我不確定PHP是否自己聯繫遠程服務器並處理SMTP,或者是否將該任務交給了本地服務器上的MTA。另外,你知道爲什麼這個問題被降低了嗎?我想很多人只是誤解了它。它似乎符合該網站的範圍(由[FAQ](http://stackoverflow.com/faq)定義)。 – 2012-08-04 22:26:26

+5

@Tom:人們已經注意到了措辭而不是問題。 – 2012-08-04 22:33:19

+0

我修改了問題以幫助解決問題。我不明白什麼是「含糊,模糊,不完整,過於寬泛或修辭」。我試着在PHP聊天室中詢問,但沒有主持人在那裏,或沒有人回覆。有沒有更好的地方瞭解該網站? – 2012-08-04 22:42:36

4

實際上,它確實不是那麼可靠,除非底層的sendmail或其他配置正確。

亞馬遜SES比您使用的任何服務器都擁有更好的服務器,並且獲得郵件的次數超過mail()

你不應該使用mail()的真正原因是因爲你的服務器的IP地址可能完全不知道郵件服務,比如GMail,Yahoo等,並且它很可能被標記爲垃圾郵件。爲什麼它被標記爲垃圾郵件?因爲mail()是非常容易和簡單的利用垃圾郵件的目的。

+2

這不是真的回答這個問題,它是如何工作的。我使用SES做其他事情。這只是想知道它是如何在沒有配置的乾淨安裝上工作的,並不是爲什麼它被標記爲垃圾郵件或我應該使用什麼。不過謝謝你的回答。 sendmail, – 2012-08-04 22:24:47

+0

。 /會話。 – David 2012-08-05 03:58:29

4

mail()使用sendmail,它使用DNS來查找目標域的MX記錄並直接發送到那裏。而已。

由於目標服務器可能不知道您的IP地址,特別是如果它是NAT,它可能被標記爲垃圾郵件。

您可以修改您的配置以使用不同的(合法廣告已知)smtp服務器充當中介。

7

您可以檢測它如何工作如下。

首先方法

$ ltrace php -r "mail('[email protected]', 'Test', 'Hello world');" 2>&1 | grep sendmail 
memcpy(0x095ea168, "sendmail_from", 14)   = 0x095ea168 
memcpy(0x095ea1e0, "sendmail_path", 14)   = 0x095ea1e0 
popen("/usr/sbin/sendmail -t -i ", "w")   = 0x0977c7c0 

從上述命令的結果可以看出,在popen()函數打開的/usr/sbin/sendmail -t -i的過程。

$ ls -l /usr/sbin/sendmail 
... /usr/sbin/sendmail -> exim4 

所以sendmail是符號鏈接到exim4因此sendmail -t -i調用exim4 -t -i

而且在exim4手冊頁面,您可以閱讀有關這些選項-t -i

$ man exim4 | grep ' -t -i' 
-ti  This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail. 

方法二

安裝snoopy和運行:

# grep snoopy /var/log/auth.log | tail 
... php -r mail('[email protected]', 'Test', 'Hello world'); 
... /usr/sbin/sendmail -t -i 
... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj 

上述命令的結果顯示已執行的命令的順序。