Enviar e-mails pelo PHP usando o PHPMailer

Você está tendo problemas para enviar e-mails pelo seu script PHP? Seus problemas acabaram!

Hoje vou ensinar como usar o PHPMailer para enviar os e-mails do seu site – via SMTP – com facilidade.

O PHPMailer é uma classe pronta para envio de e-mails através do PHP via conexão SMTP ou POP3 muito utilizado por todo o mundo. Seu método de envio é largamente recomendado e é bem melhor do que o envio do mail() que á função padrão do PHP.

Primeiro você precisa fazer o download da última versão dele, vá nesse endereço e baixe a sua versão ou vá direto ao site do script.

Nota: Nesse tutorial usarei a versão 2.3 (download) do PHPMailer que é a última versão até agora.

Faça o download, descompacte o arquivo e coloque os arquivos class.phpmailer.php e class.smtp.php em uma pasta chamada phpmailer dentro do seu site.

Agora, vamos ao script que faz o envio do e-mail:

<?php

// Inclui o arquivo class.phpmailer.php localizado na pasta phpmailer
require("phpmailer/class.phpmailer.php");

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

// Define os dados do servidor e tipo de conexão
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->IsSMTP(); // Define que a mensagem será SMTP
$mail->Host = "smtp.dominio.net"; // Endereço do servidor SMTP
//$mail->SMTPAuth = true; // Usa autenticação SMTP? (opcional)
//$mail->Username = 'seumail@dominio.net'; // Usuário do servidor SMTP
//$mail->Password = 'senha'; // Senha do servidor SMTP

// Define o remetente
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->From = "seumail@dominio.net"; // Seu e-mail
$mail->FromName = "Joãozinho"; // Seu nome

// Define os destinatário(s)
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->AddAddress('fulano@dominio.com.br', 'Fulano da Silva');
$mail->AddAddress('ciclano@site.net');
//$mail->AddCC('ciclano@site.net', 'Ciclano'); // Copia
//$mail->AddBCC('fulano@dominio.com.br', 'Fulano da Silva'); // Cópia Oculta

// Define os dados técnicos da Mensagem
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->IsHTML(true); // Define que o e-mail será enviado como HTML
//$mail->CharSet = 'iso-8859-1'; // Charset da mensagem (opcional)

// Define a mensagem (Texto e Assunto)
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->Subject  = "Mensagem Teste"; // Assunto da mensagem
$mail->Body = "Este é o corpo da mensagem de teste, em <b>HTML</b>! <br /> :)";
$mail->AltBody = "Este é o corpo da mensagem de teste, em Texto Plano! \r\n :)";

// Define os anexos (opcional)
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//$mail->AddAttachment("c:/temp/documento.pdf", "novo_nome.pdf");  // Insere um anexo

// Envia o e-mail
$enviado = $mail->Send();

// Limpa os destinatários e os anexos
$mail->ClearAllRecipients();
$mail->ClearAttachments();

// Exibe uma mensagem de resultado
if ($enviado) {
echo "E-mail enviado com sucesso!";
} else {
echo "Não foi possível enviar o e-mail.<br /><br />";
echo "<b>Informações do erro:</b> <br />" . $mail->ErrorInfo;
}

?>

Algumas linhas de código estão comentadas porque são opcionais e dependem também da necessidade de quem vai usar o script. Logo no começo, na parte dos dados do servidor você tem a opção de configurar o login do servidor SMTP caso seja necessário.

Repare que, na parte na qual definimos a mensagem e o assunto do e-mail, temos duas formas de “corpo de e-mail”: formato HTML e formato Texto Plano… É bom que você também defina o texto plano (que nada mais é do que um texto sem as tags HTML parecido com o conteúdo de um arquivo .txt) por que muitos leitores de e-mail não têm suporte a e-mails em HTML (seja por configuração do usuário ou por falta de funcionalidade mesmo).

Deixei também um exemplo pronto de como anexar um arquivo ao seu e-mail. O caminho do arquivo (primeiro arquivo) está nos moldes de um servidor rodando localmente… Mas ele pode ser relativo se você estiver usando o script num servidor externo. O segundo argumento é o ‘novo’ nome do arquivo, mas é opcional.

Bom… Espero que tenham entendido o script e consigam usá-lo. Qualquer dúvida é só falar!

