WordPress refuse d'envoyer du courrier, «… votre hôte peut avoir désactivé la fonction mail ()»


9

J'ai récemment mis en place une zone de commentaires sur mon site Web et j'ai essayé de faire fonctionner la notification par e-mail. Il ne semble pas vouloir envoyer de notifications par e-mail lorsque de nouveaux commentaires sont faits.

Juste pour voir si PHP peut envoyer des emails, j'ai essayé de réinitialiser le mot de passe (car vous obtiendrez un nouveau mot de passe par mail), et j'ai reçu le message:

L'e-mail n'a pas pu être envoyé. Raison possible: votre hôte a peut-être désactivé la fonction mail ()

J'ai coché les cases dans Paramètres -> Discussion, et l'e-mail est valide, donc ce n'est pas un problème de configuration. J'ai essayé de créer un fichier PHP et d'envoyer en utilisant mail(), et il a été envoyé avec succès. Il doit donc y avoir quelque chose de bizarre avec WordPress.

Des idées?


Réponses:


9

Étape par étape: recherchez d'abord le fichier dans lequel le message d'erreur apparaît. J'utilise Notepad ++ et la commande CTRL+ Fpour rechercher dans les fichiers. C'est une bonne idée de rechercher uniquement les premiers mots du message d'erreur, car certains messages d'erreur sont combinés de messages différents.

Votre message d'erreur apparaît dans wp-login.phpet sainte chance, seulement là. Voyons donc pourquoi cette erreur peut se produire.

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

Il y a deux conditions. $messagedoivent être vraies (pas une chaîne vide, pas fausse, pas nulle, etc.). Et wp_mail()ne devrait pas retourner faux.

Une ligne au-dessus, il y a un filtre $message = apply_filters('retrieve_password_message', $message, $key);, il est donc possible qu'un plugin (ou un thème) utilise ce filtre et retourne une valeur qui n'est pas vraie (chaîne vide, false, null, etc.).

Mais il est beaucoup plus facile de vérifier si cela wp_mail()fonctionne ou non. Écrivez un petit plugin pour vous envoyer un mail de test:

<?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      = 'your-email-adress@some-domain.tld';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

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

(Ceci est du code PHP5.3. Si vous utilisez PHP5.2, supprimez les choses d'espace de noms)

Le plugin doit envoyer un testmail immédiatement après l'activation. Sinon, appeler certaines pages backend (par exemple, un tableau de bord) devrait le faire.

Si le testmail n'arrive pas, vous avez probablement un problème avec wp_mail(). Activez donc le débogage:

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

Mettez ce code dans votre wp-config.phpet réessayez de vous envoyer un mail de test. Maintenant, vous devriez obtenir des messages d'erreur et ils doivent également être connectés wp-content/debug.log(le journal de débogage peut devenir très volumineux s'il y a plus d'erreurs causées par des plugins et / ou des thèmes).

À ce stade, vous avez obtenu de bonnes informations en cas d' wp_mail()échec et si oui, pourquoi. Si cela wp_mail()fonctionne correctement et que le testmail est arrivé, retournez en haut et découvrez pourquoi ce $messagen'est pas vrai.

Si vous rencontrez des problèmes wp_mail(), n'oubliez pas que la fonction wp_mail()PHP n'est pas utilisée mail(). WordPress utilise une classe PHP ( PHPMailer ). Peut-être avez-vous juste besoin d' un plugin pour utiliser SMTP au lieu de sendmail. Ou le problème se situe à un autre endroit. Nous ne le savons pas. Vous devez enquêter.


Oui, j'ai essayé de creuser dans le noyau et cela m'a également conduit à PHPMailer, et il utilise en fait des php mail(). Au moins dans certains cas (voir la ligne 732 dans wp-includes/class-phpmailer.php. Je n'ai pas accès au ftp atm mais j'essaierai vos suggestions dès que possible. Cela doit sûrement me conduire quelque part. Merci beaucoup!
qwerty

J'ai testé wp_mail()et cela semble bien fonctionner, j'ai reçu le mail comme prévu. WP n'enverrait toujours pas les e-mails de commentaire / réinitialisation du mot de passe, et je n'ai rien trouvé dans le fichier journal (il n'a pas été créé), j'ai donc essayé d'installer un plug-in de messagerie SMTP et de créer un nouveau compte de messagerie pour Wordpress. Cela fonctionne maintenant mais je ne comprends toujours pas pourquoi il n'a pas pu envoyer avant. Merci!
qwerty

Je ne reçois aucune erreur et même pas de courrier
baldraider

2

C'est un message d'erreur super ennuyeux car il pourrait y avoir beaucoup de choses, et il ne révèle pas l'erreur réelle (qui est souvent réduite au silence dans d'autres parties du code).

Cette erreur apparaît lorsque la wp_mail()fonction renvoie false, ce qui peut à son tour se produire si phpmailer->Send()renvoie false ou déclenche une exception.


Comment afficher les avertissements de la mail()fonction PHP

Ceux-ci sont normalement réduits au silence par défaut, mais malheureusement WordPress ne les capture jamais. Pour les afficher, il suffit d' enlever les @signes de @mail(...dans wp-includes/class-phpmailer.phpla mailPassthru()fonction:

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);
}


Comment traquer d'autres causes possibles:

  1. Ajoutez une seule ligne au bas de wp_mail()dans /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. Il affichera tous les détails de l'endroit où l'exception a été levée. Malheureusement, il inclut parfois ce message d'exception inutile: " Impossible d'instancier la fonction de messagerie ". Ouais merci WordPress, c'est vraiment utile.

  3. En regardant l'exception, vous pouvez trouver le numéro de ligne de l'erreur et, espérons-le, remonter dans le code pour trouver la véritable cause.

Bonne chance. Espérons que WordPress améliore la gestion des erreurs de messagerie à un moment donné dans le futur.


2

J'ai le même problème avec le serveur Ubuntu sur Amazon EC2.Je reçois un problème lors de l'utilisation du lien de réinitialisation du mot de passe et d'autres e-mails de notification ne fonctionnaient pas.

Voici donc des solutions qui ont fonctionné pour moi.Word-press a utilisé la wp_mail()fonction pour envoyer des e-mails qui ont besoin d'une PHPMailerclasse qui a utilisé php mailer stocké dans /usr/sbin/sendmail.

Utilisez d'abord cette fonction php simple pour vérifier le courrier php

<?php
$to = "example@gmail.com";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";

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

Si cela ne fonctionne pas, vous devez installer php mailer. Utilisez cette commande pour installer la messagerie php sur le serveur Ubuntu.

sudo apt-get install sendmail

Vérifiez ensuite les fonctions de messagerie électronique.


cette réponse est celle que quiconque devrait essayer avant toute autre réponse, c'est la voie à suivre
hatenine

1

Si les autres bonnes réponses ici ne vous aident pas, essayez ceci:

J'ai rencontré ce même problème et rien de ce que j'ai pu trouver dans les suggestions de WordPress ne l'a résolu pour moi.

Ensuite, j'ai commencé à rechercher si c'était l'installation PHP elle-même qui avait désactivé la fonction de messagerie, mais rien de tout cela n'a fonctionné non plus. Tout semblait avoir été configuré correctement.

Tous ces problèmes ont commencé pour moi une fois que j'ai mis à niveau mon serveur vers CentOS 7 qui utilise SELinux (Security Enhanced Linux) et ce que j'ai appris au cours des deux dernières semaines avec SELinux, c'est que si quelque chose ne fonctionne pas, mais tout ressemble à cela devrait fonctionner ... cela signifie que SELinux vous bloque silencieusement et secrètement en arrière-plan.

Et l'alto.

Si vous exécutez un système d'exploitation qui utilise SELinux, exécutez simplement la commande suivante en tant que root:

setsebool -P httpd_can_sendmail=1

Il existe un paramètre de sécurité qui empêche intrinsèquement le serveur Web d'envoyer des e-mails. Lorsque vous actionnez ce commutateur et dites à SELinux que le serveur Web peut envoyer des e-mails, tout fonctionne soudainement.


