Palavra:   

Revista PHP / PHP

Flávia Jobstraibizer

Analista de sistemas, DBA Mysql, PostgreSQL, Oracle, SQLServer e Firebird. Desenvolvedora de sistemas, e administradora de servidores FreeBSD. Conheça o site www.flaviajobs.com.br

Utilizando a classe phpmailer

O envio de emails por dentro dos servidores, é uma tarefa que 100% entre 100% dos usuários, precisam. Enviar email é tarefa universal na internet. Partindo disso, vou ensinar um método muito mais eficiente de enviar emails online, do que simplesmente escrever a função mail toda vez.
Neste artigo, vou abordar a utilização da famosa classe PHPMailer (http://phpmailer.sourceforge.net/), para envio de emails.

Baixe a classe atualizada, no site mencionado. Apesar de não haver atualizações desde 2005, a classe é livre de bugs. E digo isso tendo a utilizado em mais de 50 sistemas, e inclusive em meu próprio site, tendo tido sempre 100% de aproveitamento!

De posse da classe, vamos criar um formulário de contato simples, parecido com este: http://www.flaviajobs.com.br/v6/contato.php

HTML
  1. <form id="form1" name="form1" method="post" action="enviaemail.php">
  2. Seu nome:
  3. <input type="text" name="nome" />
  4. </label>
  5. <br />
  6. Seu e-mail:
  7. <input type="text" name="email" />
  8. </label>
  9. <br />
  10. Assunto da mensagem:
  11. <input type="text" name="assunto" />
  12. </label>
  13. <br />
  14. Mensagem:
  15. <textarea name="msg" cols="30" rows="5"></textarea>
  16. </label>
  17. <br />
  18. <br />
  19. <input type="submit" name="Submit" value="Enviar" />
  20. </label>
  21. </form>
www.revistaphp.com.br
Notando que na action do form, estamos passando os dados do formulário (via POST) para a página enviaemail.php.
Sendo assim, vamos vê-la agora.

enviaemail.php
Neste trecho, vamos ver itens indispensáveis, para a configuração das opções de envio do email.
PHP
  1. // chamada da classe phpmailer
  2. require_once('class.phpmailer.php');
  3.  
  4. // resgatando os dados passados pelo form
  5. $nomeusuario = $_POST['nome'];
  6. $emailusuario = $_POST['email'];
  7. $assunto = $_POST['assunto'];
  8. $mensagem = $_POST['msg'];
  9.  
  10.  
  11. // faço a chamada da classe
  12. $Email = new PHPMailer();
  13. // na classe, há a opção de idioma, setei como br
  14. $Email->SetLanguage("br");
  15. // esta chamada diz que o envio será feito através da função mail do php. Você mudar para sendmail, qmail, etc
  16. // se quiser utilizar o programa de email do seu unix/linux para enviar o email
  17. $Email->IsMail();
  18. // ativa o envio de e-mails em HTML, se false, desativa.
  19. $Email->IsHTML(true);
  20. // email do remetente da mensagem
  21. $Email->From = $emailusuario;
  22. // nome do remetente do email
  23. $Email->FromName = $nomeusuario;
  24. // Endereço de destino do emaail, ou seja, pra onde você quer que a mensagem do formulário vá?
  25. $Email->AddAddress("flavia@flaviajobs.com.br");
  26. // informando no email, o assunto da mensagem
  27. $Email->Subject = $assunto;
  28.  
  29. // Define o texto da mensagem (aceita HTML)
  30. $Email->Body .= "<B>E-mail enviado por usuário<BR></b>";
  31. $Email->Body .= "Mensagem do usuário: $msg<BR><BR>";
www.revistaphp.com.br


Feito o trecho principal acima, onde pegamos os dados, e formatamos o envio da mensagem, vamos concluir o script, fazendo o trecho que envia o email propriamente dito. Mais simples, impossível:

PHP
  1. // verifica se está tudo ok com oa parametros acima, se nao, avisa do erro. Se sim, envia.
  2. if(!$Email->Send())
  3.  
  4. {
  5.  
  6. echo "A mensagem não foi enviada. <p>";
  7. echo "Erro: " . $mail->ErrorInfo;
  8.  
  9. }
www.revistaphp.com.br

O que este Send faz, nada mais é, do que montar pra você o envio do email, através da função mail ou pelo sendmail da sua máquina (dependendo do que estava setado lá no começo), e enviando a mensagem.
Esta classe é bastante flexível. Para enviar um email com cópia oculta, adicione a linha:
PHP
  1. $Email->AddBcc("meu@segundoemail.com.br");
www.revistaphp.com.br

Se quiser enviar anexos (vou abordar em breve, o envio de anexos, através desta classe, aguarde.), através do formulário, vai utilizar o seguinte:
PHP
  1. $Email->AddAttachment();
www.revistaphp.com.br
Se ainda, quiser utilizar smtp para envio do email:
PHP
  1. // troque esta linha
  2. $Email->IsMail();
  3. // por esta
  4. $Email->SmtpSend();
www.revistaphp.com.br

Para o envio através de smtp, abra a classe, e na linha 460 (se vc não tirou créditos nem mexeu em nada..) e altere o seguinte:

PHP
  1. // mude aqui, o endereço do seu servidor, ou inclua uma classe de smtp, como indicado abaixo
  2. include_once($this->PluginDir . "class.smtp.php");
www.revistaphp.com.br


É isso. Espero que seja tão útil pra você, como é pra mim. Em breve irei mostrar como enviar anexos e enviar emails com outras opções através desta classe.
Dúvidas: me escrevam no fjferr@gmail.com ou postem aqui!

 

Opções de Interação

Comentários

Funcional 75%
Por: Winston, 15/06/2009   10:09:53
Muito bom este poste me ajudou muito

So que tem alguns email do gmail que nao estao recebendo
Funcionou 100%
Por: Anderson, 06/04/2009   17:56:20
Value! Estava precisando de enviar arquivo anexo do servidor e funcionou!! Essa classe é 10
Erro PHPMailer
Por: Cristiano, 24/05/2008   22:23:31
Ao enviar a mensagem utilizando este método recebo a seguinte mensagem de erro:
Mailer Error: Language string failed to load: instantiate.
Gostaria de ajuda, gostei do tutorial e gostaria muito de utilizar este método. Desde já agradeço.
Erro PHPMailer
Por: Sames, 04/04/2008   15:07:29
Boa tarde flávia, configurei o phpmailer para enviar email via smtp, e deu o seguinte erro:
Warning: Missing argument 1 for PHPMailer::SmtpSend(), called in /home/www/uniplac/PHPMailer_v2.0.0/test/enviaemail.php on line 10 and defined in /home/www/uniplac/PHPMailer_v2.0.0/test/class.phpmailer.php on line 500

Warning: Missing argument 2 for PHPMailer::SmtpSend(), called in /home/www/uniplac/PHPMailer_v2.0.0/test/enviaemail.php on line 10 and defined in /home/www/uniplac/PHPMailer_v2.0.0/test/class.phpmailer.php on line 500
Amensagem não foi enviada.
O que devo fazer para sanar esse erro?
Desde já agradeço.
Abração!!!
Sistema Operacional.
Por: Aguinaldo, 28/11/2007   12:59:40
Galera....
Essa classe não funciona no windows.
Alguem sabe uma forma de enviar e-mail do localhost com base no windows? Agradeço a ajuda.
Abraços
phpmailer
Por: Elson, 02/11/2007   14:41:18
Por gentileza!!
alguem me ajude..
testei a classe phpmailer.
não houve erros
No entanto não chegou nada na caixa postal de destino
Alguém pode me ajudar!!

Elson
Erro
Por: carla, 28/08/2007   08:28:22
Oi Flávia tudo bem? Utilizei o seu código para envio de mail mas está-me a dar os seguintes erros: Notice: Undefined variable: msg in E:\Projectos\Webserver\Root\dmasu\sendmail.php on line 33
A mensagem não foi enviada.

Erro: Language string failed to load: instantiate

será que me pode ajudar? o meu mail é carlarrj@gmail.com
Obrigada!
Erro
Por: Marcos, 21/05/2007   15:42:04
Oi Flávia. Olha só, parabéns pelo artigo, estou tentando fazer mas esta com algum erro, será que vc poderia me ajudar, preciso com urgencia deste recurso. Dê uma olha no erro acessando e preenchendo o form de contato. Quando clico em enviar esta aparecendo uma página dizendo que nao foi enviado. Veja em www.redeinfo.net/contato
Agradeço muito de vc puder me dizer onde estou errando.
Parabéns!!!
Por: Pedro César, 19/03/2007   21:57:01
Muito útil!!!
Parabéns pela clareza e didática.

Parabéns e obrigado.

Pedro César
Vc me ajuda?
Por: Hailton, 12/03/2007   11:39:09
Oi Flávia td bem? Bom em primeiro lugar te achei super linda e me parece uma pessoa legal. Bom mas não estou aqui para te azarar, sabe o que é? Já fazem quase 8 meses que estou querendo fazer um formulário para meu site ou para outros futuros e então o que acontece? Bom não tem o seu formulário? Eu gostaria que antes de aparecer a página obrigado.htm depois que o usuário enviasse os dados aparecesse a página confere.php com os dados que ele digitou e caso tivesse tudo certo envia e caso cotrário o usuário pd voltar a arrumar, vc me entendeu? Me ajuda ai por favor. Um abraço.