2011-06-19 117 views
20

我想用激活郵件編寫一個簡單的註冊表單,等等。但由於某些原因,mail()不會發送電子郵件,或者我的3個不同的電子郵件帳戶(hotmail,gmail,yahoo)不會收到它們,因此甚至不會將它們放入垃圾郵件文件夾中。PHP郵件()不起作用

代碼:

<?php 
    $mailto = '[email protected]'; 
    $subject = 'the subject'; 
    $message = 'the message'; 
    $from = '[email protected]'; 
    $header = 'From:'.$from; 

    if(mail($mailto,$subject,$message,$header)) { 
     echo 'Email on the way'; 
    } 
?> 

每次它輸出 '在路上電子郵件' 這樣的郵件()返回true,對不對?我真的不明白,我甚至試圖關閉我的小流氓(雖然我沒有阻止SMTP)。

+3

您是在本地計算機上還是在真實的虛擬主機上測試它?如果它在本地計算機上,則可能是它沒有配置爲發送/接收郵件。 – itsols

+0

sendmail如何在你的php.ini文件中設置?這是在* nix或Windows上? –

+0

@ ETWW-Dave:我敢在最近的電腦上找到實際的'sendmail';)但是,我懷疑電子郵件被下一個SMTP服務器拒絕。 – Piskvor

回答

0

檢查您的phpinfo和/或php.ini您的郵件設置,並確保您可以發送任何程序php試圖使用的郵件。如果該命令執行但該函數將成功,但不知道該郵件是否實際發送。

0

檢查您的郵件服務器的郵件日誌。在Unix-ish系統上,通常是/ var/log/maillog。在Windows上,誰知道,但應該有某個地方的日誌。如果郵件返回TRUE,那麼它連接的任何郵件服務器都已接受郵件以便最終傳送。之後,mail()不再以任何方式參與,並且由SMTP服務器來完成實際交付。

在現實世界中,mail()是你在信箱中放下一封信,並將其放入郵箱中。之後的一切完全超出了PHP的範圍和控制範圍。

1

您可能需要將正確的行尾字符添加到標題。它可能是\n\r\n

13

請參閱this article by Jeff Atwood

簡而言之:僅僅因爲您的代碼已將電子郵件遞交給郵件傳輸代理,並不意味着它將被傳遞。是的,mail()返回true意味着「接受送貨」 - 這意味着「看起來像一封電子郵件,我會嘗試送達」,而不是「送達」。即使the manual for mail() says

要注意,這是很重要的,只是因爲郵件被接受交付,它意味着郵件實際上會達到預期的目標。

SOOOO:檢查您的MTA(被電子郵件從你的本地計算機發送?),嘗試發送到本地地址(如果地址是本地的,它獲取傳遞?),嘗試發送使用與您的PHP腳本相同的設置,從您的郵件客戶端發送電子郵件,嘗試發送給一個較小的郵件託管服務器,以允許您關閉反垃圾郵件(它是否在您的網絡外部傳送?)。另外,閱讀那篇文章,並檢查那裏提到的幾點。

4

也許你的服務器沒有配置爲處理mail()

<?php 
    print phpinfo(); 
?> 

,並期待在sendmail_path

+13

下一步是什麼?我的是_/usr/local/bin/phpsendmail_ – newbieguy

0

如果這是一個Linux服務器它可能設置爲發送到本地郵件隊列。當我遇到這個問題時,我通過在指向我們ISP的郵件服務器的linux服務器所使用的DNS服務器上添加一個MX條目來實現它。