【问题标题】:How can I get the error message for the mail() function?如何获取 mail() 函数的错误消息?
【发布时间】: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 email


    【解决方案1】:

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

    【讨论】:

    • 我认为这仅在您使用 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() 与 php 的本机 mail() 函数一起使用。事实上,我只是勉强设置了一个错误的邮件,并再次尝试了这个以确保确定;我一无所有。
    • 是行 $errorMessage = error_get_last()['message'];应该是 $errorMessage = error_get_last(); ?如果我尝试第一种方法,我会收到错误...
    【解决方案2】:

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

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

    【讨论】:

    • 邮件日志在哪里?
    【解决方案3】:

    就我而言,无论我做什么(error_get_last()ini_set('display_errors',1);)都无法在我的 PHP 脚本中收到错误消息,但不会显示错误消息

    根据this post

    $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

    【讨论】:

      【解决方案4】:

      您可以使用PEAR mailer,它具有相同的接口,但在出现问题时返回一个PEAR_Error。

      【讨论】:

      【解决方案5】:

      没有与mail() 函数相关的错误消息。仅返回truefalse 关于电子邮件是否被接受发送。不是最终是否送达,而是域名是否存在以及地址是否为格式有效的电子邮件地址。

      【讨论】:

        【解决方案6】:
        $e=error_get_last();
        if($e['message']!==''){
            // An error function
        }
        

        error_get_last(); - 返回最后发生的错误

        【讨论】:

        • 您应该在代码中添加一些解释,以便将来帮助其他人。 How to Answer
        • 同意之前的评论。请编辑您的答案以包括一些解释。仅代码的答案对教育未来的 SO 读者几乎没有作用。您的答案因质量低劣而在审核队列中。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          试试这个。如果我在任何文件上遇到任何错误,那么我的电子邮件 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");
          
          
          ?>
          

          【讨论】:

          • 什么是 include('dereporting.php');?
          猜你喜欢
          • 2014-03-28
          • 2020-01-19
          • 2013-04-02
          • 2021-12-16
          • 1970-01-01
          • 2019-10-10
          • 2014-11-08
          相关资源
          最近更新 更多