【发布时间】:2011-03-12 07:58:25
【问题描述】:
我一直在使用 PHP mail() 函数。
如果邮件因任何原因未发送,我想回显错误消息。我该怎么做?
有点像
$this_mail = mail('example@example.com', 'My Subject', $message);
if($this_mail) echo 'sent!';
else echo error_message;
谢谢!
【问题讨论】:
我一直在使用 PHP mail() 函数。
如果邮件因任何原因未发送,我想回显错误消息。我该怎么做?
有点像
$this_mail = mail('example@example.com', 'My Subject', $message);
if($this_mail) echo 'sent!';
else echo error_message;
谢谢!
【问题讨论】:
如果您在 Windows 上使用 SMTP,则可以在 mail() 返回 false 时使用 error_get_last()。请记住,这不适用于 PHP 的本机 mail() 函数。
$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
$errorMessage = error_get_last()['message'];
}
使用print_r(error_get_last()),你会得到这样的结果:
[类型] => 2
[message] => mail():无法在“x.x.x.x”端口 25 连接到邮件服务器,请验证 php.ini 中的“SMTP”和“smtp_port”设置或使用 ini_set()
[文件] => C:\www\X\X.php
[行] => 2
【讨论】:
error_get_last() 返回NULL !!但是 mail 函数返回 true !
在 php 中发送邮件不是一个步骤。 mail() 返回真/假,但即使它返回真,也不意味着消息将被发送。所有 mail() 所做的就是将消息添加到队列中(使用 sendmail 或您在 php.ini 中设置的任何内容)
没有可靠的方法来检查消息是否已在 php 中发送。您必须查看邮件服务器日志。
【讨论】:
就我而言,无论我做什么(error_get_last() 或 ini_set('display_errors',1);)都无法在我的 PHP 脚本中收到错误消息,但不会显示错误消息
$mail 的返回值仅指您是否 服务器的邮件系统接受了要投递的消息,并且 不能也不能以任何方式知道您是否提供了有效的 论据。例如,如果 sendmail 则返回值为 false 加载失败(例如,如果没有正确安装),但会 如果 sendmail 正确加载但收件人地址返回 true 不存在。
我确认这一点,因为在我的 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() 函数失败,我会发现 sendmail 程序的错误记录在 /var/mail/ 目录下。每个用户 1 个文件
例如,这个 sn-p 取自我的 /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
【讨论】:
您可以使用PEAR mailer,它具有相同的接口,但在出现问题时返回一个PEAR_Error。
【讨论】:
没有与mail() 函数相关的错误消息。仅返回true 或false 关于电子邮件是否被接受发送。不是最终是否送达,而是域名是否存在以及地址是否为格式有效的电子邮件地址。
【讨论】:
$e=error_get_last();
if($e['message']!==''){
// An error function
}
error_get_last(); - 返回最后发生的错误
【讨论】:
正如其他人所说,发送邮件没有错误跟踪,它返回将邮件添加到传出队列的布尔结果。如果您想跟踪真正的成功失败,请尝试将 SMTP 与 Swift Mailer、Zend_Mail 或 phpmailer 等邮件库一起使用。
【讨论】:
试试这个。如果我在任何文件上遇到任何错误,那么我的电子邮件 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");
?>
【讨论】: