Wordpress se recusa a enviar e-mails, “… seu host pode ter desabilitado a função mail ()”

8

Recentemente, implementei uma área de comentários no meu website e tentei que a funcionalidade de notificação por e-mail funcionasse. Não parece querer enviar notificações por email quando novos comentários são feitos. Apenas para ver se o PHP pode enviar e-mails, eu tentei redefinir a senha (porque você vai ter uma nova senha via e-mail), e então eu recebi a mensagem:

  

O e-mail não pôde ser enviado. Possível causa: seu host pode ter desativado a função mail ()

Eu verifiquei as caixas de seleção em Configurações - > Discussão, e o email é válido, por isso não é um problema de configuração. Eu tentei criar um arquivo php e enviar usando mail() , e enviou com sucesso. Portanto, deve haver algo estranho acontecendo com o Wordpress.

Alguma idéia?

    
por qwerty 08.04.2013 / 16:23

7 respostas

8

Passo a passo: primeiro encontre o arquivo onde a mensagem de erro aparece. Eu uso o Notepad ++ e o comando CTRL + F para procurar em arquivos. É uma boa ideia pesquisar apenas as primeiras palavras da mensagem de erro, porque algumas mensagens de erro são combinadas de mensagens diferentes.

Sua mensagem de erro aparece em wp-login.php e sorte santa, somente lá. Então vamos dar uma olhada porque esse erro pode ocorrer.

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

Existem duas condições. $message tem que ser verdadeiro (não uma string vazia, não é falsa, não é nula, etc). E wp_mail() não deve retornar falso.

Uma linha acima, existe um filtro $message = apply_filters('retrieve_password_message', $message, $key); , então é possível que um plugin (ou tema) use este filtro e retorne um valor que não é verdadeiro (string vazia, false, null, etc.). / p>

Mas é muito mais fácil verificar se wp_mail() está funcionando ou não. Escreva um pequeno plugin para enviar um email de teste para você mesmo:

<?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 é o código PHP5.3. Se você estiver executando o PHP5.2, remova as coisas do namespace)

O plugin deve enviar um testmail imediatamente após a ativação. Caso contrário, chamar algumas páginas de back-end (por exemplo, painel) deve fazê-lo.

Se o testmail não chegar, você provavelmente terá um problema com wp_mail() . Então, ligue a depuração:

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

Coloque este código no seu wp-config.php e repita o envio de um testmail. Agora você deve receber algumas mensagens de erro e elas também devem estar logadas em wp-content/debug.log (O log de depuração pode crescer muito se houver mais erros causados por plugins e / ou temas).

Neste ponto, você obteve boas informações se wp_mail() falhar e, em caso afirmativo, por quê. Se wp_mail() funcionar corretamente e o testmail chegar, volte ao início e descubra por que $message não é verdadeiro.

Se você tiver problemas com wp_mail() , tenha em mente que wp_mail() não usa a função PHPs mail() . O WordPress usa uma classe PHP ( PHPMailer ). Talvez você só precise de um um plugin para usar o SMTP ao invés do sendmail. Ou o problema está localizado em outro lugar. Nós não sabemos Você tem que investigar.

    
por Ralf912 08.04.2013 / 17:44
1

Esta é uma mensagem de erro super irritante, pois pode ser muitas coisas, e não revela o erro real (que é muitas vezes silenciado em outras partes do código).

Esse erro aparece quando a função wp_mail() retorna false, o que poderia acontecer se phpmailer->Send() retornasse false ou gerasse uma exceção.


Como exibir avisos da função mail() do PHP

Estes são normalmente silenciados por padrão, mas infelizmente o WordPress nunca os captura. Para mostrá-los, basta remover os sinais @ de @mail(... in wp-includes/class-phpmailer.php na função 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);
}


Como procurar outras causas possíveis:

  1. Adicione uma única linha ao final de wp_mail() em /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. Ele vai despejar os detalhes completos de onde a exceção foi levantada. Infelizmente, às vezes, inclui essa mensagem de exceção inútil: " Não foi possível instanciar a função de email ". Sim, obrigado WordPress, isso é realmente útil.

  3. Ao olhar para a exceção, você pode encontrar o número da linha do erro e rastrear o código para encontrar a causa real.

