2013-01-08 107 views

回答

2

在某些時候,您必須與SMTP服務器通話。通過本地主機上的SMTP服務器發送是最乾淨的選項,並且最有可能成功通過垃圾郵件過濾器。

郵件服務器的功能相當複雜。讓我們把你的平均的電子郵件,因爲它從你的電子郵件客戶端的電子郵件服務器到達與出站的主機作爲目標:

  1. 服務器檢查您的用戶帳戶,並確保它是有效的。
  2. 電子郵件進入隊列或分別爲每個收件人或作爲一個消息(取決於服務器)。
  3. 服務器在隊列中查找電子郵件並處理每個收件人地址。這需要對每個目標域的MX記錄進行DNS查找。
  4. 電子郵件服務器連接到MX記錄指定的地址,並通過SMTP傳遞電子郵件。
  5. 成功後,電子郵件將從隊列中刪除。如果失敗,電子郵件可能會保留在隊列中,並且服務器稍後再次嘗試(指數退避 - 請參閱灰名單)或放入郵件隊列中,稍後通過POP3檢查您的電子郵件時將返回給您。

隊列中的下一個電子郵件服務器會重複上述操作,直到最終服務器收到電子郵件並位於收件人的郵箱中。

在PHP中這樣做是可能的,但我不推薦它。 MX記錄查找可能會非常棘手,因爲人們會做各種不符合郵件服務器容忍的事情。另外,您的腳本可能會在試圖直接連接到目標SMTP服務器時超時。某些服務器也被配置爲「灰名單」電子郵件,這意味着電子郵件最初將被拒絕,但會在稍後被接受(例如30分鐘不常見)。平均PHP腳本將無法處理該情況。

+0

所以沒有smtp服務器的PHP本身不能發送電子郵件的權利? – Yalamber

+0

嗯,在某些時候,某個地方必須與SMTP服務器通話。這就是電子郵件的工作原理。 PHP(以及任何語言,如果它遵循SMTP協議)可以直接與SMTP服務器通話。由於發送電子郵件實際上是一個複雜的話題,所以它變得非常麻煩。 (我們有12個當前的isis RFC,有大量過時的RFC,每個平均大約有50個頁面)。這就是爲什麼人們將電子郵件從PHP傳遞到像本地SMTP服務器那樣可靠的東西來處理消息。 'sendmail'直接將電子郵件發送到本地隊列進行發送。 – CubicleSoft

+0

對於'sendmail',它將電子郵件放入本地盒子上SMTP服務器的隊列中發送出去。它往往比連接和交談本地SMTP服務器的速度更快。因爲它是一個* NIX OS程序,所以你不能保證你的PHP代碼能夠在任何地方運行。我傾向於傾向於便攜式代碼,因此我不會將自己綁定到單個系統。 – CubicleSoft

相關問題