Enviar e-mail é 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 próximo 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 método 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 e-mail 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 variável 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."

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!";
}

É 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'"

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"

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:

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'']);

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:

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;

É necessário liberar antes na conta do Gmail o acesso SMTP e POP3 em configurações do (Gmail).

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'";
}

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;
}