¿Cómo verificar si wp_mail está funcionando correctamente?

20 may 2013, 13:43:51
Vistas: 113K
Votos: 8

Estoy intentando usar wp_mail (probando en máquina local) pero no recibo ningún correo. El php.ini tiene configurado smtp_port = 25 y la función mail() de php está funcionando hasta ahora.

  • ¿cómo puedo verificar si wp_mail está funcionando?
  • ¿qué puede fallar?

Aquí está el código de mi función de correo:

function mv_optin_mail($id, $data){

    $url = $id."-".mv_mail_token($id, $data['token']);

    add_filter( 'wp_mail_content_type', 'set_html_content_type' );
    add_filter( 'wp_mail_charset', 'utf8' );

    $headers[] = 'From: '.sender_signature.' <'.noreply_address.'>';    

    ob_start();
    include("optin-mail.php");
    $html_mail = ob_get_contents();
    ob_end_clean();

    wp_mail( $data['email'], 'Algún Asunto', $html_mail, $headers );
    remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
    remove_filter( 'wp_mail_charset', 'utf8' );
}

No recibo ningún error. ¿Hay alguna forma de activar el registro de errores para WordPress?

El noreply_address es noreply@root

3
Comentarios

Ahora las preguntas restantes son: ¿Qué es mv_mail_token() y qué devuelve? ¿Y de dónde viene la constante sender_signature y qué contiene?

kaiser kaiser
23 jun 2013 21:01:43

Kaiser, escucha, por favor intenta responder las preguntas... wp_mail_token() devuelve una cadena y sender_signature también lo hace.

helle helle
24 jun 2013 11:38:04

gist de depuración

kaiser kaiser
24 jun 2013 12:02:07
Todas las respuestas a la pregunta 6
1
17

Puedes usar la acción 'wp_mail_failed' para capturar un error de envío.

https://developer.wordpress.org/reference/hooks/wp_mail_failed/

21 may 2017 09:21:54
Comentarios

y necesitas agregar esa acción antes de wp_mail().

mike23 mike23
14 jun 2024 19:09:44
0
13

WordPress depende de la clase PHPMailer para enviar correos electrónicos a través de la función mail de PHP.

Dado que la función mail de PHP devuelve muy poca información después de su ejecución (solo VERDADERO o FALSO), sugiero simplificar temporalmente tu función mv_optin_mail al mínimo para verificar si la función wp_mail funciona.

Ejemplo:

$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
echo $mailResult;

Como ya has probado la función mail de PHP, el correo debería llegar.

Si no llega, el problema está en otras declaraciones de tu función o en la clase PHPMailer.

En casos como este, suelo renombrar mi función a algo como:

function mv_optin_mail_backup( $id, $data ) {

Y agregar una función temporal con el mismo nombre para experimentar, así:

function mv_optin_mail( $id, $data ) {
    $mailResult = false;
    $mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
    echo $mailResult;
}

Cuando he descubierto cuál es el problema, vuelvo a utilizar la versión de respaldo.

Para enviar un correo directamente usando PHPMailer puedes hacer algo así (no para producción, solo para depuración):

add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();
    //$phpmailer->Host = 'smtp.example.com';
    //    $phpmailer->SMTPAuth = true; // Forzar a usar Usuario y Contraseña para autenticar
    $phpmailer->Port = 25;
    //    $phpmailer->Username = 'yourusername';
    //    $phpmailer->Password = 'yourpassword';

    // Configuraciones adicionales…
    //$phpmailer->SMTPSecure = "tls"; // Elegir SSL o TLS, si es necesario para tu servidor
    $phpmailer->setFrom( "fromemail@bla.com", "From Name" );
    $phpmailer->addAddress( "youremail@bla.com", "Your name" );
    $phpmailer->Subject    = "Testing PHPMailer";           
    $phpmailer->Body     = "Hurray! \n\n Great.";
    if( !$phpmailer->send() ) {
        echo "Mailer Error: " . $phpmailer->ErrorInfo;
    } else {
        echo "Message sent!";
    }                       

}       
1 nov 2015 16:40:01
0

Lo que suelo hacer para probar si wp_mail() está enviando correos electrónicos correctamente es simplemente registrarme en mi sitio web con otra dirección de correo electrónico y ver si llega el correo. Si llega, significa que WordPress está enviando los correos correctamente (utiliza wp_mail() para enviar los correos de registro) y deberías revisar tu función de envío de correos en busca de errores. Para hacer eso, como sugirió @Tobias, deberías simplificar al máximo tu función de envío de correos y dejar solo lo básico:

function wpse_100047() {
    echo wp_mail( 'tucorreo@ejemplo.com', 'Prueba de WP Mail', 'El correo está funcionando' );
}

Además, los correos enviados por WordPress (como todos los correos enviados por la función mail() de PHP) pueden ser bloqueados por algunos servidores de correo (o marcados como spam), por lo que siempre es una buena idea usar SMTP (hay múltiples plugins que hacen esto) para los correos en el sitio web en producción.

1 nov 2015 17:58:46
0

Para comenzar, habilitaría WP_DEBUG en wp-config para ver si muestra algo sobre tu código o el código de la función wp_mail. Eso es básicamente todo para depurar directamente con WordPress.

También puedes usar Easy WP SMTP y activar la depuración y/o configurarlo para usar SMTP. Hay plugins similares en WordPress.org, pero sé que este tiene una buena opción de depuración. Si algo como GMail funciona, entonces sabrás que es un ajuste del servidor y no este código.

22 abr 2014 04:44:05
0

Si deseas detener el script y solo ver el objeto $error, intenta agregar esto ANTES de que se ejecute el método wp_mail():

add_action('wp_mail_failed', function ($error) {
    wp_die("<pre>".print_r($error, true)."</pre>");
});
2 feb 2021 15:45:13
0

En este documento había sugerencias muy interesantes.

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

En particular, al trabajar con Azure Virtual Machine, la configuración de SELinux estaba bloqueando las conexiones salientes.

Si ves un error como SMTP -> ERROR: Failed to connect to server: Permission denied (13) , puede que te encuentres con SELinux impidiendo que PHP o el servidor web envíen correos. Esto es particularmente probable en RedHat / Fedora / CentOS. Usando el comando getsebool podemos verificar si el demonio httpd tiene permiso para establecer una conexión de red y enviar un correo:

getsebool httpd_can_sendmail 
getsebool httpd_can_network_connect 

Este comando devolverá un valor booleano de on u off. Si está off, podemos activarlo:

sudo setsebool -P httpd_can_sendmail 1 
sudo setsebool -P httpd_can_network_connect 1 

Si estás ejecutando PHP-FPM a través de fastcgi, puede que necesites aplicar esto al demonio fpm en lugar de a httpd.

15 abr 2020 00:56:10