Formulário de E-mail em PHP com Captcha e Validação

Download e apresentação de Freeware, OpenSource, Demo's e códigos de sistemas.
Regras do fórum
Atenção:
Clique para ver:
Para iniciar tópicos nesta seção é importante ler: Regras > Downloads.

Disclaimer:
O objetivo desta seção é indexar links para downloads que já estão disponíveis na internet, ou links que vocês criaram sob absoluta responsabilidade de vocês.

Recomendamos que observem se os códigos são Freeware, OpenSource ou pagos. Na última opção recomendados que após testar apaguem todos os releases em menos de 24 horas e comprem os produtos originais.

Este fórum não se responsabiliza por danos causados por arquivos contidos nesta seção, bem como por danos causados à terceiros devido ao download destes arquivos, sejam danos materiais, morais e/ou intelectuais.

Somente concordando com estar regras você deve acessar os tópicos desta seção.

Formulário de E-mail em PHP com Captcha e Validação

Mensagempor forumaberto » Qui Set 16, 2010 1:05 am

Saudações Amigo,

Em primeiro lugar vou lembrando que não sou programador. Sou obrigado a "rabiscar" quando o desejo ou necessidade me impelem e não consigo algo pronto que funcione ou alguém que possa fazer por mim.
E este foi o caso pois há tempos procuro formulários de envio de e-mail usando php que sejam simples mas atendam às mínimas necessidades.
Lógico que não queria um serviço de terceiros para fazer propaganda.
Então quando o tempo deixa acabo por chegar a alguns resultados mas é preciso depois algumas correções para funcionar.

Vamos às características:

    • Possibilidade de inserir em qualquer página
    • Utilizar a função mail do php para envio
    • Envio de resposta imediata
    • Validação do e-mail para evitar Spam
    • Validação campos evitando mensagens em branco
    • Utilização de Captcha simples para evitar robot's
    • Confirmação imediata de envio
    • Alertas sobre erros que causem falha de envio
    • Informação do IP de envio para bloqueio caso haja Spam
    • Retorno à uma página determinada
    • Não é adequado para uso simultâneo

Por questão de organização recomendo a montar uma estrutura dentro de uma pasta separada que pode ser nomeada como "contato". Nesta pasta vamos ter os seguintes arquivos:

    • form.htm
    • captcha.php
    • captcha.png
    • fonte.gdf
    • envia_contato.php

Atenção: É importante estar habilitada a extensão GD2 para o PHP no servidor. Mas geralmente ela não é bloqueada. Ao trabalho:

Formulário (form.htm):

A página com o formulário de envio pode estar localizada na pasta, mas se estiver fora basta alterar o "action" indicando o caminho do arquivo "envia_contato.php".

Eis o exemplo do formulário a ser inserido em uma página .htm:

<!-- Formulário a inserir na página de envio .htm
Desenvolvido por: @forumaberto Silva | www.forumaberto.com
Correções: Norivan Oliveira | www.brservidor.com
Arquivos: envia_contato.php, captcha.php, form.htm
Data: 15/09/2010
-->

<!-- Lembre de alterar a localização da imagem (img src="captcha.php")
Altere o (action) do form se o formulario estiver em outra pasta
-->

<form id="form1" name="form1" method="post" action="enviar_contato.php">

<table width="500" border="2" cellspacing="5" cellpadding="8">
<tr>
<td>Nome:</td>
<td><input name="nome" type="text" id="nome" size='40' /></td>
</tr>
<tr>
<td>Assunto:</td>
<td><input name="subject" type="text" id="subject" size='40' /></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><input name="email" type="text" id="email" size='40' /></td>
</tr>
<tr>
<td>Mensagem:</td>
<td><textarea name="mensagem" cols="60" rows="15" id="mensagem"></textarea></td>
</tr>
<tr>
<td>Captcha:</td>
<td><img src="http://forumaberto.com/captcha.php" width="233" height="49"></td>
</tr>
<tr>
<td>Copie:</td>
<td> <input name='user_code' type='text' size='40' value='Insira o valor Captcha' /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="Enviar Contato" /></td>
</tr>
</table>
</form>

<!-- Fim do Formulário de Envio-->


No pacote para download irei inserir uma página completa. Mas recomendo que use este código no com o layout das páginas de seu site.


Captcha.php

Este arquivo é que irá gerar a imagem a ser exibida no formulário acima, gerando também o código da captcha. Além disto ele é o responsável por iniciar a seção que armazena os dados a serem digitados no formulário.

