Você está visualizando atualmente WordPress + envio de e-mail por SMTP + Gmail

WordPress + envio de e-mail por SMTP + Gmail

  • Última modificação: 15/02/2019
  • Tempo de leitura: 8 min.

Se seu serviço de hospedagem não tem servidor de e-mails (ou se o servidor de e-mails vive caindo, ou se é impossível de configurar, etc.) você pode enviar os e-mails do WordPress através de uma conexão SMTP com outro servidor com o plugin WP Mail SMTP.

Para enviar os e-mails através do gmail de forma mais segura, não é mais aconselhável usar os dados SMTP do Google. Agora o plugin WP Mail SMTP precisa do código de uma aplicação web. Embora isso possa parecer trabalhoso, na verdade é um processo que, além de rápido, é grátis. Além disso, usar os dados de SMTP do Google requeria uma outra configuração (usar aplicativos menos seguros) que era mais complicada do que obter o seu token.

Passo 1: Instale o plugin WP Mail SMTP

Baixe o plugin através do repositório ou acesse seu Painel, vá em Plugins, depois em Adicionar Novo e digite WP Mail SMTP (a imagem do plugin é um pombo). Instale e ative.

Vá em Configurações→ WP Mail SMTP e preencha os campos E-mail do remetenteNome do remetente. IMPORTANTE: o campo E-mail do remetente precisa ser preenchido com o seu endereço do gmail.

No campo Mailer selecione Gmail e marque o campo Configura o endereço de retorno para corresponder ao E-mail do remetente.

Na seção logo abaixo você vai precisar dos códigos da sua aplicação Web lá no Gmail. Siga os próximos passos, ou envie este link para o seu cliente, para consegui-los.

Passo 2: Crie uma Aplicação Web

O Google disponibiliza uma ferramenta chamada Google API. Lá você consegue utilizar os serviços do Google externamente, como Google Maps, Gmail, Drive e etc. Lá você vai ter Projetos, APIs e Credenciais. Uma visão geral, para entender melhor, seria:

  • Meu projeto
    • API do Gmail
      • Credenciais
  • Outro projeto
    • API do Google Maps
      • Credenciais
    • API do Gmail
      • Credenciais

E assim por diante. É legal entender essa organização, porque o Google costuma alterar um pouco a navegação dessa área, então entendendo como funciona, você vai se achar mais fácil se mexerem lá.

Os passos abaixo são necessários para obter os dois códigos necessários para fazer o plugin funcionar com o Gmail. É preciso ter o valor do campo Authorized redirect URI, fornecido pelo WP Mail SMTP, para completar o processo.

O que é preciso fazer:

  1. Faça seu login e acesse o registro de aplicações do Gmail;
  2. Depois de acessar, você verá uma tela que diz Registre seu aplicativo no serviço Gmail API no Console de API do Google. Você pode selecionar algum projeto já existente ou não mexer para criar um novo.
  3. Na próxima tela você verá um aviso de que A API está ativada. Se você não usou nenhum projeto já existente, o Google criou um projeto chamado My Project para você. Clique em Acessar credenciais;
  4. Na próxima tela você precisará responder um formulário para descobrir quais credenciais você precisa. Preencha da seguinte forma:
    Qual API você usa? Gmail API
    De onde você chamará a API? Servidor da Web (por exemplo, node.js, Tomcat)
    Que dados você acessará? Dados do usuário
  5. Clicando em Preciso de quais credenciais? você precisará preencher outro formulário. Ao preencher este formulário, você receberá os dados necessários para voltar ao WordPress e terminar a configuração do plugin. Preencha da seguinte forma:
    Nome: deixe o padrão ou altere para qualquer outra coisa, não fará diferença para obter os códigos (este campo só é usado como referência).
    Origens JavaScript autorizadas: o endereço do seu site com http:// ou https//, mas sem / no final. No meu caso ficou https://felipeelia.com.br
    URIs de redirecionamento autorizados: como eu disse no começo desta seção, o valor deste campo é fornecido pelo plugin, na tela de configuração, no campo Authorized redirect URI. Ao lado do campo existe um botão que já copia o valor para você:
    No fim das contas, fica assim:
  6. Na tela seguinte você configurará os dados que aparecerão na tela de consentimento de uso da aplicação. Na verdade esta tela só será exibida para você, afinal só você, através do seu site WordPress, usará o aplicativo.
    Endereço de e-mail: deixe o seu
    Nome do produto mostrado aos usuários: coloque o nome do seu site. Só é usado para referência.
  7. Clique em Continuar e, na tela seguinte, em Farei isso mais tarde. Você será redirecionado para uma tela com a lista de IDs do cliente. Clique no ícone de lápis da linha (se você não mexeu no nome do Passo 5 desta lista, o nome será Cliente Web 1);
  8. A tela que abre tem, no começo, os dois dados que precisamos: ID do clienteChave secreta do cliente. IMPORTANTE: cuidado para não copiar espaços em branco nem antes de depois dos valores.

