WordPress se niega a enviar correos, "...su host puede haber desactivado la función mail()"
Recientemente implementé un área de comentarios en mi sitio web y traté de hacer funcionar la notificación por correo electrónico. No parece querer enviar notificaciones por correo cuando se realizan nuevos comentarios.
Solo para ver si PHP puede enviar correos electrónicos, intenté restablecer la contraseña (porque recibirás una nueva contraseña por correo) y obtuve el mensaje:
El correo electrónico no pudo ser enviado. Posible razón: su host puede haber desactivado la función mail()
He verificado las casillas en Ajustes -> Comentarios, y el correo electrónico es válido, así que no es un problema de configuración. Intenté crear un archivo PHP y enviar usando mail()
, y se envió correctamente. Así que debe haber algo extraño sucediendo con WordPress.
¿Alguna idea?

Paso a paso: Primero encuentra el archivo donde aparece el mensaje de error. Yo uso Notepad++ y el comando CTRL + F para buscar en los archivos. Es una buena idea buscar solo las primeras palabras del mensaje de error, porque algunos mensajes de error son combinaciones de diferentes mensajes.
Tu mensaje de error aparece en wp-login.php
y por suerte, solo ahí. Así que veamos por qué podría ocurrir este error.
if ( $message && !wp_mail($user_email, $title, $message) )
Hay dos condiciones. $message
debe ser verdadero (no una cadena vacía, no falso, no nulo, etc). Y wp_mail()
no debería devolver falso.
Una línea arriba, hay un filtro $message = apply_filters('retrieve_password_message', $message, $key);
, así que es posible que un plugin (o tema) use este filtro y devuelva un valor que no sea verdadero (cadena vacía, falso, nulo, etc.).
Pero es mucho más fácil comprobar si wp_mail()
está funcionando o no. Escribe un pequeño plugin para enviarte un correo de prueba:
<?php
/**
* Plugin Name: Stackexchange Testplugin
* Plugin URI: http://yoda.neun12.de
* Description: Envíame un correo de prueba
* Version: 0.1
* Author: Ralf Albert
* Author URI: http://yoda.neun12.de
* Text Domain:
* Domain Path:
* Network:
* License: GPLv3
*/
namespace WordPressStackexchange;
add_action( 'init', __NAMESPACE__ . '\plugin_init' );
function plugin_init(){
$to = 'tu-correo@dominio.com';
$subject = 'Correo de prueba';
$message = 'FooBarBaz El correo de prueba funciona';
wp_mail( $to, $subject, $message );
}
(Este es código PHP5.3. Si estás ejecutando PHP5.2, elimina las cosas del namespace)
El plugin debería enviar un correo de prueba inmediatamente después de la activación. Si no, al acceder a algunas páginas del backend (por ejemplo, el escritorio) debería hacerlo.
Si el correo de prueba no llega, entonces probablemente tengas un problema con wp_mail()
. Así que activa la depuración:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );
Coloca este código en tu wp-config.php
y vuelve a intentar enviarte un correo de prueba. Ahora deberías obtener algunos mensajes de error y también deberían registrarse en wp-content/debug.log
(El registro de depuración puede crecer mucho si hay más errores causados por plugins y/o temas).
En este punto, tienes buena información sobre si wp_mail()
falla y, si es así, por qué. Si wp_mail()
funciona correctamente y el correo de prueba llegó, vuelve arriba y averigua por qué $message
no es verdadero.
Si tienes problemas con wp_mail()
, ten en cuenta que wp_mail()
no usa la función mail()
de PHP. WordPress usa una clase PHP (PHPMailer). Tal vez solo necesites un plugin para usar SMTP en lugar de sendmail. O el problema está en otro lugar. No lo sabemos. Tendrás que investigar.

