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

9

Recientemente implementé un área de comentarios en mi sitio web e intenté que la notificación por correo electrónico funcionara. No parece querer enviar notificaciones por correo electrónico cuando se hacen 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 recibí el mensaje:

No se pudo enviar el correo electrónico. Posible motivo: su host puede haber deshabilitado la función mail ()

He marcado las casillas de verificación en Configuración -> Discusión, y el correo electrónico es válido, por lo que no es un problema de configuración. Traté de crear un archivo PHP y enviar usando mail(), y se envió con éxito. Por lo tanto, debe haber algo extraño con WordPress.

¿Algunas ideas?

QWERTY
fuente
Proporcione información de depuración
s_ha_dum

Respuestas:

9

Paso a paso: primero busque el archivo donde aparece el mensaje de error. Uso Notepad ++ y el comando CTRL+ Fpara buscar en archivos. Es una buena idea buscar solo las primeras palabras del mensaje de error, porque algunos mensajes de error se combinan de mensajes diferentes.

Su mensaje de error aparece en wp-login.phpy santa suerte, solo allí. Así que echemos un vistazo por qué podría ocurrir este error.

if ( $message && !wp_mail($user_email, $title, $message) )

Hay dos condiciones. $messagetiene que ser verdadero (no es una cadena vacía, no es falsa, no es nula, etc.). Y wp_mail()no debe devolver falso.

Una línea arriba, hay un filtro $message = apply_filters('retrieve_password_message', $message, $key);, por lo que es posible que un complemento (o tema) use este filtro y devuelva un valor que no es verdadero (cadena vacía, falso, nulo, etc.).

Pero es mucho más fácil verificar si wp_mail()funciona o no. Escriba un pequeño complemento para enviarse un correo de prueba:

