Enviando E-Mails com a Classe PHPMailer

Enviando E-Mails com a Classe PHPMailer

O PHP posusi a função mail, porém ela é simples demais, e só é possível usar SMTP local. Ou seja, pra testar em localhost, você precisa instalar e configurar (muito bem) um servidor SMTP. E isso dá muito trabalho.

Outro lado negativo da função mail é a necessidade de definir manualmente todos os cabeçalhos da mensagem. E eles devem ser preenchidos perfeitamente, pois eles são usados por servidores de emails como principal forma de identificação de spam. Mensagens com cabeçalhos fracos e incompletos têm alta probabilidade de serem consideradas spam.

Para facilitar o envio de e-mails, foi criada a classe PHPMailer, que possui excelente configuração de cabeçalhos, além de facilitar tarefas meio chatas, como anexar arquivos nas mensagens.

NOTA: este artigo aborda a antiga versão 5 do PHPMailer. Em agosto de 2017, foi lançada a nova versão 6. Para aprender a usá-la, veja este meu artigo atualizado.

Como Usar o PHPMailer

A classe PHPMailer pode ser baixada em seu site oficial, pelo Composer (o Composer é simplesmente fantástico, não é?) ou clonando seu repositório oficial no Github.

Eu, sem sombra de dúvidas, recomendo usar o Composer. Ele é extremamente prático. Se você ainda não usa o Composer, está esperando o quê?! Aprenda de uma vez por todas!

O pacote baixado terá, dentre outros arquivos e diretórios, os arquivos class.phpmailer.php, class.smtp.php e o PHPMailerAutoload.php.

O primeiro contém a classe PHPMailer, que instanciaremos para o envio da mensagem; o segundo contém a classe para envio de email por SMTP. O terceiro é quem faz a “mágica” de incluir os outros dois. Ou seja, basta incluir o arquivo PHPMailerAutoload.php e tudo deve funcionar normalmente.

É bom ressaltar que o arquivo PHPMailerAutoload.php foi criado em versões mais recentes do PHPMailer. Antes de ele existir, nós incluíamos o class.phpmailer.php apenas. Mas agora é preferível fazer a inclusão apenas do autoloder, que tomará conta da inclusão dos demais arquivos necessários.

Vou postar um exemplo simples, com comentário nas principais instruções. Usarei o SMTP do GMail, mas pode ser usado qualquer outro SMTP. Notem que o GMail usa SSL e porta diferente da padrão do SMTP (25).

Baixando o PHPMailer Pelo Composer

O Composer é a ferramenta perfeita para gerenciarmos dependências. Por isso recomendo usá-lo, sem pensar duas vezes.

Com o Composer instalado, basta este comando para baixar o PHPMailer:

composer require phpmailer/phpmailer

Só um detalhe importante…

O pessoal do PHPMailer anda meio preguiçoso sem tempo e não implementaram o autoloder do jeito certo para o Composer.

Explico.

Normalmente, basta incluirmos o autoloader do Composer e todas as dependências estarão disponíveis, usando o namespace correspondente.

O PHPMailer não usa namespace… :(

Mas não tem problema. Basta incluir o arquivo vendor/phpmailer/phpmailer/PHPMailerAutoload.php e está tudo resolvido.

Baixando o PHPMailer Pelo Github

Se você realmente não quiser usar o Composer (tem gente que tem medo, sei lá por que…), vou mostrar como clonar o repositório usando o Git.

git clone https://github.com/PHPMailer/PHPMailer.git

Simples assim. Isso vai baixar o diretório “PHPMailer”. Os arquivos estarão todos lá.

Script Para Envio de Email com PHPMailer

Vamos à parte que interessa.

Abaixo o script, devidamente comentado, para envio de mensagens pelo PHPMailer.

Note que o começo, na parte do require, vai mudar conforme a maneira que você baixou o PHPMailer.

// Use este require se você usou o Composer
require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php';

// Use este require se você usou o Git
require 'PHPMailer/PHPMailerAutoload.php';

$Mailer = new PHPMailer();

// define que será usado SMTP
$Mailer->IsSMTP();

// envia email HTML
$Mailer->isHTML(true);

// codificação UTF-8, a codificação mais usada recentemente
$Mailer->Charset = 'UTF-8';

// Configurações do SMTP
$Mailer->SMTPAuth = true;
$Mailer->SMTPSecure = 'ssl';
$Mailer->Host = 'smtp.gmail.com';
$Mailer->Port = 465;
$Mailer->Username = 'seu_login';
$Mailer->Password = 'sua_senha';

// E-Mail do remetente (deve ser o mesmo de quem fez a autenticação
// nesse caso [email protected])
$Mailer->From = '[email protected]';

// Nome do remetente
$Mailer->FromName = 'Seu Nome';

// assunto da mensagem
$Mailer->Subject = 'Teste';

// corpo da mensagem
$Mailer->Body = 'Mensagem em HTML';

// corpo da mensagem em modo texto
$Mailer->AltBody = 'Mensagem em texto';

// adiciona destinatário (pode ser chamado inúmeras vezes)
$Mailer->AddAddress('[email protected]');

// adiciona um anexo
$Mailer->AddAttachment('arquivo.pdf');

// verifica se enviou corretamente
if ($Mailer->Send())
{
	echo "Enviado com sucesso";
}
else
{
	echo 'Erro do PHPMailer: ' . $Mailer->ErrorInfo;
}

É muito fácil mexer com o PHPMailer. Até anexar um arquivo é simples! :)

