WordPress se niega a enviar correos, "...su host puede haber desactivado la función mail()"

8 abr 2013, 17:23:48
Vistas: 98.5K
Votos: 12

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?

1
Comentarios

Por favor, proporciona información de depuración

s_ha_dum s_ha_dum
8 abr 2013 18:12:31
Todas las respuestas a la pregunta 10
5

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.

8 abr 2013 18:44:44
Comentarios

Sí, intenté profundizar en el núcleo y también me llevó a PHPMailer, y en realidad 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!

qwerty qwerty
8 abr 2013 20:52:27

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!

qwerty qwerty
9 abr 2013 10:05:52

No estoy recibiendo ningún error y ni siquiera el correo

baldraider baldraider
19 ago 2017 10:29:36

¿Dónde guardar tu plugin?

Black Black
4 nov 2021 11:19:11

Como puedes ver, la respuesta tiene unos 8 años. No he trabajado con WordPress en más de 5 años. Por lo que recuerdo, en el directorio wp-plugins, como es habitual. Pero quizás las cosas hayan cambiado en los últimos 5 años.

Ralf912 Ralf912
4 nov 2021 15:30:13
0

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:

  1. 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;
    }
    
  2. 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.

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

11 dic 2014 02:08:19
1

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.

3 may 2017 09:34:57
Comentarios

esta respuesta es la que todos deberían probar antes que cualquier otra, este es el camino correcto

hatenine hatenine
25 ene 2019 14:53:34
0

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.

4 feb 2017 21:24:09
0

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.

16 ene 2014 21:15:23
0

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ó!

30 may 2014 20:04:20
0

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

23 ago 2016 15:16:43
0

Se llama -Administrar Correos Electrónicos Registrados- para enviar correos mediante scripts, por ejemplo (WordPress)

  1. Inicia sesión en tu cPanel.
  2. Ve a la sección de Correo Electrónico > luego haz clic en Correos Electrónicos Registrados.
  3. 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á.
31 may 2019 20:03:57
0

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!

14 dic 2019 17:16:51
0

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.

26 feb 2021 14:14:59