<?php
/**
 * Plugin Name: Stackexchange Testplugin
 * Plugin URI:  http://yoda.neun12.de
 * Description: Send me a test email
 * 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      = '[email protected]';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

    wp_mail( $to, $subject, $message );
}

(Este es el código PHP5.3. Si está ejecutando PHP5.2, elimine las cosas del espacio de nombres)

El complemento debe enviar un correo de prueba inmediatamente después de la activación. Si no, llamar a algunas páginas de back-end (p. Ej., Tablero) debería hacerlo.

Si el correo de prueba no llega, entonces probablemente tenga un problema con wp_mail(). Entonces active la depuración:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

Ponga este código en su wp-config.phpe intente enviarse un correo de prueba. Ahora debería recibir algunos mensajes de error y también deberían iniciar sesión wp-content/debug.log(el registro de depuración puede crecer mucho si hay más errores causados ​​por complementos y / o temas).

En este punto, tienes buena información si wp_mail()falla y si es así, ¿por qué? Si wp_mail()funciona correctamente y llegó el correo de prueba, regrese al principio y descubra por qué $messageno es cierto.

Si tiene problemas con wp_mail(), tenga en cuenta que wp_mail()no utiliza la mail()función PHP . WordPress usa una clase PHP ( PHPMailer ). Tal vez solo necesite un complemento para usar SMTP en lugar de sendmail. O el problema se encuentra en otro lugar. No lo sabemos Tienes que investigar.

Ralf912
fuente
Sí he intentado excavar en el núcleo y también me llevan a PHPMailer, y que en realidad lo hace uso de php mail(). Al menos en algunos casos (vea la línea 732 in wp-includes/class-phpmailer.php. No tengo acceso al ftp atm pero intentaré sus sugerencias lo antes posible. Seguramente esto me llevará a algún lado. ¡Muchas gracias!
qwerty
Lo probé wp_mail()y parece funcionar bien, recibí el correo como esperaba. Sin embargo, WP aún no enviaba los correos electrónicos de comentario / restablecimiento de contraseña, y no recibí nada en el archivo de registro (no fue creado), así que intenté instalar un complemento de correo SMTP y configuré una nueva cuenta de correo electrónico para Wordpress Funciona ahora pero todavía no entiendo por qué no pudo enviar antes. ¡Gracias!
qwerty
Hasta ahora no recibo ningún error y ni siquiera electrónico
baldraider
2

Este es un mensaje de error súper molesto, ya que podría ser muchas cosas, y no revela el error real (que a menudo se silencia en otras partes del código).

Este error aparece cuando la wp_mail()función devuelve falso, lo que a su vez podría suceder si phpmailer->Send()devuelve falso o genera una excepción.


Cómo mostrar advertencias desde la mail()función de PHP

Estos normalmente están silenciados por defecto, pero desafortunadamente WordPress nunca los captura. Para mostrarlos, basta con quitar los @signos de @mail(...en wp-includes/class-phpmailer.phpla mailPassthru()función:

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 buscar otras posibles causas:

  1. Agregue una sola línea al final de wp_mail()in /wp-includes/pluggable.php:

    // Send!
    try {
        return $phpmailer->Send();
    } catch ( phpmailerException $e ) {
        //------------- This next line is the one to add -------------------
        if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>';
        return false;
    }
  2. Volcará todos los detalles de dónde se generó la excepción. Lamentablemente, a veces incluye este mensaje de excepción inútil: " No se pudo crear una instancia de la función de correo ". Sí, gracias WordPress, eso es realmente útil.

  3. Al observar la excepción, puede encontrar el número de línea del error y, con suerte, puede 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.

Simon East
fuente
2

Tengo el mismo problema con el servidor Ubuntu en Amazon EC2. Tengo un problema al usar el enlace de restablecimiento de contraseña y también otros correos electrónicos de notificación no funcionaban.

Así que aquí hay soluciones que funcionaron para mí. Word-press utilizaba la wp_mail()función para enviar correos electrónicos que necesitaban una PHPMailerclase que utilizaba el php mailer almacenado /usr/sbin/sendmail.

Utilice esta función php simple primero para verificar el correo php

<?php
$to = "[email protected]";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

mail($to,$subject,$txt,$headers);
?>

Si esto no funciona, entonces necesita instalar php mailer. Use este comando para instalar el correo php en el servidor Ubuntu.

sudo apt-get install sendmail

Luego verifique las funciones de correo electrónico de word-press.

CyberAbhay
fuente
esta respuesta es la que cualquiera debería probar antes que cualquier otra respuesta, este es el camino a seguir
hatenine
1

Si las otras excelentes respuestas aquí no ayudan, intente esto:

Encontré este mismo problema y nada de lo que pude encontrar en ninguna de las sugerencias para WordPress lo resolvió por mí.

Luego comencé a investigar si fue la instalación de PHP la que había deshabilitado la función de correo, pero nada de eso funcionó. 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 aprendí en las últimas semanas con SELinux es que si algo no funciona, pero todo parece debería estar funcionando ... eso significa que SELinux te está bloqueando silenciosa y secretamente en segundo plano.

Y viola.

Si está ejecutando y un sistema operativo que utiliza SELinux, simplemente ejecute el siguiente comando como root:

setsebool -P httpd_can_sendmail=1

Hay una configuración de seguridad que impide de forma inherente que el servidor web envíe correos electrónicos. Cuando activa ese interruptor y le dice a SELinux que está bien que el servidor web envíe un correo electrónico, todo funciona de repente.

Kenny Wyland
fuente
0

Me encontré con esto hoy; en mi caso, la situación sucedió porque el archivo de hosts del servidor tiene el mismo nombre de dominio que la dirección de correo electrónico, apuntando a localhost. El registro mx apunta a un servidor diferente, pero el archivo de hosts está anulando DNS y WP está tratando de entregar el correo electrónico localmente. Eliminar el dominio del archivo de hosts y reiniciar sendmail resolvió este problema.

usuario16081
fuente
0

No sé si esto todavía es relevante para ti o no, pero como no hay una respuesta elegida, pensé en intentarlo una vez.

En realidad, me había enfrentado exactamente al mismo problema ya que mi anfitrión de OpenShift de repente cedió hoy y dejó de enviar correos. Excavando el código y el códice, llegué a conocer la función wp_mail () y finalmente google me llevó aquí y vi cómo podría ser anulada.

Basándome en la respuesta de @ Ralf912, modifiqué un poco el script para que el código use la API web de sendgrid.com para enviar correos en lugar del predeterminado de WordPress (supongo que:

<?php

function sendgridmail($to, $subject, $message, $headers)
{
    $url = 'https://api.sendgrid.com/';
    //$user = 'yourUsername';
    //$pass = 'yourPassword';

    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to'        => $to,
        'subject'   => $subject,
        'html'      => '',
        'text'      => $message,
        'from'      => '[email protected]',
      );


    $request =  $url.'api/mail.send.json';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // obtain response
    $response = curl_exec($session);
    curl_close($session);

    // print everything out
    //print_r($response);
}

//only for testing:
/*$to      = '[email protected]';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Just sent!');*/