80 ideias sobre “Enviar e-mails pelo PHP usando o PHPMailer

  1. Victor Guilherme

    Olá Thiago, eu segui todos os passos e serviu certinho para mim, muito obrigado pelo Tutorial :D

    Só que estou com alguns probleminhas, toda mensagem que envio vai para o Lixo Eletronico. Ela diz a mensagem certa, mas alem de ir pra Caixa de Entrada no Email, vai pro Lixo. O Email diz que a mensagem é o seguinte “Esta mensagem parece suspeita para os filtros do SmartScreen. Ela será excluída após 10 dias.”

    O que eu poderia fazer para resolver?

    1. Marcos Vinicius Nascimento Pereira

      Olá caro Victor,

      deve levar em consideração que este e-mail não deve ser enviado através de um serviço genérico de mensagens como Gmail, Hotmail ou qualquer outro, claro se quiser diminuir sua quantidade de e-mails no lixo eletrônico.

      Outra precaução que seria interessante além de enviar de um domínio próprio, é configurar os serviços de SPF junto a sua hospedagem, isso evita que uma porcentagem muito grande de seus e-mails caiam no spam.

      Evitar links em imagens muito grandes ou muitos links num mesmo e-mail pode contornar a caixa de spam.

      Estão ai algumas dicas importantes.

  2. mvnp26

    Bom dia Thiago,

    Gostaria de uma ajuda da sua parte, serei eternamente grato.

    Estou tentando enviar para vários emails vindos do banco de dados e procuro uma solução a 2 dias sem sucesso pois não consigo fazer funcionar.

    Pode me ajudar por favor?

    Parabéns pelo seu material de apoio, você tem um método excelente de expor as suas idéias em forma de códigos.

    Sempre compartilho e recomendo seu blog.

    Abraços.

  3. Diego Soares

    Muito obrigado Thiago.
    Esse post me ajudou muito a solucionar o problema aqui da empresa.
    Continue nessa vibe.

    Abraços.

  4. heavyrick

    muito bom cara, funcionou de boa (nem tem necessidade mais de alterar os arquivos no php.ini e sendmail.ini) o/

  5. Amaury Victor

    O meu deu o seguinte erro:
    ————————————————————————-
    Não foi possível enviar o e-mail.

    Informações do erro:
    SMTP Error: Could not connect to SMTP host.

    Pode me ajudar.
    ————————————————————————-

    Obrigado pelos tutoriais, você ajuda muita gente.

  6. uhelliton

    Obrigado Thiago. Sempre com o coração disposto a ajudar os demais. Que Deus lhe abeçoe grandemente.

  7. Joaquim Oliveira

    Boas Thiago Belem, caso falhe o envio de email não há uma função phpmailer para fazer mais x tentativas antes de indicar que o envio falhou?

  8. Rafael

    Ola, belo post…

    estou com um problema…
    no meu site ele ja diz que enviou, antes de clicar no submit…
    os códigos estão iguais, sóque ele mostra a mensagem antes de enviar e eu nao consigo resolver isto, poderia me ajudar?

  9. Franchersco

    Bruno seu burro animal batizado

    o POP é apenas para receber mensagens, você obrigatoriamente deverá ter SMTP para enviar as mensagens

  10. André Iannotta

    Fala Thiago Belem!

    Cara desculpe a minha ignorância (sou novato com php) mais fiz o que esta no seu tutorial, porém quando eu clico em enviar simplesmente abre a pagina que criei com os códigos acima. Sera que vc poe me dar um HELP??

    Desde ja parabéns pelo seu site…

  11. Natacha

    Boa tarde,

    Gostaria de uma ajuda, tenho que criar um formulário e enviar os dados que foram preenchidos por email, porém não consigo que a opção que selecionaram em um “radio” vá para o email, no email só chega o assunto a mensagem o remetente mas não chega a opção do “radio” que a pessoa selecionou. Alguem pode me ajudar, por favor?

  12. Emilio

    Boam dis Thiago.

    Saberia me informar se o smtp informado tem que ser o mesmo do domínio onde o site está hospedado, ou pode ser um smtp diferente?

  13. celso

    tem como você fornecer um modelo de formulário para usar sua dica… ou como que faço para montar um…. não sou do ramo e estou querendo aprender

  14. Deivison Arthur

    Thiago mais uma véz muito obrigado!

    Eu já tinha procurado em vários lugares e algo estava dando errado, dai peguei seu tutorial colei e alterei e pronto :)

    Sou seu fã e parabéns pelo seu blog, ele esta no topo dos meus favoritos rs

  15. Ricardo Sampaio

    Thiago,
    Parabéns pelo blog, cara. Sempre tem uma resposta para as minhas dúvidas em PHP.
    Já venho utilizando a classe phpmailer há algum tempo, mas não sei como fazer para ter uma resposta se o e-mail foi corretamente entregue ao destinatário e se o mesmo abriu o e-mail. Para descobrir se o e-mail foi aberto, só solicitando confirmação de leitura ou existe outro método? e quanto a confirmação de entrega do e-mail para o servidor de destino? como saber se o e-mail foi recebido pelo servidor?
    Espero que você possa sanar minhas dúvidas e um grande abraço.
    Continue com seu blog, que para mim já virou uma grande referência.
    Parabéns.

  16. Arnaldo Bertoni

    Valeu Thiago….classe sensacional !!!!….Fiquei com problemas na acentuação do subject mas usei o utf8_decode() na string e resolveu o problema….valeu pela força,…..que pra ti volte em dobro !!!!!…Abraços

  17. eveline

    Li seu post sobre: Enviar e-mails pelo PHP usando o PHPMailer, implementei usando o SMTP do yahoo: Enviar e-mails pelo PHP usando o PHPMailer, porém dá erro de envio Erro de SMTP: Não foi possível conectar com o servidor SMTP. não sei como resolver.. pode me ajudar?

  18. Fernando

    Sabe me dizer como posso fazer para modificar a fonte de envio do email, pois a fonte que envia é muito pequena.

  19. Djone

    Estou desenvolvendo um sistema de integração de blogs totalmente automatizado, primeiro projeto grande sabe como é, e essa classe realmete fez meus problemas acabarem =]
    A ideia era fazer o envio de e-mail com novidades, comentarios e indicações todos com o mail(), mas pesquisei um pouco masi a fundo e vi que era um método um poco inadequado pra trabalhos em massa – que provavelmente vai ser necessario .

    Muito bom post, parabéns

  20. Ane

    Olá Thiago,adorei seu blog!Está me ajudando muito em php,vou dar uma olhada em jquery também á qual fiz um curso de 20hrs mas não foi muito esclarecedor.Tenho uma dúvida,gostaria de lhe pedir uma matéria com o código para: Digamos que eu tenha os dados da vigência de contrato de um individuo cadastrados no banco de dados(mysql),e que ao me logar no sistema(como administrador), o mesmo faz uma verificação automática entre as datas de vigências armazenadas no banco e a data ATUAL real,e caso for 1 mês antes da data armazenada no bd(ex: armazenada:24/4/2010 e data atual:24/3/2010) o sistema envia um email para o administrador(es) do sistema informando que a vigência da X pessoa(uma ou mais..) vai vencer em um mêS.Como poderia ser feito? Obrigada desde já. Abraço

  21. Ane

    Olá, gostaria de lhe pedir uma matéria ou uma explicação para: Digamos que eu tenha os dados da vigência de contrato de um individuo cadastrados no banco de dados(mysql),e que ao me logar no sistema, o mesmo faz uma verificação automática entre as datas de vigências armazenadas no banco e a data ATUAL real,e caso for 1 mês antes da data armazenada no bd(ex: armazenada:24/4/2010 e data atual:24/3/2010) o sistema envia um email para o administrador(es) do sistema infromando que a vigência da X pessoa(uma ou mais..) vai vencer em um mêS.Como poderia ser feito?

  22. Nayra

    <b>Oi Thiagoo!</b>
    Seu site é maravilhoso!
    Agradeço a sua disposição em ajudar as pessoas que querem aprender e aprimorar seus conhecimentos em <em>php</em>.

    O que eu gostaria de saber é se este script php funciona com gmail, hotmail e/ou yahoo.

    Obrigada ^^

    1. Thiago Belem

      @Nayra
      Cada um desses servidores de e-mail tem forma diferentes de autenticação, uns usam uma porta diferente, outras usam SSL e etc… Você precisa pesquisar, mas o script funciona sim. :)

  23. pedro

    tem como vc me dar um help e ver se esqueci algo?
    $mail->IsSMTP();
    $mail->Host = “smtp.xxx.com.br”;
    $mail->From = “no_replay@xxx.com.br”; // Seu e-mail
    $mail->Username = “no_replay@xxx.com.br”;
    $mail->FromName = “xxx”;
    $mail->Password = “yyy”;
    $mail->SMTPAuth = true;
    $mail->SMTP_PORT = 465;
    $mail->AddAddress($emailusuario, $nomeusuario);
    $mail->AddAddress($nomeusuario);
    $mail->IsHTML(true);
    $mail->Subject = $assunto;
    $mail->Body = $mensagem;

  24. pedro

    //$mail->Password, esse password é a senha do e-mail, não é isso????

    pois eu acho que é isso que esta degando o erro

    Não foi possível conectar com o servidor SMTP.

  25. João Marcello

    Tiago,
    Parabéns pela iniciativa.

    Porém, para mim (leigo), não ficou muito claro se tenho que montar 2 arquivos, um chamando o outro depois de enviar o form ou se coloco tudo na mesma página de contato.

    Outra coisa, é possível eu fazer com que o DESTINATÁRIO seja dinâmico? Ou seja, o e-mail de destino muda dependendo da opção que o REMETENTE escolher em um SELECT (ou RADIO)?

    Obrigado!

  26. Bruno

    Warning: fsockopen() [function.fsockopen]: unable to connect to mail.williarts.com.br:25 in /srv/www/vhosts/goldssbr/www/2009/phpmailer/class.smtp.php on line 122
    Não foi possível enviar o e-mail.

    Informações do erro:
    SMTP Error: Could not connect to SMTP host.

    no meu fica dando esse erro, tentei colocar o arquivo em outro servidor e da a mesma coisa, configurei tudo certim =/
    oq será que pode ser?

  27. Ranieli

    Muito bom o tutorial, mas tenho o seguinte problema:

    SMTP Error: The following recipients failed: ranieli@gmail.com

    diz que o destinatário falhou, mas isso acontece com qualquer destinatário que eu coloco. O que poderá ser…

    vlw

    1. Gerson Nunes

      Caso apareça o erro: SMTP Error: The following recipients failed, é porque o servidor requer autenticação. Basta configurar para o PHPMailer se autenticar com o seguinte comando:
      $mail->SMTPAuth = true;

  28. Viiiii

    Boa noite! eh exatamente isso que preciso, parabens pelo artigo, mas estou com um problema,
    tah aparencendo esse erro :
    Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /www/phpmailer/class.phpmailer.php on line 45

    Eu nao mexi nesse arquivo..
    o q sera qesta errado??
    vlw!!

  29. César Oliveira

    Olá Tiago,

    Eu estou a começar a usar a PHP.
    Sou programador ColdFusion, mas quero também ser programador PHP.

    Gostei muito da explicação do phpmailler

    Vou tentar usar, Se não conseguir digo alguma coisa.

    Cumprimentos
    César Oliveira
    http://www.profissionalweb.net

  30. Ton

    Olá, Thiago

    Dúvida: para usar

    $mail->AddAttachment(“c:/temp/documento.pdf”, “novo_nome.pdf”);

    eu não tenho de fazer o upload do arquivo primeiro? E se sim, como eu faço?

  31. Manuel Duarte

    E aí Thiago? Bleza?

    Seguinte, tou tentando implementar isso daí e segui direitinho suas instruções e funfou legal mas se colocar um outro form numa outra pasta repetindo tudo, o html do form, o envio.php e as class.smtp e class.mailer aquilo se explode todo??

    Como faz para usar em forms diferentes de pastas/sites diferentes? Só pode ficar uma unica cópia das classes no servidor é? E fazer alinhar para elas ou tem de repetir as classes em todas as pastas?

    Valeu!

    1. Thiago Belem

      @Manual
      Os arquivos do PHPMailer continuam sendo os mesmos, não precisa nem tocar neles… Só o arquivo do dormulário e o arquivo de envio do e-mail que – normalmente – teria um nome diferente… Mas a inclusão do PHPMailer pode ser o mesmo arquivo que não tem problema.
      Sobre as pastas, procure sobre “caminho relativo” e “caminho absoluto” que você deve encontrar algo.

      Abraços :)

  32. Renato

    caso eu queira enviar enviar e-mails para uma lista muito grande de e-mails (10.000) usuários, teria algum problema ou depende apenas do max_execution_time do php?

    como eu poderia fazer?
    Obrigado.

    1. Thiago Belem

      @Renato
      A principio não tem problema nenhum… Existem servidores que conseguem enfileirar os 10.000 e-mails em 1 segundo e depois (a entrega dos e-mails) não é trabalho do PHP… Mas se você for pausar o script entre cada envio, é bom você atentar para essa configuração.
      Dá uma olhada na função set_time_limit() do PHP.

  33. Joao

    Posso enviar emails em massa com essa classe ?

    Pegar os destinatarios de em banco de dados por ex ?

    Não serei classificado como SPAM ?

    1. Thiago Belem

      @Joao
      Pode sim… Normalmente não vai como SPAM.. Mas toma cuidado com o conteúdo da mensagem, e se possível, muda o assunto da mensagem pra cada destinatário e vai ficar tudo perfeito. :)

  34. Thiago Belem

    @Robson
    No primeiro argumento você define o caminho do arquivo, e no segundo argumento você define qual nome o arquivo terá como anexo:
    $mail->AddAttachment(“fotos/foto.jpg”, “minhafoto.jpg”);

  35. Robson

    Seria assim então, Thiago.

    // Define os anexos (opcional)
    42.//$mail->AddAttachment(“c:/temp/”variavel”, “variavel”);//

    Ficaria assim ou como?

  36. Robson

    Bom dia Thiago, td bom rapaz?!!!

    Bem meu amigo, to eu aqui dinovo!
    Agora a dúvida é outra um pouco diferente.
    Como eu poderia fazer pra enviar um arquivo junto com o phpmailer?

    Vou explicar melhor.
    Coloquei uma <input type=”file”> no meu formulário mas num sei como faço pra que o arquivo que eu selecionar seja enviado junto pelo email.

    Se vc tiver ai um exemplo ou algo que puder me dar uma luz lhe agradeço imensamente!

    E obrigado mais uma vez!!!

  37. Thiago Belem

    @Robson

    Esse erro significa que o PHPMailer não conseguiu se conectar ao servidor SMTP que você especificou… Verifica se o endereço está correto e, se não tiver feito, ativa a autenticação do SMTP inserindo o seu e-mail e a senha do e-mail no usuário e senha de conexão respectivamente.

    Verifica com a insite também se o formato de usuário de conexão do SMTP é por exemplo: “nome@dominio.com.br” ou “nome+dominio.com.br” pq alguns servidores só aceitam com + no lugar do @…

    Qualquer coisa é só falar. ;)

  38. Robson

    Bom dia Thiago, td bom rapaz?!

    To eu aqui dinovo néh?!!!
    uhauhauhauhauhauha =D

    Bem rapaz, a dúvida agora é a seguinte
    Eu fiz os testes com essa classe num ftp da locaweb e funcionou, agora eu tentei fazer o mesmo processo mas por um da insite e ta dando esta mensagem:

    “Warning: fsockopen() [function.fsockopen]: unable to connect to smtp.”meu_dominio”.com.br:25 (Connection refused) in /home/”usuário”/public_html/phpmailer/class.smtp.php on line 122″

    SMTP Error: Could not connect to SMTP host.

    Não to entendendo esse erro, já liguei pra insite pra confirmar o endereço do servidor smtp, usuário e senha e tá tudo certo, o que pode ser, tem alguma idéia amigão?!!!

    desde já agradeço! =D

  39. Robson

    Acertou em cheio Tiago!

    Era isso mesmo meu caro, depois que eu mandei o comentário para vc eu fui reparar que o nome da página que envia era enviaremail.php e no form estava chamando enviaemail.php
    uhauhauhauhauhauhauha

    Por causa de um “r” quase pirei, o que a falta de atenção não causa?!!!
    :P

    Mas mesmo assim mto obrigado pela ajuda!!
    Abração e até!

  40. Robson

    Bom dia Tiago, tudo bom?!

    Gostei muito do tutorial, bem esclarecedor. Meus parabéns!

    Mas agora estou com um outro probleminha, acredito que seja de fácil solução.

    Bem, vamos a dúvida!

    Eu fiz um formulário de envio de email do meu site e direcionei para a página onde serão enviadas as informações, “enviaremail.php”, esta é o script do tutorial com as informações de servidor certinhas.

    O problema é que quando eu executo o envio de email no site preenchendo todos os campos direitinho e clico no botão enviar ele me dá o erro 404 página não encontrada. As páginas estão no ftp, configuradas, direcionando para a páginas certas, mas ele não a encontra.

    Se vc puder me ajudar lhe agradeço desde já.

  41. Thiago Belem

    Olá Elson,

    Eu não acharia nada funcional e/ou seguro colocar os dados de SMTP no formulario.html porque isso fica visível para os visitantes no código fonte do HTML.

    Dá uma estudada em outra forma de fazer isso! ;)

    Abraços

  42. Elson

    Bom dia Tiago.
    Gostaria de saber qual a melhor forma de digitar o endereço SMTP na página ‘formulario.html’ e que ‘enviar.php'(com esse código acima) faça a leitura.
    Ou seja, ao invés de definir o SMTP no script, deixar essa definição ser feita no formuário.

    Obrigado desde já.

Os comentários estão fechados.