0

J'ai rencontré ça aujourd'hui; dans mon cas, la situation s'est produite car le fichier d'hôtes du serveur a le même nom de domaine que l'adresse e-mail, pointant vers localhost. L'enregistrement mx pointe vers un autre serveur, mais le fichier hosts remplace DNS et WP essaie de remettre l'e-mail localement. La suppression du domaine du fichier hosts et le redémarrage de sendmail ont résolu ce problème.


0

Je ne sais pas si cela vous concerne toujours ou non, mais comme il n'y a pas de réponse choisie, j'ai pensé me laisser essayer une fois.

En fait, j'avais fait face exactement au même problème depuis que mon hôte openshift a soudainement cédé aujourd'hui et a cessé d'envoyer des mails. En fouillant dans le code et le codex, j'ai découvert la fonction wp_mail () et finalement Google m'a conduit ici et j'ai vu comment elle pouvait être remplacée.

En s'appuyant sur la réponse de @ Ralf912, j'ai légèrement modifié le script pour que le code utilise l'API Web de sendgrid.com pour envoyer des e-mails au lieu de WordPress par défaut (que je présume:

<?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'      => 'abc@hotmail.com',
      );


    $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      = 'abc@yahoo.com';
$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      = 'xyz@yahoo.com';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

Et ça a marché!


0

J'ai eu la même erreur, les deux fonctions (mail et wp_mail) fonctionnaient, mais j'avais toujours cette erreur ennuyeuse. La correction a été très facile, mais il m'a fallu quelques heures pour en trouver la raison. Je partagerai donc ici ma solution sur le problème qui pourrait être (ou non) le même avec le vôtre.

J'ai essayé la fonction mail () et cela a fonctionné, mais lorsque vous le testez, vous ne spécifiez pas le dernier paramètre appelé «paramètres» dans la fonction mail (). Et WP l'utilise.

@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");

Donc, fondamentalement, ce paramètre ("-fexample@exmaple.com") avec l'indicateur "-f" permet à la fonction mail () de vérifier si l'adresse e-mail "example@exmaple.com" figure dans la liste "e-mails de confiance".

Si ce n'est pas le cas, il retourne false, ce qui fait que wp_mail () retourne false et conduit au message d'erreur.

Donc, la solution est de demander à hoster de le faire pour vous, ou si vous utilisez cPanel, ajoutez simplement un compte de messagerie pour cette adresse et il l'ajoutera automatiquement dans la "liste de confiance".


0

il a appelé -Gérer les e-mails enregistrés pour envoyer des e-mails via des scripts, c'est-à-dire (Wordpress)

  1. Connectez-vous à votre Cpanel.
  2. Accédez à la section E-mail> puis cliquez sur ID e-mail enregistrés.
  3. puis ajoutez (wordpress@votredomaine.com) ou où votre wordpress a hébergé. c'est-à-dire (wordpress@blog.yourdomain.com). puis soumettez, il faut quelques minutes pour l'activer, attendez 15 minutes à 1 heure selon votre hébergeur, alors ça marchera.

0

J'ai eu cette erreur pendant des siècles et j'ai essayé tant de solutions qui ne fonctionnaient pas. J'ai une installation Wordpress personnalisée sur AWS EC2. Tout d'abord, assurez-vous que votre courrier AWS SES est activé via le support, ils doivent être dans la même région (ou fermer) dans SES et EC2. J'ai utilisé la suite Google (gsuite) pour les e-mails pour recevoir / envoyer du courrier.

Assurez-vous que l'e-mail de test envoie AWS SES et Gsuite.

Installez le plugin Wordpress WP Mail SMTP, utilisez l'option "Autre SMTP", récupérez vos informations d'identification SMTP d'AWS SES, c'est là que je me suis retrouvé bloqué.

Vous devez activer la case à cocher "SSL" pour le cryptage, cela change le port à 465 pour moi. Enfin, mon test de courrier électronique a été envoyé avec succès par Worpdress.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.