Enviando e-mail com o PHPMailer

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

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)(\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; }

Artigos relacionados