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!
Você também vai gostar de ler:
- Twittando pelo PHP
- Como criar um Sistema de Login com Níveis de Permissão
- Pegando dados do Google Analytics via PHP
- Contador de visitas usando o MySQL
- Tutorial básico de cURL – Instalação, configuração e uso
Com as tags Classe, Código, Conexão, Configuração, Download, E-mail, Externo, File, Funcionalidade, HTML, Login, Password, PHP, PHPMailer, Scripts, Senha, Servidor, source, Tutorial
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:
Ola thiago, tem como colocar auto resposta
@Wagner
Procure mais na documentação do PHPMailer que você encontrará algo sobre.
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;
@Pedro
Você está usando propriedades que não vieram do meu exemplo… SMTP_PORT por exemplo.
Tente como mostra o exemplo do post, depois tente esse exemplo:
http://phpmailer.worxware.com/index.php?pg=examplebsmtp
Outra coisa é que esse e-mail no_replay@xxx.com.br deve existir na sua hospedagem cadastro com a senha yyy.
Abraços
//$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.
@Pedro
Correto… Esse password é a senha do e-mail (para a autenticação SMTP)… Verifique se os dados estão corretos.
The following From address failed: no_replay@profissionet.com.br
sabe oq causaria este erro?
@Allan
O seu servidor não permitiu que você enviasse um e-mail usando esse endereço, você está usando autenticação SMTP? Se não, use.
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!
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?
@Bruno
Provavelmente você errou os dados de servidor ou autenticação SMTP.
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
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!!
@Viiii
Provavelmente é a sua versão do PHP que é antiga.
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
Para enviar emails pelo PHPMailer utilizando o hospedagem da Insite, o parâmetro HOST deve ser omitido, ou seja, não configure o HOST SMTP.
Abraço a todos e parabéns pelo tópico!
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?
@Ton

Exato, você precisa fazer o upload do arquivo antes… Esse é um bom material sobre: Upload de Arquivos – Como tudo funciona
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!
@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
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.
@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.
Posso enviar emails em massa com essa classe ?
Pegar os destinatarios de em banco de dados por ex ?
Não serei classificado como SPAM ?
@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.
Seria assim então, Thiago.
// Define os anexos (opcional)
42.//$mail->AddAttachment(“c:/temp/”variavel”, “variavel”);//
Ficaria assim ou como?
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!!!
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
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?!!!
Mas mesmo assim mto obrigado pela ajuda!!
Abração e até!
Fala Robson,
Sem dúvida é erro humano… Verifica se o action=”" do formulário tá com o nome do arquivo direitinho.. e se os caminhos estão corretos
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á.
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á.
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
@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.
@Robson
Tem um exemplo de como anexar arquivos no script do post… dá uma olhada!
@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”);