Pular para o conteúdo

PHPMailer - Validação de campos, e-mail e domínio para formulário de contato e envio

Dica publicada em Linux / Introdução
Flavio dos Santos acharnobairro
Hits: 9.139 Categoria: Linux Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

PHPMailer - Validação de campos, e-mail e domínio para formulário de contato e envio

Aprendo muito com as dicas e ensinamentos que muitos colocam na internet. Me esforço em aprender programação, procurando por aquilo que posso adaptar e implantar em meu site.

Achei muitos formulários de contato mas, sem as validações que eu desejei, então, estudando cada dica que muitos oferecem, fiz meu Formulário de Contato que pode anexar arquivo e envia-lo via PhpMailer com autenticação.

Um formulário de entrada de Contato

<form name="contato" id="todoform" onSubmit="return validar(this)" method="post" action="validacontato.php" enctype="multipart/form-data" />
<br>
<br>
<table width="100%" border="0" align="center">

<tr>
<td width="30px"> <div align="right"><span class="texto">Nome : </span></div> </td>
<td ><input type="text" id="nome" size="55" name="nome" placeholder=" Nome" onfocus="this.style.backgroundColor='#FFFFCC';" onBlur = "vernome(this);" /> </td>
</tr>

<tr>
<td width="30px"> <div align="right" class="texto">Seu E-mail : </div> </td>
<td width="67%"><input type="text" class="email" id="email" size="55" name="email" placeholder=" Email valido" onfocus="this.style.backgroundColor='#FFFFCC';" onBlur="veremail(this);"/></td>
</tr>

<tr>
<td >&nbsp;</td>
<td>&nbsp;</td>
</tr>

<tr>
<td width="30px" > <div align="right" class="texto">Assunto : </div> </td>
<td > <input type="text" id="assunto" size="55" name="assunto" placeholder=" Assunto" onfocus="this.style.backgroundColor='#FFFFCC';" onBlur="verassunto(this);"/> </td>
</tr>

<tr>
<td width="30px"><div align="right" class="texto">Mensagem: </div></td>
<td ><textarea cols="60" id="mensagem" rows="5" name="mensagem" placeholder=" Mensagem" onfocus="this.style.backgroundColor='#FFFFCC';" onBlur="vermensagem(this);" onkeyup="mostrarResultado(this.value,140,'spcontando');contarCaracteres(this.value,140,'sprestante')"></textarea><br />
<span id="spcontando" style="font-family:Georgia;">Digite sua mensagem.</span>
<span id="sprestante" style="font-family:Georgia;"></span>
</td>
</tr>

<tr>
<td width="30px"><div align="right" class="texto">Anexo: </div></td>
<td ><input name="arquivo" id="arquivo" type="file" /></td>
<!-- <td ><input name="anexo" id="anexo" type="file" /></td> -->
</tr>

<tr>
<td>&nbsp; </td>
<td > <input type="submit" name="enviarFormulario" value="Enviar" /></td>
</tr>
</table>
</form>

Comentário: é muito ruim um usuário preencher todos os campos para depois se fazer as validações, retornando-o para as correções, por isso coloquei onBlur em cada campo para avisar de seu preenchimento correto.

Validações dos Campos (lado do usuário)

<script language="javascript" type="text/javascript">
function vernome(){
var nome = contato.nome.value;
if (nome == "" || nome.length <1) {
alert("O campo nome deve ter acima de 3 caracteres.");
nome.focus();
return (false);
}
}

function veremail() {
var email = contato.email.value;
if (email == "" || email.indexOf('@')==-1 || email.indexOf('.')==-1){
alert("Campo email invalido");
email.focus();
return (false);
}
}

function verassunto() {
var assunto = contato.assunto.value;
if (assunto == "" || assunto.length < 1) {
alert("Preencher O campo assunto !!!");
assunto.focus();
return (false);
}
}

function vermensagem() {
var mensagem = contato.mensagem.value;
if (mensagem == "" || mensagem.length < 1) {
alert("Preencher O campo mensagem !!!");
mensagem.focus();
return (false);
}
}

// Contador de Caracteres na Textarea
// do site: http://blog.vilourenco.com.br/javascript-contado-e-limitando-caracteres-em-um-textarea/

function mostrarResultado(box,num_max,mensagemspan){
var contagem_carac = box.length;
if (contagem_carac != 0){
document.getElementById(mensagemspan).innerHTML = contagem_carac + " caracteres digitados.";
if (contagem_carac == 1){
document.getElementById(mensagemspan).innerHTML = contagem_carac + " caracter digitado.";
}
if (contagem_carac >= num_max){
document.getElementById(mensagemspan).innerHTML = "Limite de caracteres excedido!";
}
}else{
document.getElementById(mensagemspan).innerHTML = "Digite sua mensagem.";
}
}

