2011-03-31 101 views
6

我正在使用php的mail()函數進行電子郵件輸入聯繫表單到相應人員的簡單過程。奇怪的是,表單總是用來處理電子郵件,但有一天這一切都停止了,現在函數返回false,但根本沒有提供任何錯誤。PHP mail()函數返回false,但沒有錯誤

該網站位於共享主機。當被問及這一點,他們推薦我用的SMTP中繼xx.xxx.x.xxx

糾正我,如果我錯了,但郵件()函數沒有提供規定的這樣做呢?當然,主機需要配置正確的繼電器嗎?

我的問題是這樣的:這似乎是一個錯誤的主機配置,或者它是我的代碼?下面是我用的郵件代碼示例:

$to = "[email protected]"; //to who? 
$subject = "Website Contact: $mysubject"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "From: $fname<$email1>\r\n"; 
$headers .= "Reply-To: $email1\r\n"; 
$headers .= "Return-Path:$email1\r\n"; 
$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; 
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; 
$msg2 = nl2br($msg); 

$send = mail($to, $subject, $msg2, $headers); //process mail 

if(!$send): 
    //error stuff here 
endif; 

非常感謝, 西蒙

@eisberg - 我用這樣的自定義錯誤處理程序:

//error handler function 
function customError($errno, $errstr){ 
$err = "\n".date('Y-m-d H:m:s')." Error: [$errno] $errstr"; 
$fh = fopen("errlog.txt", 'a+'); 
fwrite($fh, $err); 
fclose($fh); 
} 
set_error_handler("customError", E_ALL); 

會那意味着我需要將set_error_handler("customError", E_ALL);更改爲set_error_handler("customError", -1);

+0

嘗試** error_reporting(-1); **上面的代碼。我希望你得到一個可用的消息。來源:http://php.net/manual/en/function.error-reporting.php – eisberg 2011-03-31 07:39:50

+0

@eisberg - 我有一個自定義錯誤函數記錄所有錯誤(E_ALL)文件,仍然沒有!它挑起最挑剔的錯誤,但仍然沒有任何郵件()相關。 – SimonDowdles 2011-03-31 07:47:45

+0

'E_ALL'在所有PHP版本中都不是'-1':-) – eisberg 2011-03-31 07:50:47

回答

7

聽起來像你的主機禁用mail(),你應該考慮使用SMTP發送郵件,一個好的PHP郵件類如SwiftMailer將允許你通過SMTP輕鬆發送郵件。

+0

感謝您的有用資源。它肯定似乎是一個更好的方法,全面。至少我可以依靠客戶端SMTP帳戶的詳細信息來反對依靠一個共享服務器,這是一個錯誤的地獄。再次感謝。 – SimonDowdles 2011-03-31 07:28:35

17

mail()函數返回false,但沒有錯誤

歡迎PHP!

這似乎是一個錯誤的主機配置,或者它是我的代碼?

誰知道? mail()是一個黑盒,當出現問題時,您將無法找到有用的信息。

當被問及此,他們建議我使用SMTP中繼...

事實上,你應該。仔細看看SwiftMailer,這是一個優秀的,全面的現代PHP郵件庫,可以直接與SMTP服務器通信。它擅長構建MIME消息,就像你上面似乎一直苦苦思索的一樣。

其他熱門選項包括PEAR's MailZend Framework's Zend_Mail,和經典的經典,PHPMailer

+1

+1推薦SwiftMailer,毫無疑問是最完整的PHP Mailer庫,並且正在開發中! – ChrisR 2011-03-31 07:28:33

+0

黑框黑,哈哈。 – 2011-03-31 07:30:45

+1

SwiftMailer是我決定運行的,看看lib和docs,它和使用php的mail()函數一樣簡單! – SimonDowdles 2011-03-31 07:41:34

1

更可能是主機配置。我認爲(但可能是錯誤的),mail()使用服務器郵件命令。因此,如果服務器上沒有安裝sendmail/postfix/ssmtp或其他MTA,則無法工作。
如果他們告訴你直接訪問SMTP服務器,你應該使用另一個實現SMTP協議和Mail類的庫來構建郵件並直接通過SMTP發送(在PEAR或Zend Framework PHP類中,你會發現它)

1

你應該看看郵件日誌。他們持有答案。雖然你可能不得不與你的託管公司搏鬥。

+0

我們甚至不去那裏,他們說「他們不能直接訪問他們」,這意味着他們可能正在銷售位於世界另一端的服務器上的主機空間,他們實際上不知道他們在做什麼。 SMTP的方法將是。 – SimonDowdles 2011-03-31 07:36:27

+0

@webfac在這種情況下,SMTP就好了:) – vbence 2011-03-31 07:52:51

0

檢查是否允許網站通過從終端發送 getsebool httpd_can_sendmail發送郵件。如果輸出爲

httpd_can_sendmail --> off 

通過發出setsebool httpd_can_sendmail 1 命令給https發送郵件的權限。您必須擁有發行這些命令的root權限。

0

我有類似的問題,我的網站是由共享託管服務託管。我可以通過修復標題來找出問題。問題是:

$ headers。=「From:$ fname \ r \ n」;

您在from字段中使用了用戶電子郵件。我的主機只接受帶有此域的域名的電子郵件。所以我用它替換它:

$headers = "From: [email protected]" ."\r\n" ; 

它解決了問題! PHP郵件()後,工作正常。

相關問題