如何获取mail()函数的错误消息?


79

我一直在使用PHPmail()函数。

如果邮件由于任何原因未发送,我想回显错误消息。我该怎么做?

就像是

$this_mail = mail('example@example.com', 'My Subject', $message);

if($this_mail) echo 'sent!';
else echo error_message;

谢谢!

Answers:


117

如果您在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


4
我认为这仅在使用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
njam

error_get_last()返回NULL!但是邮件功能返回true!
会计师م18年

为什么这个答案很流行,但为什么没有上升到线程的顶端?我不知道人们会怎么完全想念它。
ashleedawg '18

4
@ashleedawg-我什至不知道这是怎么引起这么多投票的。我从未见过过-error_get_last()与php的本地mail()函数一起使用。实际上,我只是勉强设置了错误的邮件,然后再尝试一次以确保安全;我什么都没有。
CreationTribe

是$ errorMessage = error_get_last()['message'];行吗?只是应该是$ errorMessage = error_get_last(); ?如果尝试第一种方法,我会收到错误消息
Jabbamonkey

15

用php发送邮件不是一个一步的过程。mail()返回true / false,但是即使返回true,也并不意味着将要发送消息。所有mail()所做的就是将消息添加到队列中(使用sendmail或您在php.ini中设置的任何内容)

没有可靠的方法来检查消息是否已在php中发送。您将不得不查看邮件服务器日志。


3
邮件日志在哪里?
Mahefa

5

就我而言,无论我做什么(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



3

没有与该mail()功能关联的错误消息。只有一个truefalse电子邮件是否已接受发送,返回。不是最终能否交付,而是基本上域是否存在以及地址是否为有效格式的电子邮件地址。


1
$e=error_get_last();
if($e['message']!==''){
    // An error function
}

error_get_last(); -返回上一次发生的错误


6
您应该在代码中添加一些解释,以免将来对他人有所帮助。如何回答
cosmoonot17年

2
同意以前的评论。请修改您的答案以包含一些说明。纯代码的答案对教育未来的SO读者几乎没有作用。您的答案在质量不高的审核队列中。
mickmackusa

0

正如其他人所说,发送邮件没有错误跟踪,它返回将邮件添加到传出队列的布尔结果。如果要跟踪真正的成功失败,请尝试将SMTP与邮件库(如Swift Mailer,Zend_Mail或phpmailer)一起使用。


0

试试这个。如果我对任何文件有任何错误,那么我的电子邮件ID上会有错误邮件。创建两个文件index.phpcheckErrorEmail.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");


?>

4
什么是include('dereporting.php');?
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.