it-swarm.com.de

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

Ich habe die Funktion PHP mail() verwendet.

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

So etwas wie 

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

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

Vielen Dank!

60
Rohan

Sie können error_get_last() verwenden, wenn mail() false zurückgibt.

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

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

[Typ] => 2
[message] => mail (): Verbindung zum Mailserver an "x.x.x.x" Port 25 konnte nicht hergestellt werden. Überprüfen Sie Ihre Einstellungen für "SMTP" und "smtp_port" in php.ini oder verwenden Sie ini_set ().
[Datei] => C:\www\X\X.php
[line] => 2 

98
user2317245

das Senden von E-Mails in PHP ist kein einstufiger Prozess. mail () gibt true/false zurück, aber selbst wenn true zurückgegeben wird, bedeutet dies nicht, dass die Nachricht gesendet wird. Alles, was mail () tut, ist das Hinzufügen der Nachricht in die Warteschlange (mithilfe von sendmail oder was auch immer Sie in php.ini festlegen)

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

12
Sergey Eremin

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

3
amccausl

In meinem Fall konnte ich die Fehlermeldung in meinem Skript PHP nicht erhalten, egal was ich mache (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 Ihre Das Mailing-System des Servers hat die Nachricht zur Zustellung akzeptiert und tut dies nicht und kann in keiner Weise wissen, ob Sie gültige Angaben machen Argumente. Der Rückgabewert wäre beispielsweise "false", wenn sendmail konnte nicht geladen werden (z. B. wenn es nicht ordnungsgemäß installiert wurde), würde jedoch Gibt true zurück, wenn sendmail ordnungsgemäß geladen wurde, aber die Empfängeradresse existiert nicht.

Ich bestätige dies, da nach einigen fehlgeschlagenen Versuchen, mail() in meinen PHP -Skripts zu verwenden, festgestellt wird, dass sendmail nicht auf meinem Computer installiert war. Die php.ini-Variable sendmail_path war jedoch /usr/sbin/sendmail -t -i

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

2- Ich habe es gestartet Shell> service sendmail start

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

Dieses Snippet wird beispielsweise aus meiner /var/mail/root-Datei 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

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

error_get_last (); - Liefert den zuletzt aufgetretenen Fehler

0
user5044606

Der mail()-Funktion ist keine Fehlermeldung zugeordnet. Es wird nur eine true oder false zurückgegeben, ob die E-Mail zur Zustellung angenommen wurde. Nicht, ob sie letztendlich zugestellt wird, sondern im Grunde, ob die Domäne existiert und die Adresse eine gültige formatierte E-Mail-Adresse ist.

0
Joseph

Versuche dies. Wenn bei einer Datei ein Fehler aufgetreten ist, wurde eine Fehler-E-Mail mit meiner E-Mail-ID angezeigt. Erstellen Sie zwei Dateien index.php und checkErrorEmail.php und laden Sie sie auf Ihren Server hoch. Laden Sie dann index.php mit 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");


?>
0
Pradeep