Wie kann ich die Fehlermeldung für die Funktion mail () erhalten?

79

Ich habe die PHP- mail()Funktion verwendet.

Wenn die E-Mail aus irgendeinem Grund nicht gesendet wird, möchte ich die Fehlermeldung wiederholen. Wie würde ich das machen?

Etwas wie

$this_mail = mail('[email protected]', 'My Subject', $message);

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

Vielen Dank!

Rohan
quelle

Antworten:

118

Wenn Sie unter Windows SMTP verwenden, können Sie verwenden, error_get_last()wenn mail()false zurückgegeben wird. Beachten Sie, dass dies mit der nativen mail () - Funktion von PHP nicht funktioniert.

$success = mail('[email protected]', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}

Mit erhalten print_r(error_get_last())Sie so etwas wie:

[type] => 2
[message] => mail (): Verbindung zum Mailserver an "xxxx" -Port 25 fehlgeschlagen, überprüfen Sie Ihre Einstellungen für "SMTP" und "smtp_port" in php.ini oder verwenden Sie ini_set ()
[file] = > C: \ www \ X \ X.php
[Zeile] => 2

user2317245
quelle
4
Ich gehe davon aus, dass dies nur funktioniert, wenn Sie SMTP (Windows?) Verwenden. Wenn Sie unter Linux "sendmail" verwenden, gibt die Funktion "mail ()" nur den Beendigungsstatus dieses Befehls zurück: github.com/php/php-src/blob/PHP-5.6.25/ext/standard/mail.c# L404 Es gibt keinen zuverlässigen Weg, um die Fehlermeldung afaik zu erhalten. Ich habe es mit diesem Skript versucht: gist.github.com/njam/a34ecd9ef195c37c8354ab58f7bfcc9b
njam
error_get_last()Rückkehr NULL!! Die Mail-Funktion gibt jedoch true zurück!
Buchhalter م
Warum steigt diese Antwort nicht an die Spitze des Threads, wenn sie so beliebt ist? Ich frage mich, wie die Leute es vielleicht komplett vermissen.
Ashleedawg
4
@ashleedawg - Ich weiß nicht einmal, wie das so viele Up-Votes bekommen hat. Ich habe noch nie gesehen, dass error_get_last () mit der nativen mail () -Funktion von php funktioniert. Tatsächlich habe ich gerade noch ein schlechtes Mailing eingerichtet und es noch einmal versucht, nur um sicherzugehen; Ich habe absolut nichts.
CreationTribe
ist die Zeile $ errorMessage = error_get_last () ['message']; soll nur $ errorMessage = error_get_last () sein; ? Ich erhalte eine Fehlermeldung, wenn ich den ersten Weg versuche ...
Jabbamonkey
15

Das Senden von E-Mails in PHP ist kein einstufiger Prozess. mail () gibt true / false zurück, aber selbst wenn es true zurückgibt, bedeutet dies nicht, dass die Nachricht gesendet wird. Alles, was mail () tut, ist, die Nachricht zur Warteschlange hinzuzufügen (mit sendmail oder was auch immer Sie in php.ini festgelegt haben)

Es gibt keine zuverlässige Möglichkeit zu überprüfen, ob die Nachricht in PHP gesendet wurde. Sie müssen die Mailserver-Protokolle durchsuchen.

Sergey Eremin
quelle
3
und wo ist das mail log?
Mahefa
5

In meinem Fall konnte ich die Fehlermeldung in meinem PHP-Skript nicht erhalten, egal was ich tue ( error_get_last()oder ini_set('display_errors',1);), die Fehlermeldung wird nicht angezeigt

nach diesem Beitrag

Der Rückgabewert von $ mail bezieht sich nur darauf, ob das Mailing-System Ihres Servers die Nachricht zur Zustellung angenommen hat oder nicht, und kann und kann in keiner Weise wissen, ob Sie gültige Argumente angeben oder nicht. Beispielsweise wäre der Rückgabewert falsch, wenn sendmail nicht geladen werden konnte (z. B. wenn es nicht ordnungsgemäß installiert wurde), würde jedoch true zurückgeben, wenn sendmail ordnungsgemäß geladen wurde, die Empfängeradresse jedoch nicht vorhanden ist.

Ich dies bestätigen , weil nach einigen gescheiterten Versuchen zur Verwendung mail()in meinem PHP - Skripte, stellt sie das sendmailnicht auf meinem Rechner installiert wurde, aber die php.ini Variable sendmail_pathwar/usr/sbin/sendmail -t -i

1- Ich habe sendmail von meinem Paketmanager installiert shell> dnf install sendmail

2- Ich habe es angefangen shell> service sendmail start

3- Wenn nun eine PHP- mail()Funktion fehlschlägt, finde ich die Fehler des sendmailunter /var/mail/Verzeichnis protokollierten Programms . 1 Datei pro Benutzer

Zum Beispiel wird dieses Snippet aus meiner /var/mail/rootDatei entnommen

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 -----
<[email protected]>
    (reason: 550 Host unknown)

Mein System ist Linux Fedora 28 mit Apache2.4 und PHP 7.2

Buchhalter م
quelle
4

Sie können den PEAR-Mailer verwenden , der dieselbe Schnittstelle hat, aber bei Problemen einen PEAR_Error zurückgibt.

amccausl
quelle
1
Was ist mit PHP Mailer ?
s3c
3

Der mail()Funktion ist keine Fehlermeldung zugeordnet . Es gibt nur eine trueoder eine falseRückgabe, ob die E-Mail zur Zustellung angenommen wurde. Nicht, ob es letztendlich zugestellt wird, sondern ob die Domain existiert und die Adresse eine gültig formatierte E-Mail-Adresse ist.

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

error_get_last (); - den zuletzt aufgetretenen Fehler zurückgeben


quelle
6
Sie sollten Ihrem Code eine Erklärung hinzufügen, die anderen in Zukunft helfen könnte. Wie zu
antworten
2
Stimmen Sie dem vorherigen Kommentar zu. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung zu erhalten. Nur-Code-Antworten tragen sehr wenig dazu bei, zukünftige SO-Leser zu schulen. Ihre Antwort befindet sich in der Moderationswarteschlange, weil sie von geringer Qualität ist.
Mickmackusa
0

Wie die anderen gesagt haben, gibt es keine Fehlerverfolgung für das Senden von E-Mails. Es gibt das boolesche Ergebnis des Hinzufügens der E-Mails zur ausgehenden Warteschlange zurück. Wenn Sie einen echten Erfolgsfehler verfolgen möchten, verwenden Sie SMTP mit einer E-Mail-Bibliothek wie Swift Mailer, Zend_Mail oder phpmailer.

prodigitalson
quelle
0

Versuche dies. Wenn ich einen Fehler in einer Datei habe, habe ich eine Fehlermail in meiner E-Mail-ID erhalten. Erstellen Sie zwei Dateien index.phpund checkErrorEmail.phpladen Sie sie auf Ihren Server hoch. Laden Sie dann index.phpmit Ihrem Browser.

Index.php

<?php
    include('checkErrorEmail.php');
    include('dereporting.php');
    $temp;
    echo 'hi '.$temp;
?>

checkErrorEmail.php

<?php
  // Destinations
  define("ADMIN_EMAIL", "[email protected]");
  //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");


?>
Pradeep
quelle
4
Was ist include ('dereporting.php')?
Jon