if (!function_exists('wp_mail')) {
    function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
    {
        // use the PHP GnuPG library here to send mail.
        sendgridmail($to, $subject, $message, $headers);
    }
}

function plugin_init()
{
   /* $to      = '[email protected]';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

¡Y funcionó!

Prahlad Yeri
fuente
0

Tuve el mismo error, ambas funciones (mail y wp_mail) funcionaron, pero aún tenía este error molesto. La solución fue muy fácil, pero me llevó algunas horas encontrar la razón. Así que compartiré aquí mi solución sobre el problema que podría ser (o no) el mismo que el suyo.

Intenté la función mail () y funcionó, pero cuando la prueba no especifica el último parámetro llamado 'parámetros' en la función mail (). Y WP lo usa.

@mail("[email protected]",$title,$body,$headers,"[email protected]");

Entonces, básicamente, este parámetro ("[email protected]") con la marca "-f" hace que la función mail () verifique si la dirección de correo electrónico "[email protected]" aparece en la lista de "correos electrónicos confiables".

Entonces, si no lo hace, devuelve falso, lo que hace que wp_mail () devuelva falso y conduzca al mensaje de error.

Entonces, la solución es pedirle a Hoster que haga esto por usted, o si está utilizando cPanel, simplemente agregue una cuenta de correo electrónico para esta dirección y automáticamente la agregará a la "lista de confianza".

usuario3696815
fuente
0

se llamó -Direccionar ID de correo electrónico registrado para enviar correos a través de scripts, es decir (Wordpress)

  1. Inicie sesión en su Cpanel.
  2. Vaya a la Sección de correo electrónico> luego haga clic en ID de correo electrónico registrado.
  3. luego agregue ([email protected]) o donde se alojó su wordpress. es decir ([email protected]). luego envíe, se tarda unos minutos en activar la espera de 15 minutos a 1 hora dependiendo de su proveedor de alojamiento, entonces funcionará.
Amrit Bhandari
fuente
0

Tuve este error durante siglos y probé tantas soluciones que no funcionaron. Tengo una instalación personalizada de Wordpress en AWS EC2. En primer lugar, asegúrese de que su 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 (gsuite) para correo electrónico para recibir / enviar correo.

Asegúrese de que el correo electrónico de prueba se envíe en AWS SES y Gsuite.

Instale el plugin Wordpress WP Mail SMTP, use la opción "Otro SMTP", tome sus credenciales SMTP de AWS SES, aquí es donde me quedé atascado.

Debe habilitar la casilla de verificación "SSL" para el cifrado, esto cambia el puerto a 465 para mí. Por fin mi prueba de correo electrónico enviada desde Worpdress fue exitosa.

Archie Butler
fuente