Sí, intenté profundizar en el núcleo y también me llevó a PHPMailer, y en realidad sí usa la función mail()
de PHP. Al menos en algunos casos (ver línea 732 en wp-includes/class-phpmailer.php
. No tengo acceso al FTP en este momento, pero probaré tus sugerencias tan pronto como pueda. Seguro que esto me llevará a alguna parte. ¡Muchas gracias!

Probé wp_mail()
y parece funcionar bien, recibí el correo como se esperaba. Sin embargo, WP aún no enviaba los correos de comentarios/restablecimiento de contraseña, y no obtuve nada en el archivo de registro (ni siquiera se creó), así que intenté instalar un plugin de correo SMTP y configuré una nueva cuenta de correo para Wordpress. Ahora funciona, pero aún no entiendo por qué no podía enviar antes. ¡Gracias!

Este es un mensaje de error muy molesto ya que podría deberse a muchas causas, y no revela el error real (que a menudo se silencia en otras partes del código).
Este error aparece cuando la función wp_mail()
devuelve false, lo que a su vez puede ocurrir si phpmailer->Send()
devuelve false o lanza una excepción.
Cómo mostrar advertencias de la función mail()
de PHP
Normalmente estas advertencias se silencian por defecto, pero desafortunadamente WordPress nunca las captura. Para mostrarlas, simplemente elimina los signos @
de @mail(...
en el archivo wp-includes/class-phpmailer.php
dentro de la función mailPassthru()
:
if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
$rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
} else {
$rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
}
Cómo rastrear otras posibles causas:
Añade una sola línea al final de
wp_mail()
en/wp-includes/pluggable.php
:// ¡Enviar! try { return $phpmailer->Send(); } catch ( phpmailerException $e ) { //------------- Esta es la línea que debes añadir ------------------- if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>'; return false; }
Volcará todos los detalles de dónde se lanzó la excepción. Desafortunadamente a veces incluye este mensaje de excepción poco útil: "No se pudo instanciar la función de correo". Sí, gracias WordPress, eso es muy útil.
Al observar la excepción puedes encontrar el número de línea del error, y con suerte rastrearlo a través del código para encontrar la causa real.
Buena suerte. Esperemos que WordPress mejore el manejo de errores de correo electrónico en algún momento en el futuro.

Tenía el mismo problema con un servidor Ubuntu en Amazon EC2. Obtuve un error al usar el enlace de restablecimiento de contraseña y otros correos de notificación tampoco funcionaban.
Aquí está la solución que me funcionó. WordPress utiliza la función wp_mail()
para enviar correos, la cual necesita la clase PHPMailer
que usa el mailer de PHP almacenado en /usr/sbin/sendmail
.
Primero usa esta simple función PHP para verificar el correo:
<?php
$to = "example@gmail.com";
$subject = "Prueba de Función de Correo";
$txt = "¡Hola mundo!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";
mail($to,$subject,$txt,$headers);
?>
Si esto no funciona, necesitas instalar el mailer de PHP. Usa este comando para instalar php mailer en el servidor Ubuntu:
sudo apt-get install sendmail
Luego verifica las funciones de correo de WordPress.

Si las otras excelentes respuestas aquí no te ayudan, prueba esto:
Me encontré con este mismo problema y nada de lo que pude encontrar en las sugerencias para WordPress lo resolvió para mí.
Luego comencé a investigar si era la instalación de PHP en sí la que había deshabilitado la función de correo, pero nada de eso funcionó tampoco. Todo parecía estar configurado correctamente.
Todos estos problemas comenzaron para mí una vez que actualicé mi servidor a CentOS 7 que usa SELinux (Security Enhanced Linux) y lo que he aprendido en las últimas semanas con SELinux es que si algo no funciona, pero todo parece que debería funcionar... eso significa que SELinux te está bloqueando silenciosa y secretamente en segundo plano.
Y voilà.
Si estás ejecutando un sistema operativo que usa SELinux, simplemente ejecuta el siguiente comando como root:
setsebool -P httpd_can_sendmail=1
Hay una configuración de seguridad que impide inherentemente que el servidor web envíe correos. Cuando activas esa opción y le dices a SELinux que está bien que el servidor web envíe correos, todo comienza a funcionar repentinamente.

Me encontré con esto hoy; en mi caso la situación ocurrió porque el archivo hosts del servidor tenía el mismo nombre de dominio que la dirección de email, apuntando a localhost. El registro MX apuntaba a un servidor diferente, pero el archivo hosts estaba anulando el DNS y WP intentaba entregar el correo localmente. Eliminar el dominio del archivo hosts y reiniciar sendmail resolvió este problema.

No sé si esto sigue siendo relevante para ti o no, pero como no hay una respuesta seleccionada, pensé en intentarlo una vez.
De hecho, me enfrenté exactamente al mismo problema cuando mi host de openshift dejó de enviar correos repentinamente hoy. Después de revisar el código y el codex, descubrí la función wp_mail() y finalmente Google me llevó aquí donde vi cómo podría ser sobrescrita.
Basándome en la respuesta de @Ralf912, modifiqué un poco el script para que use la API web de sendgrid.com para enviar correos en lugar del método predeterminado de WordPress (que supongo):
<?php
function sendgridmail($to, $subject, $message, $headers)
{
$url = 'https://api.sendgrid.com/';
//$user = 'tuUsuario';
//$pass = 'tuContraseña';
$params = array(
'api_user' => $user,
'api_key' => $pass,
'to' => $to,
'subject' => $subject,
'html' => '',
'text' => $message,
'from' => 'abc@hotmail.com',
);
$request = $url.'api/mail.send.json';
// Generar solicitud curl
$session = curl_init($request);
// Indicar a curl que use HTTP POST
curl_setopt ($session, CURLOPT_POST, true);
// Indicar a curl que estos son los parámetros del POST
curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
// Indicar a curl que no devuelva encabezados, pero sí la respuesta
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// obtener respuesta
$response = curl_exec($session);
curl_close($session);
// imprimir todo
//print_r($response);
}
//solo para pruebas:
/*$to = 'abc@yahoo.com';
$subject = 'Correo de prueba';
$message = '¡Funciona!!';
echo 'Destinatario es: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('¡Acabo de enviar!');*/
if (!function_exists('wp_mail')) {
function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
{
// usar la biblioteca PHP GnuPG aquí para enviar correo.
sendgridmail($to, $subject, $message, $headers);
}
}
function plugin_init()
{
/* $to = 'xyz@yahoo.com';
$subject = 'Correo de prueba';
$message = '¡Funciona en vivo!';
//echo 'Destinatario es: ' + $to;
wp_mail( $to, $subject, $message, array() );
//print_r('¡Acabo de enviar!');*/
}
¡Y funcionó!

Tuve el mismo error, ambas funciones (mail y wp_mail) funcionaban, pero seguía teniendo este molesto error. La solución fue muy fácil, pero me tomó varias horas encontrar la razón. Así que compartiré aquí mi solución al problema que podría ser (o no) el mismo que el tuyo.
Probé la función mail() y funcionó, pero cuando la pruebas no especificas el último parámetro llamado 'parameters' en la función mail(). Y WordPress sí lo usa.
@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");
Básicamente, este parámetro ("-fexample@exmaple.com") con el flag "-f" hace que la función mail() verifique si la dirección de correo "example@exmaple.com" está en la lista de "correos confiables".
Si no lo está, devuelve false, lo que hace que wp_mail() retorne false y genere el mensaje de error.
La solución es pedirle al proveedor de hosting que lo haga por ti, o si estás usando cPanel, simplemente agrega una cuenta de correo para esta dirección y automáticamente se agregará a la "lista de confiables".

Se llama -Administrar Correos Electrónicos Registrados- para enviar correos mediante scripts, por ejemplo (WordPress)
- Inicia sesión en tu cPanel.
- Ve a la sección de Correo Electrónico > luego haz clic en Correos Electrónicos Registrados.
- Luego agrega (wordpress@tudominio.com) o donde esté alojado tu WordPress, por ejemplo (wordpress@blog.tudominio.com). Luego envía, tomará algunos minutos en activarse, espera de 15 minutos a 1 hora dependiendo de tu proveedor de hosting, luego funcionará.

Tuve este error durante mucho tiempo e intenté tantas soluciones que no funcionaron. Tengo una instalación personalizada de WordPress en AWS EC2. Primero, asegúrate de que tu correo de AWS SES esté habilitado a través del soporte, deben estar en la misma (o cercana) región en SES y EC2.
Utilicé Google Suite (G Suite) para el correo electrónico para recibir/enviar correos.
Asegúrate de que el correo de prueba se envíe en AWS SES y G Suite.
Instala el plugin de WordPress WP Mail SMTP, usa la opción "Otro SMTP", obtén tus credenciales SMTP de AWS SES, aquí es donde me quedé atascado.
Debes habilitar la casilla de verificación "SSL" para el cifrado, esto cambió el puerto a 465 para mí. ¡Finalmente, mi prueba de correo se envió desde WordPress con éxito!

Solucioné este problema cambiando el "Correo electrónico del remitente" en mi entorno de prueba local, modificándolo de wordpress@localhost a wordpress@localhost.localdomain, utilizando por ejemplo un plugin de WordPress como "WP Mail SMTP" y seleccionando el sistema de correo PHP predeterminado en lugar de usar SMTP.
El problema ocurría incluso con todos los demás plugins desactivados y no había tenido este problema anteriormente. El problema tampoco está presente al usar la función mail de PHP directamente, así que quizás ocurrió debido a un cambio reciente en WordPress.
Envié y recibí correos electrónicos en mi computadora local usando Postfix.