Além do PHPMaielr, há outras ferramentas fundamentais para programadores PHP. No meu Guia Gratuito de 15 Ferramentas Fundamentais Para Programadores PHP, mostro outras 14 ferramentas, além do PHPMailer, que vão facilitar MUITO a sua vida, dando muito mais PRODUTIVIDADE para você. Clique aqui e baixe o Guia 100% Gratuito.

Essa e inúmeras outras dicas e técnicas eu abordo com mais detalhes no meu Curso ULTIMATE PHP. Estude PHP desde o básico, de forma 100% prática. Aprenda como se tornar um excelente programador, reconhecido e valorizado. Clique Aqui e Conheça o Curso Agora Mesmo!

 

Atualizando para o PHPMailer 6

O PHPMailer 6 foi lançado no final de agosto de 2017, trazendo inúmeras novidades e melhorias em relação à versão 5.

Caso você já utilize o PHPMailer 5, você não precisa mudar completamente seus scripts. Existe uma forma simples de atualizar para a versão 6.

Basta mudar a versão do pacote no composer.json e modificar a maneira como instanciamos a classe PHPMailer, seguindo o novo padrão.

Eu escrevi um guia gratuito passo-a-passo onde mostro exatamente como fazer a migração de forma simples e rápida.

Também mostro mais detalhes sobre o PHPMailer 6, explicando as principais mudanças e detalhando melhor o código.

Clique aqui e baixe gratuitamente o meu guia sobre o novo PHPMailer 6

 

Guia Grátis de Atualização Passo-a-Passo

Aprenda passo-a-passo como migrar de PHPMailer 5 para o PHPMailer 6

Novidades e mudanças da nova versão do PHPMailer