Na criação da captcha optei por basear em uma imagem (no meu caso PNG) mas lembro que podemos gerar esta imagem com um arquivo PHP. Caso queiram eu mostro um exemplo que testei aqui (visual.php).

Tentei deixar tudo que é possível alterar bem explicado em comentários, assim como um passo-a-passo de tudo que será feito. Quem sabe ajuda a compreensão e melhorias?

<?php


/* Formulário de envio de email com Captcha MD5 em sessão e Resposta Automática
* Desenvolvido por: @forumaberto Silva | www.forumaberto.com
* Correções: Norivan Oliveira | www.brservidor.com
* Fontes de pesquisa: Kiran Paul V.J., Moacir Selínger, Gabriel Pinheiro
* Arquivos: envia_contato.php, captcha.php, form.htm
* Data: 15/09/2010
*/

// Abre a sessão

session_start();

// Informamos o header como image/png informando que contem dados de IMAGEM em PNG
// Pode-se usar outros formatos como jpeg, gif, bmp no resultado

header("Content-type: image/png");

// Criamos a variável de imagem com base no arquivo inserido na pasta
// Altere aqui o nome e extensão de acordo com sua imagem escolhida, exemplos no Forum Aberto
// Para usar outro formato de imagem na base altere também a extensão "png" nos dois locais

$imagemCaptcha = imagecreatefrompng("captcha.png")

// Informamos caso falhe a inicialização da imagem

or die("Falha na imagem!");

// Selecionamos a fonte inserida na pasta e carregamos
// Utilize fontes GD, de acordo com sua imagem, exemplos no Forum Aberto

$fonteCaptcha = imageloadfont("anonymous.gdf");

// Criamos o texto do código captcha com MD5
// Altere como quiser respeitando o tamanho da fonte versus tamanho da imagem

$textoCaptcha = substr(md5(uniqid('')),-5,5);

// Armazenamos o texto numa sessão nomeada session_textoCaptcha
// Isto será usado na página enviar_contato.php

$_SESSION['session_textoCaptcha'] = $textoCaptcha;

// Informamos a cor para o texto segundo a imagem

$corCaptcha = imagecolorallocate($imagemCaptcha,0,0,0);

// Impriminos o texto na cor escolhida determinando o posicionamento
// Altere os valores segundo sua fonte versus sua imagem

imagestring($imagemCaptcha,$fonteCaptcha,6,6,$textoCaptcha,$corCaptcha);

// Mostramos a imagem gerada, neste caso em PNG
// Lembre que pode usar outros formatos para ser visualizado como imagejpeg, imagegif, imagewbmp

imagepng($imagemCaptcha);

// Apagamos a imagem para liberar o espaço no servidor

imagedestroy($imagemCaptcha);


// A chamada da imagem deve ser feita com este código no formulário
// <img src="http://forumaberto.com/captcha.php" width="233" height="49">
// Altere de acordo com seu site

// Divirta-se, mas lembre de informar a fonte !!!

?>


• A quantidade de caractere utilizados do MD5 pode ser determinada junto à variável $textoCaptcha, de acordo com sua imagem. Neste caso usei 5.
• O posicionamento do texto na imagem pode ser alterado junto ao imagestring.
• Caso queria alterar o formato da imagem de saída do arquivo você deve mudar o valor imagepng, lembrando de alterar o header (Content-type: image/png). Você pode usar imagejpeg, imagegif, imagewbmp...


Captcha.png

A imagem de base que utilizei foi PNG (captcha.png) mas isto pode ser alterado como mostro nos comentários. É importante lembrar de alterar a extensão junto à variável $imagemCaptcha no arquivo captcha.php.
Coloquei alguns fundos base no pacote, mas você pode criar o seu, exemplos:

FA Thumbnail | FA Thumbnail | FA Thumbnail


Fonte.gdf

O PHP me parece se dar melhor com fontes GD, então a opção fica a seu critério qual escolher. Hoje é fácil encontrar fontes GD por um buscador ou converter fontes TTF em GD.
No pacote colocarei algumas fontes GD como a anonymous.gdf , podendo ser modificado junto à variável $fonteCaptcha no arquivo captcha.php.


Envia_contato.php

Este é o arquivo que vai realmente validar e enviar os e-mail's. Procurei ser bem claro nos comentários porque algumas alterações devem ser feitas (!) para que funcione no seu site. Tudo é mostrado explicado em um passo a passo para que você entenda o que está sendo feito:

<?php

