¿Cómo verificar si wp_mail está funcionando correctamente?
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

Puedes usar la acción 'wp_mail_failed' para capturar un error de envío.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/

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!";
}
}

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.

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.

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 comandogetsebool
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.
