wp_mail() no funciona en localhost
Estoy intentando probar wp_mail() en mi entorno local. Cuando hago var_dump de wp_mail, obtengo un valor booleano false. Este es mi código:
$to = "abcd@gmail.com";
$subject = 'mi asunto';
$message = 'Me gustaría trabajar contigo';
$headers = '';
$sent_message = wp_mail( $to, $subject, $message, $headers);
var_dump($sent_message); // obtengo boolean false aquí
if ( $sent_message ) {
echo 'El mensaje de prueba fue enviado. Revisa tu bandeja de entrada.';
} else {
echo '¡El mensaje no fue enviado!'; // esto es lo que se imprime al final
}
Cualquier ayuda sería apreciada.
wp_mail()
recurre a la función mail()
de PHP, la cual requiere un MTA (Agente de Transferencia de Mensajes) configurado en tu servidor. Entonces, puedes instalar y configurar un MTA. Si estás utilizando un sistema operativo tipo Linux, SSMTP es una solución sencilla con la que puedes utilizar cualquier proveedor de correo para enviar los correos del sistema vía SMTP. Otro MTA sería Sendmail, un MTA completo pero difícil de configurar.
O simplemente puedes utilizar un plugin como WP Mail SMTP que implementa una conexión SMTP directa en PHP y evita el uso de mail()
.

Si solo quieres probar la funcionalidad de correo mientras desarrollas, puedes usar mailcatcher: https://mailcatcher.me No lo he probado en Windows, pero en Mac OS funciona. En otros sistemas operativos Linux también debería funcionar.

Si alguien se encuentra con esta antigua pregunta:
En mi caso, la razón fue que le di al sitio en localhost un nombre sin un dominio de primer nivel. Por ejemplo, "misitio" (en lugar de "misitio.com"). Por lo tanto, WordPress asumió que la dirección "De" era "wordpress@misitio".
Phpmailer (que es llamado por wp_mail) luego mostró el error: "Dirección inválida: (De): wordpress@misitio"
La solución fue establecer explícitamente la dirección de origen mediante el encabezado:
$headers[] = 'From: Wordpress<wordpress@misitio.com>';
$sent_message = wp_mail( $to, $subject, $message, $headers );
Entonces wp_mail funcionó.

Ampliando la útil respuesta de Ronni, aquí te mostramos cómo puedes sobrescribir la dirección From:
para todos los correos salientes:
if (defined('WP_CLI')) {
WP_CLI::add_wp_hook('wp_mail_from', function () {
return 'my@addr.com';
});
} else {
add_filter('wp_mail_from', function () {
return 'my@addr.com';
});
}
Para mi entorno de desarrollo local, encontré útil colocarlo en wp-config.php
, al final del archivo, después de require_once ABSPATH . 'wp-settings.php';
.
Se agregó una solución alternativa para wp-cli, ya que no proporciona add_filter()
como lo haría WP normalmente.