function contarCaracteres(box,valor,mensagemspan){
var conta = valor - box.length;
document.getElementById(mensagemspan).innerHTML = "Você pode digitar " + conta + " caracteres.";
if(box.length >= valor){
document.getElementById(mensagemspan).innerHTML = "Opss.. você não pode mais digitar..";
document.getElementById("mensagem").value = document.getElementById("mensagem").value.substr(0,valor);
}
}

function validar(){
var nome = contato.nome.value;
var email = contato.email.value;
var assunto = contato.assunto.value;
var mensagem = document.getElementById("mensagem").value;

if(nome == "" || email == "" || assunto == "" || mensagem == "") {
alert ("Há algum campo vazio.");
nome.focus();
return (false);
}
}

</script>

Validações dos Campos (lado do servidor)

Arquivo: "validacontato.php"

<?php
// --------------------------------------- RECEBE os dados enviados pelo formulario
// evitar email injection
function clean_string($string) {
$bad = array(
"content-type",
"bcc:",
"to:",
"cc:",
"href"
);
return str_replace($bad, "", $string);
}
$nome = clean_string($_POST['nome']);
$email = clean_string($_POST['email']);
$nome = strip_tags(trim($_POST["nome"])); // tira espaços e instruções HTML ou PHP
$email = strip_tags(trim($_POST["email"]));
$assunto = strip_tags(trim($_POST["assunto"]));
$empresa = strip_tags(trim($_POST["empresa"]));
$mensagem = strip_tags(trim($_POST["mensagem"]));
$email_from = "contato@acharnobairro.com.br";
$refresh = '<meta http-equiv="refresh" content="1; url=teste.php" />';
$arquivo = $_FILES["arquivo"];
$tamanho = 512000; // 512 Kb para tamanho maximo de aceite de arquivo enviado pelo cliente

// EXTENSÕES DE SERVIDORES NO BRASIL

$ext = array('.adm.br'=>'.adm.br','.adv.br'=>'.adv.br','.arq.br'=>'.arq.br','.agr.br'=>'.agr.br','.am.br'=>'.am.br','.art.br'=>'.art.br','.ato.br'=>'.ato.br','.bio.br'=>'.bio.br','.biz.br'=>'.biz.br','.bmd.br'=>'.bmd.br','.blog.br'=>'.blog.br','.br'=>'.br','.cim.br'=>'.cim.br','.com'=>'.com','.com.br'=>'.com.br','.cng.br'=>'.cng.br','.cnt.br'=>'.cnt.br','.coop.br'=>'.coop.br','.cri.br'=>'.cri.br','.def.br'=>'.def.br','.ecn.br'=>'.ecn.br','.eco.br'=>'.eco.br','.edu.br'=>'.edu.br','.eng.br'=>'.eng.br','.emp.br'=>'.emp.br','.eti.br'=>'.eti.br','.esp.br'=>'.esp.br','.etc.br'=>'.etc.br','.far.br'=>'.far.br','.fnd.br'=>'.fnd.br','.fot.br'=>'.fot.br','.fst.br'=>'.fst.br','.fm.br'=>'.fm.br','.flog.br'=>'.flog.br','.ggf.br'=>'.ggf.br','.g12.br'=>'.g12.br','.gov'=>'.gov','.gov.br'=>'.gov.br','.imb.br'=>'.imb.br','.ind.br'=>'.ind.br','.inf.br'=>'.inf.br','.info.br'=>'.info.br','.jor.br'=>'.jor.br','.jus.br'=>'.jus.br','.lel.br'=>'.lel.br','.leg.br'=>'.leg.br','.mat.br'=>'.mat.br','.med.br'=>'.med.br','.mil.br'=>'.mil.br','.mp.br'=>'.mp.br','.mus.br'=>'.mus.br','.nom.br'=>'.nom.br','.not.br'=>'.not.br','.ntr.br'=>'.ntr.br','.odo.br'=>'.odo.br','.org'=>'.org','.org.br'=>'.org.br','.ppg.br'=>'.ppg.br','.pro.br'=>'.pro.br','.psc.br'=>'.psc.br','.psi.br'=>'.psi.br','.qsl.br'=>'.qsl.br','.radio.br'=>'.radio.br','.rec.br'=>'.rec.br','.slg.br'=>'.slg.br','.taxi.br'=>'.taxi.br','.teo.br'=>'.teo.br','.tmp.br'=>'.tmp.br','.trd.br'=>'.trd.br','.tur.br'=>'.tur.br','.tv'=>'.tv','.tv.br'=>'.tv.br','.wiki.br'=>'.wiki.br','.vet.br'=>'.vet.br','.vlog.br'=>'.vlog.br','.zlg.br'=>'.zlg.br');