/* Formulário de envio de email com Captcha MD5 em sessão e Resposta Automática
* Desenvolvido por: @forumaberto Silva | www.forumaberto.com
* Correções: Norivan Oliveira | www.brservidor.com
* Fontes de pesquisa: Kiran Paul V.J., Moacir Selínger, Gabriel Pinheiro
* Arquivos: envia_contato.php, captcha.php, form.htm
* Data: 15/09/2010
*/

// Abre a sessão

session_start();

// Iniciamos chamando a função de validação de email. Verificamos o campo segundo algumas constantes comuns

function validaEMAIL($email){
$mail_correcto = 0;
// Verificando a quantidade de caracteres e a inserção correta do arroba - altere como desejar
if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@")){
if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) {
// Verificando se tem caracter . (ponto)
if (substr_count($email,".")>= 1){
// Obtemos aqui a terminação do dominio
$term_dom = substr(strrchr ($email, '.'),1);
// Verificando se a terminação do dominio está correcta
if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){
// Verificando se o que está antes do dominio está correto
$antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1);
$caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1);
if ($caracter_ult != "@" && $caracter_ult != "."){
$mail_correcto = 1;
}
}
}
}
}

// Informando o resultado

if ($mail_correcto)
return true;
else
return false;
}


// Passamos para a validação da nossa captcha simples


{

// Validaremos Conferindo se o campo do formulário confere com o valor da sessão nomeada
// A sessão é gerada e nomeada na página captcha.php

if ($_POST['user_code'] == $_SESSION['session_textoCaptcha'])
{

// Como há um alert no final não informamos aqui se o resultado for positivo

}
else
{
// Se o resultado for negativo paramos o script, exibimos um alerta e retornamos a página anterior

die("<script>alert('Dados Incorretos. Tente novamente');history.go(-1);</script>");


}
}

// Vamos receber os dados do "formulário de contato"
// O nome dos campos pode ser alterado como quiser
// Caso altere uma variável $ lembre-se de mudar em todo o script

$recebenome = $_POST["nome"];
$recebemail = $_POST["email"];
$recebemsg = $_POST["mensagem"];
$recebesbj = $_POST["subject"];
$recebecap = $_POST["user_code"];


// Verificando se os campos nome, email, assunto e mensagem estão em branco

if (($recebenome == "") || ($recebemail == "") || ($recebemsg == "") || ($recebesbj == ""))

// Caso estejam vazios paramos o script, emitimos o alerta e retornamos ao formulário

die("<script>alert('Preencha todos os campos!');history.go(-1);</script>");


// Validando o campo email com a função lançada no início

if (validaEMAIL($recebemail) == false)

// Se não for validado paramos o script, emitimos um alerta e retornamos ao formulário

die("<script>alert('Use um e-mail correto!');history.go(-1);</script>");

// Definimos aqui a quarta string da função mail do php, que é o cabeçalho
// Usaremos duas variáveis diferentes, uma com nome e email

$headers = "From: <$recebemail>";
$header = "From: $recebenome <$recebemail>";

// Definimos aqui uma variável com o email do admin do site
// Altere por favor

$para = "armazenandolixo@gmail.com";

// Montamos o corpo do email para o admin do site

// Nome inserido no formulário
$mensagem1 .= "Nome: ";
$mensagem1 .= $recebenome;
$mensagem1 .= "
";
// Email inserido no formulário
$mensagem1 .= "E-mail: ";
$mensagem1 .= $recebemail;
$mensagem1 .= "
";
// Assunto inserido no formulário
$mensagem1 .= "Assunto: ";
$mensagem1 .= $recebesbj;
$mensagem1 .= "
";
$mensagem1 .= "
";
// Mensagem inserida no formulário
$mensagem1 .= "Mensagem: ";
$mensagem1 .= "
";
$mensagem1 .= "
";
$mensagem1 .= $recebemsg;
$mensagem1 .= "
";
$mensagem1 .= "
";
$mensagem1 .= "***************";
$mensagem1 .= "
";
$mensagem1 .= "
";
// Identificação do IP de envio e variável do campo captcha
$mensagem1 .= "Mensagem Enviada pelo Ip: " . $REMOTE_ADDR .", Controle: " . $recebecap . "";
$mensagem1 .= "
";
// Nome do site
$mensagem1 .= "Site: ForumAberto.com";
$mensagem1 .= "
";

// Enviamos o email para o administrador do site
// Na função mail as strings são destinatário, assunto, mensagem, cabeçalho, informações adicionais
// Nosso cabeçalho usa o From para determinar o email