É hora de voltar para o WordPress.

Passo 3: Concedendo acesso e testando o envio de e-mails

Volte para a tela de configuração do plugin (Painel→ Configurações→ WP Mail SMTP) para completar o processo, preenchendo os valores de Client IDClient Secret e salvando. Cuidado para não colar espaços em branco antes ou depois dos valores.

Ao clicar em Save Settings e rolar a tela para baixo, você verá que apareceu um botão novo para que você possa autorizar o plugin a usar sua conta do gmail. Clique nele e siga o fluxo para permitir que o plugin use sua conta.

Depois de autorizado, volte para a tela de configuração do plugin e clique na aba Email test para testar se os envios estão sendo feitos.

Possíveis erros

Erros gerais

Confira os valores de Client ID e Client Secret.

Erro 406 – Not Acceptable

Ao tentar instalar aqui no site, tive um problema no retorno do Google para o meu site. A parte final da URL contém um https://, que o mod_security trava. Se é o seu caso, tente desativar o mod_security no painel da sua hospedagem ou, se não houver esta opção, entre em contato com o suporte.

Se sua hospedagem não liberar seu acesso, há uma gambiarra um modo de contornar. Abra o arquivo src/Providers/Gmail/Auth.php e encontre o trecho

if ( isset( $_GET['scope'] ) ) {
    $scope = urldecode( $_GET['scope'] );
}

(na minha versão é a linha 191) e altere para

if ( isset( $_GET['scope'] ) ) {
    $scope = urldecode( $_GET['scope'] );
} else {
    $scope = 'https://www.googleapis.com/auth/gmail.send';
}

Tente acessar novamente, dessa vez retirando da URL tudo do &scope= pra frente. Veja se funciona e não esqueça de desfazer a sua mudança, isto é, de voltar o arquivo ao seu conteúdo original.


Este conteúdo é baseado na documentação oficial do plugin.

Aqui no blog também expliquei como enviar e-mails pelo PHP em localhost (Linux/Ubuntu).

Felipe Elia

Associate Director of Platform Engineering na 10up, WordPress Core Contributor, Global Polyglots Mentor na comunidade internacional do WordPress e Locale Manager na comunidade WordPress Brasil.