// estas extensões foram tiradas da lista acima para facilitar o bloqueio de muitos SPAM pois, se não estiverem nela o filtro acusa: '.net'=>'.net','.net.br'=>'.net.br','.srv.br'=>'.srv.br',
// -----------------------------------------------------------------------------------------------------------------------------------

// Lista de emails não desejados
// cada linha pode conter muitos emails mas, para facilitar a manutenção, colocar uma quantidade que não dificulte.
// a cada linha um numero de diferenciação deve ser colocado e na ultima linha colocar todas as acrescentadas
$emailnao0 = array('parateste@naopode.com','outroemail@separadoporvirgula.srv.br');
$emailnao1 = array('linha1@provedor.srv.br','maisum@provedor.com');
$emailnao2 = array('linha2@xxxx.net.br','outro@xxx.net.br');
$emailnao3 = array('linha3@spamer.site','snd@spamer.site');
$emailnao4 = array('linha4@spamer.com.br','spamer@weboferta.srv.br');
$emailnao = array_merge($emailnao0, $emailnao1,$emailnao2,$emailnao3,$emailnao4);
// -----------------------------------------------------------------------------------------------------------------------------------

// Lista de dominios não desejados
// Não colocar o WWW, só o restante do dominio
$dominionao0 = array('naopode.com','a.bras1.net.br','c.bras1.net.br','g.net10.net.br','i.bras1.net.br','k.mdz10.net.br','x.mdz10.net.br','z.mdz10.net.br','h.negociobom.site');
$dominionao1 = array('r.negociobom.site','t.negociobom.site','topbases.com.br');
$dominionao2 = array('weboferta.srv.br','webofertas.net.br');
$dominionao3 = array('idcx.com.br');
$dominios = array_merge($dominionao0, $dominionao1,$dominionao2,$dominionao3);
// ----------------------------------------------------------------------------------------------------------------

// analisa os dados novamente caso o Javascript esteja desativado, será validado aqui.
if (empty($_POST["nome"])) {
echo "<script>alert('Nome Obrigatório')</script>";
//echo "<meta HTTP-EQUIV='refresh' CONTENT='0;URL=validaform.php'>";
echo "<script>history.go(-1);</script>";
exit;
}

