2011-02-06 45 views
9

我正在編寫一個相當簡單的註冊php腳本,它使用PHP內置的mail()函數向用戶發送激活鏈接。捕獲PHP郵件()錯誤並顯示合理的用戶錯誤消息

問題是,我可以捕獲正常的錯誤,如電子郵件格式化,但一旦它觸發到服務器,並說用戶已經放入一個失敗的電子郵件地址,我不知道如何捕捉這個錯誤,告訴用戶發生了什麼事。

例如在現階段,我得到這個:

Warning: mail() [function.mail]: SMTP server response: 554 : Recipient address rejected: Relay access denied in ** on line 70

任何想法我能做些像這樣的錯誤?我知道使用@符號來壓制這個錯誤,但我有點想做更多的事情並處理這個問題。

回答

21

使用布爾結果檢測錯誤:

$success = @mail(...); 

那麼你一定要找出哪些內部錯誤導致的問題,所以使用:

$error = error_get_last(); 
preg_match("/\d+/", $error["message"], $error); 
switch ($error[0]) { 
    case 554: 
     ... 
    default: 
     ... 

注意這與PHP 5.2僅限於此。

無法驗證交付或使用PHP查看運輸錯誤郵件。你需要一個pop3輪詢處理程序。

0

你想捕捉儘可能多的,你可以在發送之前關閉郵件,淨化你的投入,以確保它確實是你希望它是

您可以使用filter_var檢查什麼的電子郵件地址真的是一個地址, 檢查整數落在你的允許範圍內,等

從地址郵件頭設置到一個地方,你可以檢查傳送失敗:

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

您可以阿爾斯o檢查預期執行的郵件:

if(mail($to,$subject,$message)) 

而且最後的事情,你可能不希望display warnings在實際環境中,你可以關閉它們,或者通過ini文件或使用ini_set

+0

真實的東西,但不是一個問題的答案。也有可能會導致smtp錯誤的事情,而這些錯誤事先不能提供。例如垃圾郵件攔截列表。 – 2011-02-06 14:52:17

-2

最好的辦法就是使用像Swift Mailer這樣的庫,它引發可輕鬆處理的異常。

+4

這是一個治癒問題,但不是一個答案如何自己解決它。現在幾乎所有的圖書館都可以使用,當然他們可以安全地做大量的工作。但是很遺憾看到人們失去了解決基本問題的能力,因爲他們只是不瞭解他們所使用的編程語言的基礎知識。 – 2011-02-06 14:53:57

+0

沒錯,這不是問題的答案,而是它提出了一種解決方法這個問題更務實。 – Jan 2011-02-06 14:59:47