O WordPress se recusa a enviar e-mail, "... seu host pode ter desativado a função mail ()"

9

Eu recentemente implementei uma área de comentários no meu site e tentei fazer a notificação por email funcionar. Parece que não deseja enviar notificações por email quando novos comentários são feitos.

Apenas para ver se o PHP pode enviar e-mails, tentei redefinir a senha (porque você receberá uma nova senha por e-mail) e recebi a mensagem:

Não foi possível enviar o email. Possível motivo: seu host pode ter desativado a função mail ()

Marquei as caixas de seleção em Configurações -> Discussão, e o email é válido, portanto não é um problema de configuração. Eu tentei criar um arquivo PHP e enviar usando mail(), e ele foi enviado com sucesso. Portanto, deve haver algo estranho acontecendo com o WordPress.

Alguma ideia?

qwerty
fonte
Por favor, forneça informações de depuração
s_ha_dum

Respostas:

9

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

Sua mensagem de erro aparece wp-login.phpe com sorte, somente lá. Então, vejamos por que esse erro pode ocorrer.

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

Existem duas condições. $messageprecisa 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, há um filtro $message = apply_filters('retrieve_password_message', $message, $key);, portanto, é possível que um plug-in (ou tema) use esse filtro e retorne um valor que não é verdadeiro (string vazia, false, null, etc.).

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 si 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 espaço para nome)

O plug-in deve enviar um email de teste 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, provavelmente você está com um problema wp_mail(). Então ative a depuração:

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

Coloque esse código no seu wp-config.phpe tente enviar um teste para si mesmo. Agora você deve receber algumas mensagens de erro e elas também devem estar logadas wp-content/debug.log(o log de depuração pode aumentar muito se houver mais erros causados ​​por plug-ins e / ou temas).

Nesse ponto, você tem boas informações se wp_mail()falhar e, se sim, por quê. Se wp_mail()funcionar corretamente e o testmail chegar, volte ao topo e descubra por que isso $messagenão é verdade.

Se você tiver problemas wp_mail(), lembre-se de que wp_mail()não usa a mail()função PHP . O WordPress usa uma classe PHP ( PHPMailer ). Talvez você só precise de um plugin para usar SMTP em vez de sendmail. Ou o problema está localizado em outro local. Nós não sabemos. Você tem que investigar.

