Enviando e-mail com o PHPMailer

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

Enviando form de um site via e-mail com o PHPMailer

Enviar email é tarefa universal na internet. Para facilitar a vida de todos vamos utilizar a classe PHPMailer para efetuar os envios.

Usando o PHPMailer

A maioria das vezes ao enviar e-mail (seja um form ou um arquivo anexado) usando a função do php mail() os mesmos vão para a pasta de spam ou a de lixo e ao usar a classe PHPMailer as chances são mínimas e o sucesso do envio/recebimento do e-mail é bem mais garantido.

Nesse artigo será feito um envio simples e direto no proximo será com autenticação segura e com anexos. Após efetuado o download, vamos a criação de um form simples em HTML (salve como nome que desejar) por exemplo:

 
<-!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<-html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br"><-form id="form1" name="form1" method="post" action="enviaemail.php" font-family: Arial, Helvetica, sans-serif;" onsubmit="return valida(this);">
     <-fieldset>
       <-label for="nome">Seu nome e sobrenome:
    <-input type="text" name="nome" id="nome" size="50" width: 434px; height: 21px;" onkeyup="document.title = this.value"/>
    <-br />
    <-label for="email">Seu e-mail:
    <-input type="text" name="email" id="email" size="50" width: 434px; height: 21px;" />
    <-br />
    <-label for="fone">Telefone de contato:
    <-input type="text" name="fone" id="fone" size="20"  maxlength="14" width: 107px; height: 21px;" />
    <-br />    
    <-label for="msg">Mensagem: 
    <-textarea name="msg" id="msg" rows="5" width: 437px;">
    <-br />
    <-label for="contato">Forma de Contato:
    <-input name="contato" id="contato" MARGIN-TOP: 3px; WIDTH: 20px; font-family: Arial, Helvetica, sans-serif;" type="radio" value="via telefone" />Telefone
    <-input name="contato" id="contato" WIDTH: 20px; font-family: Arial, Helvetica, sans-serif;" type="radio" value="via e-mail" checked="checked" />E-mail
    <-br />
    <-input name="autorizo" id="autorizo" WIDTH: 20px; font-family: Arial, Helvetica, sans-serif;" type="checkbox" value="Sim autorizo o envio" />
    <-span>Autorizo a enviar promoções e outros para meu e-mail
    <-br />   
    <-input type="submit" name="Submit" value="Enviar" class="initial2" />
    <-input type="reset" name="Clear" value="Limpar" class="initial1" />

Observe que o código PHP ficará separado do código HTML. Estamos usando o metodo Post (method="post") no form para repassar os dados para a páginaEmail.php (action="Email.php") que fará o serviço de enviar para o e-mail de destino:

require_once("class.phpmailer.php");
error_reporting(E_ALL);
error_reporting(E_STRICT);
date_default_timezone_set('America/Sao_Paulo');
$ip = getenv("REMOTE_ADDR");
// variáveis que guardam os dados vindo do form
$nomeusuario = utf8_decode($_POST['nome']);
$emailusuario = utf8_decode($_POST['email']);
$Fone = utf8_decode($_POST['fone']);
$mensagem = utf8_decode($_POST['msg']);
$contatos = utf8_decode($_POST['contato']);
$autorizos = utf8_decode($_POST['autorizo']);

$Email = new PHPMailer();
$Email->SetLanguage("br");
$Email->IsMail();
$Email->IsHTML(true);

$Email->From = $emailusuario;
$Email->FromName = $nomeusuario;
$Email->AddAddress("seu-email@com.br");
$Email->Subject = "Fale Conosco";
$Email->AddBcc($emailusuario);
 
$body = "<-html
<-body
<-table align=center border=1px
<-tr>
  <-td colspan=2 align=center>CONTATO
<-tr>
  <-td>Nome completo: <-td> ".$nomeusuario."
<-tr>
  <-td>E-mail atual: <-td> ".$emailusuario."
<-tr>
  <-td>Nº de contato: <-td>".$Fone."
<-tr>
  <-td>Autorizo newsletter: <-td> ".$autorizos."
<-tr>
  <-td>Forma de contato: <-td> ".$contatos."
<-tr>
  <-td>Mensagem: <-td> ".$mensagem."

$Email->MsgHTML($body); 
$Email->AltBody = "Para conseguir essa e-mail corretamente, use um visualizador de e-mail com suporte a HTML";
$Email->WordWrap = 50;
            