if(!mail($para,$recebesbj,$mensagem1,$headers))

// Caso o envio falhe informamos o erro e retoramos ao formulário

die("<script>alert('Erro Interno! Tente mais tarde.');history.go(-1);</script>");


// Montamos o corpo do email para o remetente

// Nome no campo
$mensagem2 = "Hello " . $recebenome . ",";
$mensagem2 .= "
";
$mensagem2 .= "
";
// Mensagem de agradecimento com a variável do assunto. Altere o texto como desejar
$mensagem2 .= "Sua mensagem " . $recebesbj . " foi recebida com sucesso.";
$mensagem2 .= "
";
$mensagem2 .= "A equipe Forum Aberto agradece sua visita e seu contato. Obrigado pra participar da comunidade!";
$mensagem2 .= "
";
$mensagem2 .= "
";
$mensagem2 .= "
";
$mensagem2 .= "
";
$mensagem2 .= "
";
// Informa o IP que enviou a mensagem evitando aborrecimentos e informa o captcha
$mensagem2 .= "Enviada no Ip: " . $REMOTE_ADDR .", Controle: " . $recebecap . "";
$mensagem2 .= "
";
$mensagem2 .= "
";
// Nome do site
$mensagem2 .= "forumaberto.com - Awaken Your Desires!";
$mensagem2 .= "
";

// Enviando o email para o rementente
// Na função mail as strings são destinatário, assunto, mensagem, cabeçalho, informações adicionais
// Veja que o assunto aqui foi modificado, altere por favor, a varável header aqui é diferente

if(!mail($recebemail,"Enviada no Forum Aberto!",$mensagem2,$header))

// Confirmando o envio, paramos o script, emitimos alerta e retornamos se houver erro
die("<script>alert('Erro Interno! Volte mais tarde.');history.go(-1);</script>");


// Exibimos um alerta de sucesso

print "<script>alert('Mensagem enviada com sucesso!')</script>";

// Retornamos a página do formulário

echo "<meta http-equiv='refresh' content='0;URL=http://forumaberto.com'>";



/* Formulário para a página de envio .htm
* Altere de acordo com seu layout e o tamanho de sua imagem
* Lembre de alterar a localização da imagem (img src="captcha.php")
* Altere o (action) do form se o formulario estiver em outra pasta
*
*<form id="form1" name="form1" method="post" action="enviar_contato.php">
*
* <table width="500" border="2" cellspacing="5" cellpadding="8">
* <tr>
* <td>Nome:</td>
* <td><input name="nome" type="text" id="nome" size='40' /></td>
* </tr>
* <tr>
* <td>Assunto:</td>
* <td><input name="subject" type="text" id="subject" size='40' /></td>
* </tr>
* <tr>
* <td>E-Mail:</td>
* <td><input name="email" type="text" id="email" size='40' /></td>
* </tr>
* <tr>
* <td>Mensagem:</td>
* <td><textarea name="mensagem" cols="60" rows="15" id="mensagem"></textarea></td>
* </tr>
* <tr>
* <td>Captcha:</td>
* <td><img src="http://forumaberto.com/captcha.php" width="233" height="49"></td>
* </tr>
* <tr>
* <td>Copie:</td>
* <td> <input name='user_code' type='text' size='40' value='Insira o valor Captcha' /></td>
* </tr>
* <tr>
* <td> </td>
* <td><input type="submit" name="Submit" value="Enviar Contato" /></td>
* </tr>
* </table>
*</form>
*/


// Divirta-se, mas lembre de informar a fonte !!!

?>


• Começamos com a função de validação do e-mail conferindo algumas constantes comuns. Isto evita tanto que você receba uma mensagem sem poder responder, como evita uma mensagem de falha de envio. Se você não está acostumado evite alterar qualquer coisa ali.

• Em seguida verificamos o valor do campo Captcha segundo a seção, em caso de erro é emitido alerta e retorna ao formulário. Caso queira pode mudar a mensagem do alerta.

• Convertemos depois os dados recebidos dos campos do formulário para variáveis. Se você alterar o nome de um campo no formulário deverá alterar aqui também. Evite alterar as variáveis ($), mas se quiser mude em todo o arquivo.

• Logo em seguida verificamos o preenchimento dos campos e a validação do e-mail cadastrado. Da mesma forma que valor captcha, erros retornam ao formulário e emitem alerta.

• Definimos variáveis para o cabeçalho do e-mail. É definido um para o remetente e outro para o administrador do site. Evite alterar aqui se não conhecer sobre as strings da função "mail" do PHP.