Ralf912
fonte
Sim, eu tentei cavar para o núcleo e também me levam a PHPMailer, e ele realmente faz uso php de mail(). Pelo menos em alguns casos (consulte a linha 732 pol wp-includes/class-phpmailer.php. Eu não tenho acesso ao ftp atm, mas tentarei suas sugestões o mais rápido possível. Certamente isso deve me levar a algum lugar. Muito obrigado!
qwerty
Eu testei wp_mail()e parece funcionar bem, recebi o email conforme o esperado. O WP ainda não enviava os emails de comentário / redefinição de senha e como não recebi nada no arquivo de log (não foi criado), tentei instalar um plug-in de email SMTP e configurar uma nova conta de email para Wordpress. Funciona agora, mas ainda não entendo por que não foi possível enviar antes. Obrigado!
quer
Eu não estou recebendo nenhum erro e nem mesmo um email
baldraider
2

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

Este erro aparece quando a wp_mail()função retorna false, o que por sua vez pode ocorrer se phpmailer->Send()retornar false ou gerar uma exceção.


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

Normalmente, eles são silenciados por padrão, mas infelizmente o WordPress nunca os captura. Para mostrá-los, basta remover os @sinais de @mail(...dentro wp-includes/class-phpmailer.phpna mailPassthru()função:

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 caçar 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 irá despejar todos os detalhes de onde a exceção foi gerada. Infelizmente, às vezes, inclui esta mensagem de exceção inútil: " Não foi possível instanciar a função de email ". Sim, graças ao WordPress, isso é realmente útil.

  3. Observando a exceção, você pode encontrar o número da linha do erro e, esperançosamente, rastrear o código de volta ao código para encontrar a causa real.

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

Simon East
fonte
2

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

Então, aqui estão as soluções que funcionaram para mim: o Word-press usou a wp_mail()função para enviar e-mails que precisam de PHPMailerclasse em que o php mailer armazenado é armazenado /usr/sbin/sendmail.

Use esta função php simples primeiro para verificar o php mail

<?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 estiver funcionando, você precisará instalar o php mailer. Use este comando para instalar o php mail no servidor Ubuntu.

sudo apt-get install sendmail

Em seguida, verifique as funções de email do word-press.

CyberAbhay
fonte
esta resposta é a que qualquer um deve tentar antes de outras respostas, este é o caminho a seguir
hatenine
1

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

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

Então 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 depois que atualizei meu servidor para o CentOS 7, que usa o SELinux (Security Enhanced Linux), e o que aprendi nas últimas duas semanas com o SELinux é que, se algo não está funcionando, mas tudo parece deveria estar funcionando ... isso significa que o SELinux está silenciosamente e secretamente bloqueando você em segundo plano.

E viola.

Se você estiver executando e o SO que utiliza o SELinux, execute o seguinte comando como root:

setsebool -P httpd_can_sendmail=1

Há uma configuração de segurança que impede inerentemente o servidor da web de enviar email. Quando você aciona essa opção e diz ao SELinux que está ok para o servidor da web enviar email, tudo de repente funciona.

Kenny Wyland
fonte
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 email, apontando para localhost. O registro mx aponta para um servidor diferente, mas o arquivo hosts está substituindo o DNS e o WP está tentando entregar o email localmente. A remoção do domínio do arquivo hosts e a reinicialização do sendmail resolveram esse problema.

user16081
fonte
0

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

Na verdade, eu havia enfrentado exatamente o mesmo problema desde que meu host de turno de repente cedeu hoje e parou de enviar e-mails. Pesquisando o código e o códice, conheci 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 de @ Ralf912, modifiquei um pouco o script para que o código use a API da web do sendgrid.com para enviar e-mails em vez do wordpress padrão (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!

Prahlad Yeri
fonte
0

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

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

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

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

Portanto, se isso não ocorrer, ele retornará false, o que faz com que wp_mail () retorne false e leve à mensagem de erro.

Portanto, a solução é solicitar ao hoster que faça isso por você, ou se você estiver usando o cPanel, basta adicionar uma conta de e-mail para este endereço e ele será automaticamente adicionado à "lista confiável".

user3696815
fonte
0

chamou -Gerenciar IDs de e-mail registrados para enviar e-mails via scripts, isto é, (Wordpress)

  1. Entre no seu Cpanel.
  2. Vá para a seção Email> e clique em IDs de email registrados.
  3. depois adicione ([email protected]) ou onde seu wordpress hospedou. ie ([email protected]). Em seguida, envie alguns minutos para ativar a espera, de 15 minutos a 1 hora, dependendo do provedor de hospedagem, e ele funcionará.
Amrit Bhandari
fonte
0

Eu tive esse erro por séculos e tentei tantas soluções que não funcionaram. Eu tenho uma instalação personalizada do Wordpress no AWS EC2. Primeiro, verifique se o seu email do AWS SES está habilitado pelo suporte, eles devem estar na mesma região (ou fechar) no SES e no EC2. Eu usei o Google suite (gsuite) como email para receber / enviar email.

Verifique se o email de teste é enviado no AWS SES e Gsuite.

Instale o plug-in Wordpress WP Mail SMTP, use a opção "Other SMTP", pegue suas credenciais SMTP na AWS SES, foi aqui que fiquei preso.

Você deve ativar a caixa de seleção "SSL" para Criptografia, isso altera a porta para 465 para mim. Por fim, meu teste de e-mail foi enviado pelo Worpdress com sucesso.

Archie Butler
fonte