Este post tem 11 comentários

  1. Fausto

    Felipe,
    Segui o passo a passo e no meu caso acontece o erro abaixo. Você já viu algo assim?
    Tem como contornar?

    There was a problem while sending a test email. Related debugging output is shown below:

    Versions:
    WordPress: 4.9.6
    WordPress MS: No
    PHP: 5.6.36
    WP Mail SMTP: 1.2.5

    Params:
    Mailer: gmail
    Constants: No
    Client ID/Secret: Yes
    Auth Code: Yes
    Access Token: No

    Server:
    OpenSSL: Yes
    PHP.allow_url_fopen: Yes
    PHP.stream_socket_client(): Yes
    PHP.fsockopen(): Yes
    PHP.curl_version(): Yes

    Debug:
    cURL error 7: Failed to connect to http://www.googleapis.com port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
    cURL error 7: Failed to connect to http://www.googleapis.com port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
    cURL error 7: Failed to connect to http://www.googleapis.com port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
    Error while sending via Gmail mailer: cURL error 7: Failed to connect to http://www.googleapis.com port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
    cURL error 7: Failed to connect to http://www.googleapis.com port 443: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
    Please copy only the content of the error debug message above, identified with an orange left border, into the support forum topic if you experience any issues.

  2. Jaylton Alencar

    Me apareceu o seguinte erro:

    Versions:
    WordPress: 4.7.5
    WordPress MS: No
    PHP: 5.6.33
    WP Mail SMTP: 1.2.5

    Params:
    Mailer: gmail
    Constants: No
    Client ID/Secret: Yes
    Auth Code: Yes
    Access Token: No

    Server:
    OpenSSL: Yes
    PHP.allow_url_fopen: Yes
    PHP.stream_socket_client(): Yes
    PHP.fsockopen(): Yes
    PHP.curl_version(): Yes

    Debug:
    Error while sending via Gmail mailer: {
    “error”: {
    “errors”: [
    {
    “domain”: “global”,
    “reason”: “required”,
    “message”: “Login Required”,
    “locationType”: “header”,
    “location”: “Authorization”
    }
    ],
    “code”: 401,
    “message”: “Login Required”
    }
    }

    como consertar?

    1. Felipe Elia

      Reclama de login… você executou o Passo 3 da lista?

      1. Jaylton Alencar

        Executei, mas tinha cometido um erro, agora deu certo. Valew!!

  3. Raphael Amado Oliveira

    Ola Felipe fiz o que você falou mas continua dando o seguinte erro:
    SMTP Error: Could not authenticate.
    O que tenho que fazer?

    Abs

    1. Felipe Elia

      Normalmente no final da tela de erro tem mais detalhes sobre o que deu errado. “Could not authenticate” pode indicar erro no usuário ou senha 🙂

  4. Carlos Nani

    Foi o único tutorial que funcionou para mim. Obrigado.

  5. Sergio Marcos

    Boa noite,

    Pode me informar qual finalidade real de se ter um plugin de email via smtp ? e somente para uso de formulário, como faço para enviar email ?

    Agradeço se for esclarecedor,

    Att

    Sergio

    1. Felipe Elia

      Essa é fácil Sérgio, a finalidade real de se ter um plugin de email via smtp: enviar emails via um servidor smtp diferente que o servidor atual. Sobre enviar emails através de envio de formulários preciso saber melhor até que ponto você entende a mecânica de envio do WordPress ok?

  6. francisca

    jovem, no meu caso o meu formulário de contato funcionava perfeitamente depois que instalei um plugin chamado contact form ele parou de funcionar, quando eu coloco um email do gmail funciona mais quando coloco do meu servido de email não vai, tem alguma ideia do que possa ser.?

  7. Walter Sergio

    Ola Felipe, seguindo a sua orientação
    da o seguinte erro

    Test Message Sent
    The result was:
    bool(false)
    The full debugging output is shown below:
    object(PHPMailer)#369 (65) {
    [“Priority”]=>
    int(3)
    [“CharSet”]=>
    string(5) “UTF-8”
    [“ContentType”]=>
    string(10) “text/plain”
    [“Encoding”]=>
    string(4) “8bit”
    [“ErrorInfo”]=>
    string(43) “SMTP Error: Could not connect to SMTP host.”
    [“From”]=>
    string(20) “[email protected]
    [“FromName”]=>
    string(15) “walter sandoval”
    [“Sender”]=>
    string(20) “[email protected]
    [“ReturnPath”]=>
    string(0) “”
    [“Subject”]=>
    string(40) “WP Mail SMTP: Test mail to [email protected]
    [“Body”]=>
    string(68) “This is a test email generated by the WP Mail SMTP WordPress plugin.”
    [“AltBody”]=>
    string(0) “”
    [“MIMEBody”:protected]=>
    string(69) “This is a test email generated by the WP Mail SMTP WordPress plugin.

    [“MIMEHeader”:protected]=>
    string(434) “Date: Mon, 24 Mar 2014 04:51:02 +0000
    Return-Path: [email protected]
    To: [email protected]
    From: walter sandoval
    Subject: WP Mail SMTP: Test mail to [email protected]
    Message-ID:
    X-Priority: 3
    X-Mailer: PHPMailer 5.2.4 (http://code.google.com/a/apache-extras.org/p/phpmailer/)
    MIME-Version: 1.0
    Content-Transfer-Encoding: 8bit
    Content-Type: text/plain; charset=UTF-8


    [“mailHeader”:protected]=>
    string(0) “”
    [“WordWrap”]=>
    int(0)
    [“Mailer”]=>
    string(4) “smtp”
    [“Sendmail”]=>
    string(18) “/usr/sbin/sendmail”
    [“UseSendmailOptions”]=>
    bool(true)
    [“PluginDir”]=>
    string(0) “”
    [“ConfirmReadingTo”]=>
    string(0) “”
    [“Hostname”]=>
    string(0) “”
    [“MessageID”]=>
    string(0) “”
    [“MessageDate”]=>
    string(0) “”
    [“Host”]=>
    string(14) “smtp.gmail.com”
    [“Port”]=>
    string(3) “465”
    [“Helo”]=>
    string(0) “”
    [“SMTPSecure”]=>
    string(3) “ssl”
    [“SMTPAuth”]=>
    bool(true)
    [“Username”]=>
    string(20) “[email protected]
    [“Password”]=>
    string(10) “”
    [“AuthType”]=>
    string(0) “”
    [“Realm”]=>
    string(0) “”
    [“Workstation”]=>
    string(0) “”
    [“Timeout”]=>
    int(10)
    [“SMTPDebug”]=>
    bool(true)
    [“Debugoutput”]=>
    string(4) “echo”
    [“SMTPKeepAlive”]=>
    bool(false)
    [“SingleTo”]=>
    bool(false)
    [“SingleToArray”]=>
    array(0) {
    }
    [“LE”]=>
    string(1) ”

    [“DKIM_selector”]=>
    string(0) “”
    [“DKIM_identity”]=>
    string(0) “”
    [“DKIM_passphrase”]=>
    string(0) “”
    [“DKIM_domain”]=>
    string(0) “”
    [“DKIM_private”]=>
    string(0) “”
    [“action_function”]=>
    string(0) “”
    [“Version”]=>
    string(5) “5.2.4”
    [“XMailer”]=>
    string(0) “”
    [“smtp”:protected]=>
    object(SMTP)#368 (11) {
    [“SMTP_PORT”]=>
    int(25)
    [“CRLF”]=>
    string(2) ”

    [“do_debug”]=>
    bool(true)
    [“Debugoutput”]=>
    string(4) “echo”
    [“do_verp”]=>
    bool(false)
    [“Timeout”]=>
    int(10)
    [“Timelimit”]=>
    int(30)
    [“Version”]=>
    string(5) “5.2.4”
    [“smtp_conn”:”SMTP”:private]=>
    bool(false)
    [“error”:”SMTP”:private]=>
    array(1) {
    [“error”]=>
    string(38) “Called Reset() without being connected”
    }
    [“helo_rply”:”SMTP”:private]=>
    NULL
    }
    [“to”:protected]=>
    array(1) {
    [0]=>
    array(2) {
    [0]=>
    string(13) “[email protected]
    [1]=>
    string(0) “”
    }
    }
    [“cc”:protected]=>
    array(0) {
    }
    [“bcc”:protected]=>
    array(0) {
    }
    [“ReplyTo”:protected]=>
    array(0) {
    }
    [“all_recipients”:protected]=>
    array(1) {
    [“[email protected]”]=>
    bool(true)
    }
    [“attachment”:protected]=>
    array(0) {
    }
    [“CustomHeader”:protected]=>
    array(0) {
    }
    [“message_type”:protected]=>
    string(5) “plain”
    [“boundary”:protected]=>
    array(3) {
    [1]=>
    string(35) “b1_6578d022b458b288ceb0214b1224dc6f”
    [2]=>
    string(35) “b2_6578d022b458b288ceb0214b1224dc6f”
    [3]=>
    string(35) “b3_6578d022b458b288ceb0214b1224dc6f”
    }
    [“language”:protected]=>
    array(18) {
    [“authenticate”]=>
    string(35) “SMTP Error: Could not authenticate.”
    [“connect_host”]=>
    string(43) “SMTP Error: Could not connect to SMTP host.”
    [“data_not_accepted”]=>
    string(30) “SMTP Error: Data not accepted.”
    [“empty_message”]=>
    string(18) “Message body empty”
    [“encoding”]=>
    string(18) “Unknown encoding: ”
    [“execute”]=>
    string(19) “Could not execute: ”
    [“file_access”]=>
    string(23) “Could not access file: ”
    [“file_open”]=>
    string(33) “File Error: Could not open file: ”
    [“from_failed”]=>
    string(35) “The following From address failed: ”
    [“instantiate”]=>
    string(36) “Could not instantiate mail function.”
    [“invalid_address”]=>
    string(15) “Invalid address”
    [“mailer_not_supported”]=>
    string(25) ” mailer is not supported.”
    [“provide_address”]=>
    string(54) “You must provide at least one recipient email address.”
    [“recipients_failed”]=>
    string(45) “SMTP Error: The following recipients failed: ”
    [“signing”]=>
    string(15) “Signing Error: ”
    [“smtp_connect_failed”]=>
    string(22) “SMTP Connect() failed.”
    [“smtp_error”]=>
    string(19) “SMTP server error: ”
    [“variable_set”]=>
    string(30) “Cannot set or reset variable: ”
    }
    [“error_count”:protected]=>
    int(2)
    [“sign_cert_file”:protected]=>
    string(0) “”
    [“sign_key_file”:protected]=>
    string(0) “”
    [“sign_key_pass”:protected]=>
    string(0) “”
    [“exceptions”:protected]=>
    bool(true)
    }
    The SMTP debugging output is shown below:
    SMTP -> ERROR: Failed to connect to server: Connection timed out (110)

    grato pela ajuda
    Walter

Comentários encerrados.