! Altere o valor da variável "$para" colocado o e-mail do administrador do site.

! Montamos o corpo do e-mail para o administrador. Altere o local que contém o nome do site e se desejar mude os demais dados com cuidado.

• Enviamos o e-mail para o administrador. Você pode alterar se quiser a mensagem de alerta para erros de envio.

! Montamos o corpo do e-mail para o remetente. Altere o texto adequando a seu site.

! Enviamos o e-mail para o remetente. Altere por favor o assunto onde diz "Enviada no Forum Aberto".
Se quiser altere o alerta de erro interno.

! Exibimos um alerta de sucesso e redirecionamos para o site. Altere o endereço do site como quiser.
Se quiser altere a mensagem de alerta.


Aqui temos um exemplo desta página funcionando com o "form.htm" que disponibilizo no pacote, junto a um index redirecionador em .html:

http://imgforumaberto.orgfree.com/contato/
http://imgforumaberto.orgfree.com/contato/form.htm

O Blog do Forum e o TopSex usam páginas similares, porém o armazenamento do valor gerado é no banco de dados. Você pode fazer isto também por cookies.

[ Download ]

Modelos arquivos, modelos de páginas, modelos imagem, algumas fontes GD gratuitas:

Size: 100kb
Format: zip

http://rapidshare.com/files/419324793/contato.zip.html

Abraços...
Art ForumAberto
Pesquisa de domínio:
Estamos todos na mesma barca e acredito que, cada um remando do seu lado, esse barco será sempre acelerado.

Avatar do usuário
forumaberto
Administrador
Administrador
 
 
Mensagens: 11220
Registrado em: Ter Abr 01, 2008 9:07 pm
Localização: Belo Horizonte
Sexo: Masculino
Twitter: forumaberto

Re: Formulário de E-mail em PHP com Captcha e Validação

Mensagempor Demolidor » Seg Ago 29, 2011 2:41 pm

queria ver o exemplo mas num deu...


[tw]DemolidorFA[/tw]
Leia as Regras, ou te mandarei pro colo de Michael Jackson, ganhar beijo de língua da Dercy!

www.magmarama.com.br
www.videosemacao.blogspot.com
www.risosdagalera.blogspot.com

Art ForumAberto
Avatar do usuário
Demolidor
Moderador
Moderador
 
 
Mensagens: 2144
Registrado em: Qua Abr 09, 2008 5:53 pm
Sexo: Masculino
Twitter: Magmarama_

Re: Formulário de E-mail em PHP com Captcha e Validação

Mensagempor forumaberto » Ter Ago 30, 2011 12:00 am

queria ver o exemplo mas num deu...



Olha o do Blog do fórum
Art ForumAberto
Pesquisa de domínio:
Estamos todos na mesma barca e acredito que, cada um remando do seu lado, esse barco será sempre acelerado.

Avatar do usuário
forumaberto
Administrador
Administrador
 
 
Mensagens: 11220
Registrado em: Ter Abr 01, 2008 9:07 pm
Localização: Belo Horizonte
Sexo: Masculino
Twitter: forumaberto

Re: Formulário de E-mail em PHP com Captcha e Validação

Mensagempor Demolidor » Qua Ago 31, 2011 12:27 am

quero por no blog mas to com muito sono agora.....


[tw]DemolidorFA[/tw]
Leia as Regras, ou te mandarei pro colo de Michael Jackson, ganhar beijo de língua da Dercy!

www.magmarama.com.br
www.videosemacao.blogspot.com
www.risosdagalera.blogspot.com

Art ForumAberto
Avatar do usuário
Demolidor
Moderador
Moderador
 
 
Mensagens: 2144
Registrado em: Qua Abr 09, 2008 5:53 pm
Sexo: Masculino
Twitter: Magmarama_

Re: Formulário de E-mail em PHP com Captcha e Validação

Mensagempor forumaberto » Qua Ago 31, 2011 1:33 am

Use para aprender, faça com tempo.
Art ForumAberto
Pesquisa de domínio:
Estamos todos na mesma barca e acredito que, cada um remando do seu lado, esse barco será sempre acelerado.

Avatar do usuário
forumaberto
Administrador
Administrador
 
 
Mensagens: 11220
Registrado em: Ter Abr 01, 2008 9:07 pm
Localização: Belo Horizonte
Sexo: Masculino
Twitter: forumaberto


Voltar para Software Livre e Códigos

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante