我一直在使用PHP mail()函數。
如果郵件由于任何原因未發送,我想回顯錯誤消息。 我該怎么做?
就像是
$this_mail = mail('example@example.com', 'My Subject', $message);
if($this_mail) echo 'sent!';
else echo error_message;
謝謝!
當mail()返回false時,可以使用error_get_last()。
$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
$errorMessage = error_get_last()['message'];
}
使用print_r(error_get_last()),您將獲得如下內容:
[type] => 2
[message] => mail(): Failed to connect to mailserver at"x.x.x.x" port 25, verify your"SMTP" and"smtp_port" setting in php.ini or use ini_set()
我認為這僅在使用SMTP(Windows?)時有效。在Linux上,如果您使用" sendmail",則" mail()"函數只會返回該命令的退出狀態:github.com/php/php-src/blob/PHP-5.6.25/ext/standard/mail.c# L404沒有可靠的方法來獲取錯誤消息afaik。我嘗試使用以下腳本:gist.github.com/njam/a34ecd9ef195c37c8354ab58f7bfcc9b
error_get_last()返回NULL !!但是mail函數返回true!
為什么它的答案如此流行,但為什么它沒有引起人們的關注呢?我不知道人們會怎么完全想念它。
@ashleedawg-我什至不知道這怎么引起了這么多的投票。我從未見過-見過error_get_last()與phps本機mail()函數一起工作。實際上,我只是勉強設置了錯誤的郵件,然后再嘗試一次以確保;我什么也沒得到。
用php發送郵件不是一個一步的過程。 mail()返回true / false,但是即使返回true,也并不意味著將要發送消息。所有mail()所做的就是將消息添加到隊列(使用sendmail或您在php.ini中設置的任何內容)
沒有可靠的方法來檢查消息是否已在php中發送。您將不得不查看郵件服務器日志。
您可以使用具有相同接口的PEAR郵件程序,但是在出現問題時返回PEAR_Error。
就我而言,無論我做什么(error_get_last()或ini_set('display_errors',1);),我都無法在我的PHP腳本中收到錯誤消息,也不顯示錯誤消息
根據這篇文章
The return value from $mail refers only to whether or not your
server's mailing system accepted the message for delivery, and does
not and can not in any way know whether or not you are providing valid
arguments. For example, the return value would be false if sendmail
failed to load (e.g. if it wasn't installed properly), but would
return true if sendmail loaded properly but the recipient address
doesn't exist.
我確認這一點是因為在嘗試在我的PHP腳本中使用mail()失敗之后,結果發現我的計算機上未安裝sendmail,但是php.ini變量sendmail_path為/usr/sbin/sendmail -t -i
1-我從軟件包管理器shell> dnf install sendmail安裝了sendmail
2-我開始了它shell> service sendmail start
3-現在,如果任何PHP mail()函數失敗,我會發現/var/mail/目錄下記錄的sendmail程序錯誤。每個用戶1個文件
例如,此片段摘自我的/var/mail/root文件
The original message was received at Sun, 29 Jul 2018 22:37:51 +0200
from localhost [127.0.0.1]
----- The following addresses had permanent fatal errors -----
(reason: 550 Host unknown)
我的系統是帶有apache2.4和PHP 7.2的linux Fedora 28
沒有與mail()函數關聯的錯誤消息。關于是否接受電子郵件發送,僅返回true或false。不是最終決定是否交付,而是基本上域是否存在以及地址是否為有效格式的電子郵件地址。
$e=error_get_last();
if($e['message']!==''){
// An error function
}
error_get_last(); -返回上一次發生的錯誤
您應該在代碼中添加一些解釋,以免將來對他人有所幫助。如何回答
同意以前的評論。請修改您的答案以包含一些說明。純代碼的答案對教育未來的SO讀者幾乎沒有作用。您的答案在質量不高的審核隊列中。
嘗試這個。如果我對任何文件有任何錯誤,那么我的電子郵件ID上會出現錯誤郵件。創建兩個文件index.php和checkErrorEmail.php,并將它們上傳到您的服務器。然后使用瀏覽器加載index.php。
的index.php
include('checkErrorEmail.php');
include('dereporting.php');
$temp;
echo 'hi '.$temp;
?>
checkErrorEmail.php
// Destinations
define("ADMIN_EMAIL","pradeep.callus7@hotmail.com");
//define("LOG_FILE","/my/home/errors.log");
// Destination types
define("DEST_EMAIL","1");
//define("DEST_LOGFILE","3");
/* Examples */
// Send an e-mail to the administrator
//error_log("Fix me!", DEST_EMAIL, ADMIN_EMAIL);
// Write the error to our log file
//error_log("Error", DEST_LOGFILE, LOG_FILE);
/**
* my_error_handler($errno, $errstr, $errfile, $errline)
*
* Author(s): thanosb, ddonahue
* Date: May 11, 2008
*
* custom error handler
*
* Parameters:
* ?$errno: ? Error level
* ?$errstr: ?Error message
* ?$errfile: File in which the error was raised
* ?$errline: Line at which the error occurred
*/
function my_error_handler($errno, $errstr, $errfile, $errline)
{
echo"errno".$errno.",errstr".$errstr.",errfile".$errfile.",errline".$errline;
if($errno)
{
error_log("Error: $errstr
error on line $errline in file $errfile
", DEST_EMAIL, ADMIN_EMAIL);
}
/*switch ($errno) {
case E_USER_ERROR:
// Send an e-mail to the administrator
error_log("Error: $errstr
Fatal error on line $errline in file $errfile
", DEST_EMAIL, ADMIN_EMAIL);
// Write the error to our log file
//error_log("Error: $errstr
Fatal error on line $errline in file $errfile
", DEST_LOGFILE, LOG_FILE);
break;
case E_USER_WARNING:
// Write the error to our log file
//error_log("Warning: $errstr
in $errfile on line $errline
", DEST_LOGFILE, LOG_FILE);
break;
case E_USER_NOTICE:
// Write the error to our log file
// error_log("Notice: $errstr
in $errfile on line $errline
", DEST_LOGFILE, LOG_FILE);
break;
default:
// Write the error to our log file
//error_log("Unknown error [#$errno]: $errstr
in $errfile on line $errline
", DEST_LOGFILE, LOG_FILE);
break;
}*/
// Don't execute PHP's internal error handler
return TRUE;
}
// Use set_error_handler() to tell PHP to use our method
$old_error_handler = set_error_handler("my_error_handler");
?>
什么是include(dereporting.php);?
正如其他人所說,發送郵件沒有錯誤跟蹤,它返回將郵件添加到傳出隊列的布爾結果。如果要跟蹤真正的成功失敗,請嘗試將SMTP與郵件庫(如Swift Mailer,Zend_Mail或phpmailer)一起使用。