if ($email=="") {
echo "<script>alert('Email Obrigatório')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "<script>alert('Email: só letras, sem acentos, sem espaços.')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

if(strlen($email)>40){
echo "<script> alert ('Email até 40 caracteres, volte')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

if (!preg_match("/^[0-9a-z\_\.\-]+\@[0-9a-z\_\.\-]*[0-9a-z\_\-\.]+[a-z]{2,3}$/i",$email)){
echo "<script>alert('Email: Acentos ou simbolos não permitidos.')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

// analisa email, procura na lista dos Não Desejados
if( $key = array_search("$email", $emailnao) ){
echo "<script>alert('EMAIL NÃO PERMITIDO')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

// analisa dominio, procura na lista de Dominios Não Desejados
$dominio = substr(strrchr($email, "@"), 1); //Usando STRRCHR, mostra tudo depois do @
foreach ($dominios as $key => $value) {
if ($value == $dominio) {echo "<script>alert('DOMINIO NÃO PERMITIDO')</script>";
echo "<script>history.go(-1);</script>";
exit;
}
}

// ------------------------------------------------ encontrar extensão do email
$prov = substr($dominio,-9,9); // conta os caracteres a partir da primeira posição(pode ser negativa), tantos caracteres indicados.
$servidor = stristr($dominio, '.'); // Retorna tudo da string apartir da primeira ocorrência do que procura até o final.

if (!isset($ext[$servidor])) { echo "<script>alert('Extensão inválida')</script>";
echo "<script>history.go(-1);</script>"; }

if ($assunto=="") {
echo "<script>alert('Assunto obrigatorio')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

if ($mensagem == "") {
echo "<script>alert('Mensagem obrigatorio')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

if ($arquivo['size'] > $tamanho) {
echo "<script>alert('O tamanho máximo é 500 Kb')</script>";
echo "<script>history.go(-1);</script>";
exit;
}

// -----------------------------------------------------------------------------------------------------------------------------------
// instruções da UOL: http://www.uolhost.uol.com.br/faq/hospedagem/como-enviar-mensagens-com-php-por-autenticacao-smtp.html#rmcl

/* apenas dispara o envio do formulário caso exista $_POST['enviarFormulario']*/
if (isset($_POST['enviarFormulario'])){

/*** INÍCIO - DADOS A SEREM ALTERADOS DE ACORDO COM SUAS CONFIGURAÇÕES DE E-MAIL, fornecido pelo hospedeiro***/
$enviaFormularioParaNome = 'destinatario';
$enviaFormularioParaEmail = 'contato@acharnobairro.com.br';
$caixaPostalServidorNome = 'destinatario';
$caixaPostalServidorEmail = 'contato@acharnobairro.com.br';
$caixaPostalServidorSenha = 'senha';
/*** FIM - DADOS A SEREM ALTERADOS DE ACORDO COM SUAS CONFIGURAÇÕES DE E-MAIL ***/

/* abaixo as veriaveis principais, que devem conter em seu formulario*/
$remetenteNome = $_POST['nome'];
$remetenteEmail = $_POST['email'];
$assunto = $_POST['assunto'];
$mensagem = $_POST['mensagem'];
$arquivo = $_FILES["arquivo"];

// estas 3 linhas abaixo são opcionais
$remetente->ip = $_SERVER['REMOTE_ADDR'];
$remetente->browser = $_SERVER['HTTP_USER_AGENT'];
$remetente->datatime = date('d/m/Y - H:i');

// body
$mensagemConcatenada = 'Email via website'.'<br/>';
$mensagemConcatenada .= '-------------------------------<br/>';
$mensagemConcatenada .= 'Nome: '.$nome.'<br/>';
$mensagemConcatenada .= 'E-mail: '.$email.'<br/>';
$mensagemConcatenada .= 'Assunto: '.$assunto.'<br/>';
$mensagemConcatenada .= '-------------------------------<br/>';
$mensagemConcatenada .= "IP: " . $remetente->ip . "<br />\n"; // opcional
$mensagemConcatenada .= "Data/Hora: " . $remetente->datatime . "<br />\n"; // opcional
$mensagemConcatenada .= "Navegador: " . $remetente->browser . "<br />\n"; // opcional
$mensagemConcatenada .= '-------------------------------<br/>';
$mensagemConcatenada .= 'Arquivo anexado: "'.$arquivo['name'].'"<br/>';
$mensagemConcatenada .= '-------------------------------<br/><br/>';
$mensagemConcatenada .= 'Mensagem: "'.$mensagem.'"<br/>';

/*********************************** A PARTIR DAQUI NAO ALTERAR ************************************/
// require_once('PHPMailer-master/PHPMailerAutoload.php'); (original da UOL, não funciona, dá erro, diz que não encontra o diretorio.)
require_once 'PHPMailer-master/PHPMailerAutoload.php'; // assim funciona. dica de http://pt.stackoverflow.com/questions/15286/o-que-usar-require-include-require-once-include-once
//require_once(dirname(index.php) ."/PHPMailer-master/PHPMailerAutoload.php"); // para uso em localhost

$mail = new PHPMailer();
// headers
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Charset = 'utf8_decode()';
$mail->Host = 'smtp.'.substr(strstr($caixaPostalServidorEmail, '@'), 1);
$mail->Port = '587';
$mail->Username = $caixaPostalServidorEmail;
$mail->Password = $caixaPostalServidorSenha;
$mail->From = $caixaPostalServidorEmail;
$mail->FromName = utf8_decode($caixaPostalServidorNome);
$mail->IsHTML(true);
$mail->Subject = utf8_decode($assunto);
$mail->Body = utf8_decode($mensagemConcatenada);
$mail->AddAddress($enviaFormularioParaEmail,utf8_decode($enviaFormularioParaNome));

// anexar arquivo dica de http://www.linhadecomando.com/php/php-usando-phpmailer-para-envio-de-email-com-anexo
// $mail->AddAddress($enviaFormularioParaEmail,utf8_decode($enviaFormularioParaNome)); // da UOL
$mail->AddAttachment($arquivo['tmp_name'], $arquivo['name'] );
/*
if(!$mail->Send()){
$mensagemRetorno = '$nome, Erro ao enviar Email: '. print($mail->ErrorInfo);
echo $mensagemRetorno;
// colocar script de aviso e pausa para leitura, ao clicar no script, dará refresh
//echo "<meta http-equiv='refresh' content='2;URL=contato.php'>";
}else{
$mensagemRetorno = '$nome, Email enviado com sucesso!';
echo $mensagemRetorno;
}
*/

if($mail->Send()){
//$mensagemRetorno = '$nome, Erro ao enviar Email: '. print($mail->ErrorInfo);
// busca uma página criada com agradecimentos ou informações de breve contato
include("emailcerto.php");}
}
?>

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Tabela sem Table, só com CSS

Laptop sem wi-fi no roteador SAGEMCOM da Vivo Fibra [Resolvido]

Tabela sem Table, só com CSS

A importância de validações no lado do servidor

Horde Webmail: Corrigindo erro de tradução

Como fazer aparecer a logomarca da sua empresa no lugar das propagandas do MSN

Reproduzir arquivos MP3 no Python

M.A.M.E

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.