2010-07-06 11 views

Respuesta

9

enviar correo en php no es un proceso de un solo paso. mail() devuelve verdadero/falso, pero incluso si devuelve verdadero, no significa que el mensaje va a enviarse. todo lo que mail() hace es agregar el mensaje a la cola (usando sendmail o lo que sea que establezca en php.ini)

no hay manera confiable de verificar si el mensaje se ha enviado en php. Deberá revisar los registros del servidor de correo.

+0

Oh, está bien. ¡Gracias por la respuesta! – Rohan

0

No hay ningún mensaje de error asociado con la función mail(). Solo hay un true o false devuelto en si el correo electrónico fue aceptado para la entrega. No si finalmente se entrega, sino básicamente si el dominio existe y la dirección es una dirección de correo electrónico con formato válido.

-2

Como han dicho los otros, no hay seguimiento de error para enviar correo devuelve el resultado booleano de agregar el correo a la cola saliente. Si desea realizar un seguimiento del verdadero fracaso, intente utilizar SMTP con una biblioteca de correo como Swift Mailer, Zend_Mail o phpmailer.

2

Puede usar el PEAR mailer, que tiene la misma interfaz, pero devuelve un PEAR_Error cuando hay problemas.

-1

Pruebe esto. Si recibo algún error en cualquier archivo, recibo un mensaje de error en mi ID de correo electrónico. Cree dos archivos index.php y checkErrorEmail.php y cárguelos en su servidor. A continuación, carga index.php con tu navegador.

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"); 


?> 
+2

que se incluye ('dereporting.php');? – Jon

72

Usted puede utilizar error_get_last() cuando mail() vuelve falsa.

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

Con print_r(error_get_last()), se obtiene algo como esto:

[tipo] => 2
[mensaje] => electrónico(): Error al conectar con servidor de correo en el puerto "xxxx" 25 , verificar su "SMTP" y "smtp_port" establecer en php.ini o usar ini_set()
[archivo] => C: \ www \ X \ X.php
[línea] => 2

+7

Esta es la primera vez que escucho este comando de error, y es lo que he estado buscando, sin saberlo, por mucho tiempo. ¡Gracias! –

+0

Supongo que esto solo funciona si usa SMTP (¿Windows?). En Linux si usa "sendmail", la función "mail()" simplemente devuelve el estado de salida de ese comando: https://github.com/php/php-src/blob/PHP-5.6.25/ext/standard /mail.c#L404 No hay una manera confiable de obtener el mensaje de error afaik. Intenté con este script: https://gist.github.com/njam/a34ecd9ef195c37c8354ab58f7bfcc9b – njam

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

error_get_last(); - devuelve el último error que ocurrió

+6

Debe agregar alguna explicación con su código que podría ayudar a otros en el futuro. [respuesta] – cosmoonot

+2

Estoy de acuerdo con el comentario anterior. Por favor edite su respuesta para incluir alguna explicación. Las respuestas de solo código hacen muy poco para educar a los futuros lectores de SO. Su respuesta está en la cola de moderación por ser de baja calidad. – mickmackusa

Cuestiones relacionadas