if(!$Email->Send()) {
  echo A mensagem não foi enviada.";
  echo Mensagem de erro: " . $Email->ErrorInfo;
} else {
  echo "Mensagem enviada!";
}


?>

Agora algumas explicações sobre o código:

Chamada da classe phpmailer no arquivo PHP, localização do arquivo da classe baixada: require_once("class.phpmailer.php"); Pode-se salvas as classes que foram baixadas em qualquer lugar bastando indicar entras aspas o caminho da pasta onde se encontra. Sendo necessário depois fazer a referência (instanciamento) a classe: $Email = new PHPMailer(); Define quais erros serão reportados em tempo de execução: error_reporting(E_STRICT); Permite ao PHP sugerir mudanças no código as quais irão assegurar melhor interoperabilidade e compatibilidade futura. Habilitará todos os tipos de mensagens, exceto mensagens E_STRICT. Esta chamada diz que o envio será feito através da função mail do php. Pode ser mudada para sendmail, qmail, etc. Se quiser pode utilizar também o programa de email do seu Unix/Linux para enviar: $Email->IsMail(); Ativa o envio de e-mails no formato HTML, se false, desativa: $Email->IsHTML(true);

Nesse caso a variavel body receberá a página com as tags HTML de uma tabelae o conteúdo das variáveis em PHP:

$body = "<-html
<-body
<-table align=center border=1px
<-tr>
  <-td colspan=2 align=center>CONTATO
<-tr>
  <-td>Nome completo: <-td> ".$nomeusuario."
<-tr>
  <-td>E-mail atual: <-td> ".$emailusuario."
<-tr>
  <-td>Nº de contato: <-td>".$Fone."
<-tr>
  <-td>Autorizo newsletter: <-td> ".$autorizos."
<-tr>
  <-td>Forma de contato: <-td> ".$contatos."
<-tr>
  <-td>Mensagem: <-td> ".$mensagem."
5. Na parte final do arquivo PHP, será verificado se o e-mail foi enviado com sucesso. Caso mal sucedido será informado o erro:
if(!$Email->Send()) {
  echo A mensagem não foi enviada.";
  echo Mensagem de erro: " . $Email->ErrorInfo;
} else {
  echo "Mensagem enviada!";
}

6. É usado uma máscara p/ o nº do telefone na hora da digitação, com parenteses e hifen ex. (XX) XXX-XXX:
Ponha o código JavaScript na HEAD:

function mascara(o,f){


    v_obj=o
    v_fun=f
    setTimeout("execmascara()",1)
}
function execmascara(){
    v_obj.value=v_fun(v_obj.value)
}
function leech(v){
    v=v.replace(/o/gi,"0")
    v=v.replace(/i/gi,"1")
    v=v.replace(/z/gi,"2")
    v=v.replace(/e/gi,"3")
    v=v.replace(/a/gi,"4")
    v=v.replace(/s/gi,"5")
    v=v.replace(/t/gi,"7")
    return v
}
function soNumeros(v){
    return v.replace(/\D/g,"")
}
function telefone(v){
    v=v.replace(/\D/g,"")                 //Remove tudo o que não é dígito
    v=v.replace(/^(\d\d)(\d)/g,"($1) $2") //Coloca parênteses em volta dos dois primeiros dígitos
    v=v.replace(/(\d{4})(\d)/,"$1-$2")    //Coloca hífen entre o quarto e o quinto dígitos
    return v
}

E no Form ponha no Inputdo telefone:

onkeypress="mascara(this,telefone)" onfocus="this.style.backgroundColor='#FFFFCC'; this.style.border='2px solid #FF9933'" onblur="this.style.backgroundColor='#CCCCCC'; this.style.border='2px solid #000000'"

7. Se quiser deixar o form mais bonito com efeitos básicos em CSS, ai vai, mudança de cor de fundo e de borda ao clicar nas caixas de texto:

input type="text" name="nome" id="nome" onfocus="this.style.backgroundColor='#FFFFCC'; this.style.border='2px solid #FF9933'" onblur="this.style.backgroundColor='#CCCCCC'; this.style.border='2px solid #000000'" onkeyup="document.title = this.value"

8. A tag label faz com que ao ser clicado no texto acima das caixas de texto o cursor do mouse seja direcionado p/ a caixa apropriada/relacionada:

Seu nome e sobrenome: <-label for="nome">Seu nome e sobrenome:

9. A sigla UTF-8 permite que os acentos do idioma português sejam reconhecido corretamente:


<-meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
<-meta http-equiv="Content-Language" content="pt-br" >
$nomeusuario = utf8_decode($_POST[''nome'']);

10. Guarda o número do IP do usuário que está enviando o e-mail.

$ip = getenv("REMOTE_ADDR");

PHPMailer com autenticação SMTP

Veremos o envio de e-mail com autenticação SMTP, alguns servidores de e-mails como o Gmail são obrigatórios o seu uso.

error_reporting(E_STRICT);
require_once("class.phpmailer.php");
require_once("class.smtp.php");
date_default_timezone_set('America/Sao_Paulo');
$Email = new PHPMailer();
$Email->SetLanguage("br");
$Email->IsMail();
$Email->IsHTML(true);

$Email->From = $emailusuario;
$Email->FromName = $nomeusuario;
$Email->AddAddress("seu-email@com.br", "Elias Lopes");
$Email->Subject = "Teste de form fale conosco via Gmail";
$Email->AddBcc($emailusuario);
$Email->AddReplyTo("etc@gmail.com","First Last");
$exibir_apos_envio='../resposta.htm';

//SMTP
$Email->IsSMTP();
$Email->SMTPAuth = true;
$Email->SMTPSecure = "ssl";
$Email->Host = "smtp.gmail.com";
$Email->Port = 465;

//Gmail server
$mail->Username = "seu-email@com.br"; // Gmail login
$mail->Password = "sua-senha"; // Gmail senha

$body = "<-html

<-body<-table align=center border=1px
<-tr>
  <-td colspan=2 align=center>CONTATO
<-tr>
  <-td>Nome completo: <-td> ".$nomeusuario."
<-tr>
  <-td>E-mail atual: <-td> ".$emailusuario."
<-tr>
  <-td>Nº de contato: <-td>".$Fone."
<-tr>
  <-td>Autorizo newsletter: <-td> ".$autorizos."
<-tr>
  <-td>Forma de contato: <-td> ".$contatos."
<-tr>
  <-td>Mensagem: <-td> ".$mensagem."$Email->AltBody = "Para conseguir essa e-mail corretamente, use um visualizador de e-mail com suporte a HTML";
$Email->WordWrap = 50;
$Email->MsgHTML($body);

if(!$Email->Send()) {
  echo A mensagem não foi enviada.";
  echo Mensagem de erro: " . $Email->ErrorInfo;
} else {
  echo "Mensagem enviada!";
}window.location='$exibir_apos_envio'";
}

?>

Agora algumas explicações sobre o código:
1. O SMTP do Gmail não usa a porta 25 e sim a 465 ou 587 para o SMTP e995 para o POP3, e além disso, deve utilizar o protocolo de criptografia SSL/TLS. O Gmail não aceita conexões não criptografadas assim como o Hotmail.
No caso do Hotmail as portas de envio e recebimento são: 25 para SMTP e 995 para POP3.

$Email->IsSMTP();
$Email->SMTPAuth = true;
$Email->SMTPSecure = "ssl";
$Email->Host = "smtp.gmail.com";
$Email->Port = 465;

2. É necessário liberar antes na conta do Gmail o acesso SMTP e POP3 em configurações (http://mail.google.com/support/bin/answer.py?answer=13287).

3. Dessa vez queremos chamar uma página em HTML após o envio do e-mail, usando a função window.location do JavaScript:

if(!$Email->Send()) {
  echo A mensagem não foi enviada.";
  echo Mensagem de erro: " . $Email->ErrorInfo;
} else {
  echo "window.location='$exibir_apos_envio'";
}

4. Caso seja retornado o seguinte erro:Language string failed to load: instantiate
O problema acontece em servidores IIS para o sistema Windows, devido uma diferença entre o Windows e o Linux na hora de interpretar os Header (cabeçalhos).
Para solucionar basta editar o arquivo class.phpmailer.php substituindo o código:

//**
* Formats an address correctly.
* @access private
* @return string
*/
function AddrFormat($addr) 
{
   if(empty($addr[1]))
    $formatted = $addr[0];
  else
  {
    $formatted = $this->EncodeHeader($addr[1], ‘phrase’) . ”     $addr[0] . “>”;
  }
  return $formatted;
}

Por esse:

/**
* Formats an address correctly.
* @access private
* @return string
*/
function AddrFormat($addr) 
{
   $formatted = $addr[0];
   return $formatted;
}

Até a próxima.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?