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.
Documentação: Envio de e-mail autenticado com o PHPMailer
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;
}