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!
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
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.
Sie können den PEAR - Mailer verwenden, der dieselbe Schnittstelle hat, bei Problemen jedoch einen PEAR_Error zurückgibt.
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
$e=error_get_last();
if($e['message']!==''){
// An error function
}
error_get_last (); - Liefert den zuletzt aufgetretenen Fehler
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.
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");
?>