我一直在使用PHPmail()
函数。
如果邮件由于任何原因未发送,我想回显错误消息。我该怎么做?
就像是
$this_mail = mail('example@example.com', 'My Subject', $message);
if($this_mail) echo 'sent!';
else echo error_message;
谢谢!
Answers:
如果您在Windows上使用SMTP,则可以error_get_last()
在whenmail()
返回false时使用。请记住,这不适用于PHP的本机mail()函数。
$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
$errorMessage = error_get_last()['message'];
}
使用print_r(error_get_last())
,您将获得如下内容:
[类型] => 2
[消息] => mail():无法通过“ xxxx”端口25连接到邮件服务器,无法验证php.ini中的“ SMTP”和“ smtp_port”设置,或使用ini_set()
[file] = > C:\ www \ X \ X.php
[line] => 2
error_get_last()
返回NULL
!但是邮件功能返回true!
用php发送邮件不是一个一步的过程。mail()返回true / false,但是即使返回true,也并不意味着将要发送消息。所有mail()所做的就是将消息添加到队列中(使用sendmail或您在php.ini中设置的任何内容)
没有可靠的方法来检查消息是否已在php中发送。您将不得不查看邮件服务器日志。
就我而言,无论我做什么(error_get_last()
或ini_set('display_errors',1);
)不显示错误消息,我都无法在PHP脚本中获取错误消息
根据这篇文章
$ mail的返回值仅是指服务器的邮件系统是否接受了要传递的消息,并且不,也不会以任何方式知道您是否在提供有效的参数。例如,如果sendmail加载失败(例如,如果未正确安装),则返回值将为false,但如果sendmail加载正确但接收者地址不存在,则返回值将为true。
我确认这一点是因为在尝试mail()
在我的PHP脚本中使用失败后,结果发现该sendmail
机器上未安装该文件,但是php.ini变量sendmail_path
却/usr/sbin/sendmail -t -i
1-我从软件包管理器安装了sendmail shell> dnf install sendmail
2-我开始了 shell> service sendmail start
3-现在,如果任何PHPmail()
函数失败,我将sendmail
在/var/mail/
目录下找到该程序的错误。每个用户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 -----
<no-one@errorerrorerrorerror51248562221e542.com>
(reason: 550 Host unknown)
我的系统是带有apache2.4和PHP 7.2的Linux Fedora 28
$e=error_get_last();
if($e['message']!==''){
// An error function
}
error_get_last(); -返回上一次发生的错误
试试这个。如果我对任何文件有任何错误,那么我的电子邮件ID上会有错误邮件。创建两个文件index.php
,checkErrorEmail.php
然后将它们上传到您的服务器。然后加载index.php
您的浏览器。
Index.php
<?php
include('checkErrorEmail.php');
include('dereporting.php');
$temp;
echo 'hi '.$temp;
?>
checkErrorEmail.php
<?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 "<br><br><br><br>errno ".$errno.",<br>errstr ".$errstr.",<br>errfile ".$errfile.",<br>errline ".$errline;
if($errno)
{
error_log("Error: $errstr \n error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);
}
/*switch ($errno) {
case E_USER_ERROR:
// Send an e-mail to the administrator
error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);
// Write the error to our log file
//error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
break;
case E_USER_WARNING:
// Write the error to our log file
//error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
break;
case E_USER_NOTICE:
// Write the error to our log file
// error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
break;
default:
// Write the error to our log file
//error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", 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");
?>