Boa sorte. Espero que o WordPress melhore o tratamento de erros de e-mail em algum momento no futuro.

    
por Simon East 11.12.2014 / 01:08
1

Se as outras ótimas respostas aqui não ajudarem, tente o seguinte:

Eu encontrei esse mesmo problema e nada que eu encontrei em nenhuma das sugestões para o WordPress resolveu isso para mim.

Depois comecei a investigar se era a própria instalação do PHP que havia desativado a função mail, mas nada disso funcionava também. Tudo parecia estar configurado corretamente.

Todos esses problemas começaram para mim quando atualizei meu servidor para o CentOS 7 que usa o SELinux (Security Enhanced Linux) e o que aprendi nas últimas semanas com o SELinux é que, se algo não está funcionando, mas tudo parece que deveria estar funcionando ... isso significa que o SELinux está silenciosamente e secretamente bloqueando você em segundo plano.

E viola.

Se você estiver rodando e utilizando o SELinux, basta executar o seguinte comando como root:

setsebool -P httpd_can_sendmail=1

Existe uma configuração de segurança que impede inerentemente que o servidor da web envie emails. Quando você liga o switch e diz ao SELinux que está tudo bem para o servidor enviar e-mails, tudo de repente funciona.

    
por Kenny Wyland 04.02.2017 / 20:24
0

Eu encontrei isso hoje; no meu caso, a situação aconteceu porque o arquivo hosts do servidor tem o mesmo nome de domínio do endereço de e-mail, apontando para localhost. O registro mx aponta para um servidor diferente, mas o arquivo hosts está sobrescrevendo o DNS e o WP está tentando entregar o email localmente. Remover o domínio do arquivo hosts e reiniciar o sendmail resolveu esse problema.

    
por user16081 16.01.2014 / 20:15
0

Eu não sei se isso ainda é relevante para você ou não, mas como não há resposta escolhida, pensei em tentar fazer uma vez.

Na verdade, eu tinha enfrentado exatamente o mesmo problema desde que o meu host de abertura imediata de repente cedeu hoje e parou de enviar e-mails. Vasculhando o código e o códice, eu vim a saber sobre a função wp_mail () e finalmente o google me levou até aqui e vi como ela poderia ser substituída.

Com base na resposta do @Ralf912, eu modifiquei o script um pouco para que o código usasse a API da web do sendgrid.com para enviar e-mails em vez do padrão wordpress (que eu presumo:

<?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!');*/
}

E funcionou!

    
por Prahlad Yeri 30.05.2014 / 19:04
0

Eu tive o mesmo erro, as duas funções (mail e wp_mail) funcionaram, mas eu ainda tinha esse erro irritante. A correção foi muito fácil, mas levei algumas horas para encontrar o motivo. Então, vou compartilhar aqui minha solução sobre o problema que pode ser (ou não) o mesmo com o seu.

Eu tentei a função mail () e funcionou, mas quando você a testa, você não especifica o último parâmetro chamado 'parameters' na função mail (). E o WP usa isso.

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

Portanto, basicamente, esse parâmetro ("[email protected]") com o sinalizador "-f" faz a função mail () verificar se o endereço de email "[email protected]" está listado na lista "emails confiáveis" .

Então, se não, retorna false, o que faz com que wp_mail () retorne false e leve à mensagem de erro.

Portanto, a solução é pedir ao hoster para fazer isso por você, ou se você estiver usando o cPanel, basta adicionar uma conta de e-mail para esse endereço e ele irá automaticamente adicioná-lo à "lista confiável".

    
por user3696815 23.08.2016 / 14:16
0

Eu tenho o mesmo problema com o servidor Ubuntu no Amazon EC2.Eu recebo problemas ao usar o link de redefinição de senha e também outros e-mails de notificação não estavam funcionando.

Então, aqui estão as soluções que funcionaram para mim. O WordPress usou a função wp_mail() para enviar emails que precisam da classe PHPMailer que usava o php mailer armazenado em /usr/sbin/sendmail .

Use esta função php simples primeiro para verificar o correio 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);
?>

Se isso não funcionar, você precisa instalar o php mailer. Use este comando para instalar o correio php no servidor Ubuntu.

sudo apt-get install sendmail

Em seguida, verifique as funções de e-mail word-press.

    
por CyberAbhay 03.05.2017 / 08:34