Baixe gratuitamente este guia e não fique com scripts obsoletos!

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.
  • Pingback: Tweets that mention Enviando E-Mails com a Classe PHPMailer | Blog do Beraldo -- Topsy.com()

  • post muito bom,
    vlw

  • Greenomac Dias

    Boa tarde,

    Amigo to tento problema para enviar pdf para meu ipad, quando faço o teste de envio para meu pc (SO: W7) abro no outlook e vejo o anexo, porem quando tento abrir no meu ipad usando o Mail ele nao vem o anexo em pdf. vc saberia dizer o que pode ser?

    • Olá.

      Não tenho ideia do que possa ser, infelizmente. Quando sobrar tempo, farei alguns testes com meu iPhone. Caso eu descubra algo, aviso.

  • Yan Magalhães

    Sou iniciante em php, é preciso fazer um sistema de uma locadora de veículos para o meu curso, usando a função mail. Preciso apenas enviar a senha para o usuário, que será cadastrado no bd(esta parte e tranquila). Com este script eu consigo fazer isso??

    Abraço e Parabéns pelo BLOG

    • Olá. Primeiramente, obrigado! Que bom que o conteúdo do Blog tem lhe sido útil.

      Evite mandar senha via email. Isso é uma baita falha de segurança. Veja os métodos de recuperar senha usados pelo WordPress, por exemplo: é enviado por email um link com um identificador único para o usuário trocar a senha. Assim, nenhuma senha fica armazenada na caixa de email do usuário.

      Abraço

  • Lesliê Cardoso

    Boa tarde! Parabéns pelo post, mais gostaria da sua ajuda!
    Gostaria de saber se tem alguma configuração especial pois não consigo fazer funcionar.
    Meu codigo está assim:
    include ‘phpmailer/class.phpmailer.php’;
    $mail = new PHPMailer();
    //Tell PHPMailer to use SMTP
    $mail->isSMTP();
    $mail->SMTPDebug = 2;
    $mail->Mailer = “smtp”;
    $mail->Debugoutput = ‘html’;
    $mail->Host = ‘ssl://smtp.gmail.com’;
    $mail->Port = 465;//587;
    $mail->SMTPSecure = ‘ssl’;
    $mail->SMTPAuth = true;
    $mail->Username = “[email protected]”;
    $mail->Password = “*******”;
    $mail->setFrom(‘[email protected]’, ‘WGS’);
    //$mail->addReplyTo(‘[email protected]’, ‘WGS’);
    $mail->addAddress(‘[email protected]’, ‘Lesliê Cardoso’);
    $mail->Subject = ‘PHPMailer GMail SMTP test’;
    $mail->AltBody = ‘This is a plain-text message body’;
    $mail->Body = ‘This is a plain-text message body’;
    //Attach an image file
    //$mail->addAttachment(‘images/phpmailer_mini.gif’);

    //send the message, check for errors
    if (!$mail->send()) {
    echo “Mailer Error: ” . $mail->ErrorInfo;
    } else {
    echo “Message sent!”;
    }

    e sempre retorna isso: Mailer Error: SMTP connect() failed.

  • Douglas Lopes

    Apenas um detalhe:

    O método que configura o charset é:
    $PHPMailer->CharSet = ‘UTF-8’;

    e não:
    $PHPMailer->Charset = ‘UTF-8’;

    A palavra CharSet deve ser utilizada com S maiúsculo, é apenas um detalhe, mas sem isso o método não funciona, já que foi escrito assim.

    Forte abraço,

    • Diego

      Excelente Douglas!

      Era isso mesmo!

      O Método Charset Nao Funciona com o s Minusculo!

      Bem observado por voce!

      O método $mail->CharSet = ‘UTF-8’

      Deve obrigatóriamente ter o S Maiúsculo no nome do método!

      Voce me ajudou depois de dias e dias tentando descobrir isso!

      Muito obrigado mesmo!
      Detalhes que nao prestamos atenção.

      Abraços fortes.
      Meu problema foi resolvido.

  • Diego

    Bom dia!

    Muito bem explicado esse post, porém os emails que estão sendo mandados a partir de um formulário de cadastro, estão chegando sem a codificação UTF-8.

    Abaixo segue meu código de envio desse cadastro.

    function send_mail($dados=array()) {
    //Manda Email
    // if($qr){
    $mail->Charset = ‘utf-8’;
    require(‘phpmailer/class.phpmailer.php’); //no linux faz diferenca maiuscula e minuscula
    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->SMTPAuth = true;
    $mail->SMTPSecure = “tls”; //adicionada
    $mail->Port = 587;

    $mail->Host = ‘smtp.mandrillapp.com’;
    $mail->Username = ‘[email protected]’;
    $mail->Password = ‘fouC4rhddCcr0g7IjybhOg’;

    $mail->From = ‘[email protected]’; //adicionada
    $mail->FromName = $dados[‘nome’]; //adicionada

    $mail->AddAddress(‘[email protected]’, $dados[‘nome’]);
    $mail->Subject = ‘Email de Cadastro’;
    $mail->MsgHTML(“Realizar Cadastro do Cliente:”. “”.
    “Nome:nn”.$dados[‘nome’]. “”.
    “Email:nn”.$dados[’email’]. “”.
    “Telefone:nn”.$dados[‘telefone’]. “”.
    “Observaçãoo:nn”.$dados[‘observacao’]);
    return $mail->Send();

    }

    —————————–

    Obs:Gostaria de informar que os emails chegam corretamente, porém nao chegam com a collection correta. UTF-8

    Obrigado!

  • Ricardo

    Oi Beraldo, eu uso o Classe PHPMailer, como faço para colocar no codigo um e-mail de confirmação, tipo a pessoa entrou com seus dados no formulario de contato eu quero que essa pessoa receba um e-mail de confirmação, espero sua dica, obrigado!!!

  • Andre Bruno de Carvalho

    olá o meu esta dando o seguinte erro:
    Fatal error: Class ‘SMTP’ not found in /home/andra359/public_html/PHPMaile/class.phpmailer.php on line 1194

    segue o código:

    port = 587;
    $mail->IsSMTP();
    $mail->Host = “192.185.223.111”; // Endereço do servidor SMTP
    $mail->SMTPAuth = true; // Usa autenticação SMTP? (opcional)
    $mail->Username = ‘[email protected]’; // Usuário do servidor SMTP
    $mail->Password = ‘****’; // Senha do servidor SMTP
    $mail->From = $email;
    $mail->FromName = $nome;
    $mail->AddAddress(“[email protected]”, “Andrade”);
    $mail->IsHTML(true); // Define que o e-mail será enviado como HTML
    $mail->Subject = “Mensagem do site”;
    $mail->Body = $msg;
    $enviado = $mail->Send();

    if ($enviado) {
    echo “E-mail enviado com sucesso!”;

    } else {
    echo “Em manutenção tente em outro momento”.$mail->ErrorInfo;
    }

    ?>

    este arquivo esta na mesma pasta junto com o class.phpmailer.php

    se puder me ajudar agradeço desde já.

    • Andre Bruno de Carvalho

      faltou essa parte

      $nome = $_POST[“nome”];
      $email = $_POST[“email”];
      $msg = $_POST[“mensagem”];
      $curriculo = $_POST[“curriculo”];

      // Inclui o arquivo class.phpmailer.php localizado na pasta phpmailer
      include(“class.phpmailer.php”);

      // Inicia a classe PHPMailer
      $mail = new PHPMailer();

      • Andre Bruno de Carvalho

        segue a solução:

        fazer o Require da classe SMTP no seu codigo:

        include(“class.phpmailer.php”);
        require “class.smtp.php”;
        $mail = new PHPMailer();

        e no seu host a versão do php de ser a mesma contida nos arquivos da classe PHPmailer.
        se baixar a classe PHPMailer php 5 deve configurar seu host com a mesma atualização. no meu caso: https://www.youtube.com/watch?v=WLtQCYJwoak

  • Boa Tarde Beraldo, utilizei todas as configurações iguais você coloca neste site, porém estou recebendo um erro dizendo assim ”Erro do PHPMailer: The following From address failed: [email protected]
    O email [email protected] eu criei apenas para fazer este teste no site, e a senha esta correta, tem ideia do que pode ser?

    • Olá

      Verifique se o email do From é o mesmo usado no Username. Se não for, será exibido o erro que você citou.

      Você pode usar AddReplyTo para alterar o destinatário do email de resposta. Mas o From deve ser o mesmo do email usado na autenticação

      • Sim é o mesmo, fiz até um POST lá no imaster e coloquei o código completo lá, mas estou sim utilizando o mesmo e-mail no Username e no From. Fiz isso justamente para ser um e-mail teste, depois irei utilizar um outro e-mail assim como o AddReplyTo que será muito conveniente por sinal.

  • Alessandro

    Até que enfim encontrei um que funcione….só precisei acrescentar um detalhe que neste teu modelo nao tem
    require ‘phpmailer/class.smtp.php’;

    Solicitar essa chamada senao ficava dando erro de STMP nao encontrado…

    Valeu Fera!!!

  • claudio

    preciso de um arquivo para enciar meu formulario por email. desde ja agradeço.

  • Maira Torresani

    Está dando esse erro: Erro do PHPMailer: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

    O q será?

    • Podem ser vários problemas. Habilite o SMTPDebug e acompanhe os logs.
      Pode ser que a porta de saída esteja fechada e esteja dando timeout. Pode ser a porta errada ou até mesmo falha no próprio SMTP remoto

  • jessica

    Está retornando esse erro:
    Mailer Error: SMTP connect() failed.
    https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    ja mudei a porta,habilitei o openssl e msm assim da erro
    vc saberia qual o erro

    • Olá, Jéssica. Esse erro indica algum problema na comunicação com o SMTP. Pode ser o endereço errado, usuário/senha incorretos, porta incorreta ou o protocolo inválido (SSL ou TLS). Pode inclusive ser um erro temporário na rede.
      Habilite o SMTPDebug do PHPMailer e analise os logs da execução, para identificar onde está o problema

      • jessica

        eu consegui resolver
        mt obg pela atenção

        • Anderson

          Como vc conseguiu resolver? Estou com. Esse msm problema. Por favor me ajude.

          • jessica

            no meu caso era um problema de protocolo ssl, no entando me passa seu email que eu envio meu codigo pra vc da uma olhada

            • Anderson
              • Matheus C.

                Jéssica, por gentileza se puder me informar tb como resolveu, já estou batendo a cabeça a dias com isso.
                Agradeço
                [email protected]

            • Fernando Santos

              Olá Jessica, eu gostaria de perguntar se você poderia me enviar o código para o meu email também… eu estou com este mesmo problema…

              [email protected]

        • Roberto da Silva Luz

          Olá Jessica, poderia enviar também para o meu e-mail a sua solução?
          [email protected]
          Grato!

        • Jose Lucas

          Jessica, poderia me mostrar como resolveu ? estou com o mesmo problema, agradeço desde já.
          [email protected]

  • ricardo delmiro

    estou com o mesmo problema, se alguém achou uma solução poderia por gentileza compartilhar com os colegas?