Marcelo Torres

Formulário de contato em PHP

14/04/2009 · 40 Comentários

Olá pessoal, alguns meses atrás eu estava sofrendo pra pra fazer um formulário de envio de dados de um form para o email de um cliente através de uma area do site, consegui enfim! Então vou compartilhar nesse post o desenvolvimento de um formulário de contato simples para seu site, utilizando a função mail() do php, com validação de campos(inclusive de email), sem spam e com estilização em css.

Irei dividir em 3 partes:

  • Construção do form em (X)HTML;
  • Implementação do arquivo de envio em PHP.
  • Estilização do form com CSS ;


Vamos começar então, com a construção do form em (X)HTML:

contato.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pt-br">
<head>
<meta name="author" content="Marcelo Torres" />
<meta http-equiv="content-type" content="text/html; charset=iso-utf-8" />
<title>Formulário de contato em PHP</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<form action="contato.php" method="post">
<fieldset>
<legend>Entre em contato</legend>
<small>*Campos de Preenchimentos Obrigatório</small><br />
<?php include("enviar.php")?>
<label for="nome"> * Seu nome:</label>
<input id="nome" name="nome" size="31" type="text" value="<?echo $nome ;?>" /><br />
<label for="email">* Seu email:</label>
<input id="email" name="email" size="31" type="text" value="<?echo $email ;?>" /><br />
<label for="assunto">* Assunto:</label>
&nbsp;<input id="assunto" maxlength="50" name="assunto" size="15" type="text" value="<?echo $assunto ;?>" /><br />
<label for="mensagem">* Mensagem:</label><br />
<textarea id="mensagem" cols="53" rows="5" name="mensagem"><?echo $mensagem;?></textarea><br />
<input name="enviar" type="submit" value="Enviar" class="botao"/>
<input name="cancelar" type="reset" value="Limpar" class="botao"/>
<p>Formulário de contato em PHP, por <a title="blog do autor" href="http://marcelowd.wordpress.com">Marcelo Torres</p>
</fieldset>
</form>
</body>
</html>

Nota I: o value tem um echo em php com as variáveis( que nós iremos ver ainda), para no caso de um erro na validação do form, os dados digitados continuar nos campos, para que o usuário não tenha que digitar denovo.

Nota II: o comando “<?php include(“enviar.php”)?>”, está incluindo o arquivo
enviar.php, onde estão localizados, as validações dos campos e é claro o script para envio para seu email, vamos fazer este arquivo então.


enviar.php

<?php
/*Variaveis do Formulario*/
$nome = trim(@$_POST['nome']);/*recebe os dados digitados no campo "nome"*/
$email = trim(@$_POST['email']);/*recebe os dados digitados no campo "email"*/
$assunto_user = trim(@$_POST['assunto']);/*recebe os dados digitados no campo "assunto"*/
$mensagem = trim(@$_POST['mensagem']);/*recebe os dados digitados no campo "mensagem"*/

$enviar = @$_POST['enviar'];/*Botão enviar*/

/*variavel que contará os erros*/
$erros = 1;

/*transforma em variavel global, a vari&atilde;¡vel email*/
global $email;
if($enviar)/*Se o botão enviar for pressionado, faça...*/
{
			/*Verifica campo "nome" vazio*/
			if($nome == "")
				{
				$erros++;
				echo "<small class=\"erro\">O Campo nome esta vazio</small><br />";
				}
				elseif(is_numeric($nome))/*verifica se foi digitado n&uacute;mero no campo*/
				{
				$erros++;
				echo "<small class=\"erro\">Voc&ecirc; digitou numero no campo nome</small><br />";
				}
			/*Verifica campo "email" vazio*/
			if($email == "")
				{
				$erros++;
				echo "<small class=\"erro\">O Campo email est&aacute; vazio</small><br />";
				}
			/*Verifica campo "assunto" vazio*/
			if($assunto_user == "")
				{
				$erros++;
				echo "<small class=\"erro\">O Campo assunto est&eacute; vazio</small><br />";
				}
			/*Verifica campo mensagem vazio*/
			if($mensagem == "")
				{
				$erros++;
				echo "<small class=\"erro\">O Campo mensagem est&eacute; vazio</small><br />";
				}	

					/*verifica email, se digitado incorretamente*/
					$email = str_replace (" ", "", $email);
					$email = str_replace ("/", "", $email);
					$email = str_replace ("@.", "@", $email);
					$email = str_replace (".@", "@", $email);
					$email = str_replace (",", ".", $email);
					$email = str_replace (";", ".", $email);

					if(strlen($email)<8 || substr_count($email, "@")!=1 || substr_count($email, ".")==0)
					{
					$erros++;
					echo "<small class=\"erro\">Por favor, digite seu <b>e-mail</b> corretamente.</small><br />";
					}
					if($erros <= 1)/*se não tiver algum erro continuara abaixo, se tiver é exibido as messagens configuradas acima*/
					{

					/*Configuramos o e-mail para o qual serão enviadas as informações*/

					$seuemail = "seuemail@exemplo.com";/*email de destino*/

					$assunto = "contato do site";/*assunto padrão do email(não o digitado pelo úsuario)*/

					/*Configuramos os cabeçalhos do e-mail*/
					$headers = "MIME-Version: 1.0\r\n";
					$headers .= "Content-type: text/html; charset=utf-8\r\n";/*para o envio com formatação HTML. Charset po ser iso-8859-1 também*/
					$headers .= "From: $seuemail \r\n";/*Para "seu email"*/

					/*Configuramos o conteúdo do e-mail*/
					$conteudo = "<strong>Nome:</strong> $nome<br />";/*vai para o seu email o que foi digitado no campo "nome"*/
					$conteudo .= "<strong>Email:</strong> $email<br />";/*vai para o seu email o que foi digitado no campo "email"*/
					$conteudo .= "<strong>Assunto:</strong> $assunto_user<br />";/*vai para o seu email o que foi digitado no campo "assunto"*/
					$conteudo .= "<strong>Mensagem:</strong> $mensagem<br />";/*vai para o seu email o que foi digitado no campo "mensagem"*/

					/*Enviando o e-mail...*/
					$enviando = mail($seuemail, $assunto, $conteudo, $headers);

					/*verifica se o e-mail foi enviado com sucesso*/
						if($enviando) {
							echo "Mensagem enviada com sucesso!";
							echo "<script>alert(\"Mensagem enviada com sucesso!\")</script>";
							echo "<script>window.location = \"index.php\"</script>";
						}
						else{/*seu ouve algum erro...*/
							echo "<p><b>$nome</b><br />Ouve um erro no envio, desculpe-nos pelo transtorno!!!</p>";
						}
				}
}
?>

Sem notas dessa vez, os comentários(em verde) explicam tudo :).

Agora vamos a parte divertida, o CSS, :D

style.css

*{padding:0; margin:0;}/*reset de margem e espaçamento para todos os elementos*/

body{letter-spacing:2px;font-size:13px;color:#333;line-height:36px;}

fieldset{width:500px;padding:20px;margin:50px;}
input{width:350px;font-size:18px;color:#333;border:solid 1px #333;}
input.botao{width:100px;}

small{color:#008800;}
small.erro{color:#f00;}

baixe os arquivos completos aqui!

Categorias: (x)html/css · Desenvolvimento · Design · PHP · Tableless · Tutoriais · Web Standards
Etiquetado: ,

40 respostas Até agora ↓

  • Cássio // 30/05/2009 às 20:32

    Jesus te ama!!!

  • Gláuber Kélvin // 14/07/2009 às 12:32

    E pode ter certeza disso. Ele te ama tanto que morreu na cruz por voce.

  • Marcelo Torres // 14/07/2009 às 18:23

    Lembrando que isso é um blog sobre internet, web design/developer e afins…hehehe

  • Paula // 15/07/2009 às 17:18

    Oi tudo bem

    eu não entedo muito de PHP… to quebrando a cabeça aqui…

    Notei que está faltando uma exclamação na:

    elseif(is_numeric($nome))/*verifica se foi digitado número no campo*/
    {

    e o meu só funcionou quando eu tirei o else da frente:

    if(!is_numeric($nomecompleto))

  • Paula // 15/07/2009 às 17:27

    Qual é o comando que diz que quando der erro, não é para ele enviar a mensagem, mas sim voltar para o formulario??

    O meu avisa que tem erro, mas automaticamente diz que a mensagem foi enviada com sucesso e envia a mensagem… não dá a oportunidade pra pessoa voltar para o formulário….

    Valeuuu

  • Marcelo Torres // 15/07/2009 às 19:29

    Estranho Paula, comigo funciona certinho o is_numeric(), se for colocado uma ” ! ” vai ficar assim:

    “senão se, NÃO for numero exiba a mesagem de erro”, isso vai dar ao contrario, quando a pessoa digitar letras ele vai mostrar a mesagem de erro.

    Quanto ao retorno para o formulario, eu não entendi direito, mas acabei de testar denovo esse script e ele está broqueando certinho, quando há algum erro no formulario, ele só envia quando realmente não tem nenhum erro, quando tem algum erro, mostra a mensagem em cima do formulario, para que a pessoa corrija, caso você modificou esse script, de uma checada melhor para ver se não mudou nada sem querer, ok?!

    espero ter ajudado!

  • Cleyton // 17/07/2009 às 19:56

    Boa noite..
    O email não xega pra mim.. o meu email fica no GMAIL, pq será que nao dah certo? Eu peguei os arquivos no link que tem apos as explicações -> ‘baixe os arquivos completos aqui!’
    Obrigado

  • Marcelo Torres // 18/07/2009 às 08:00

    Cleyton você está trabalhando em localhost?
    outra coisa você alterou o valor da variavel “$seuemail”?

    Já fiz o teste com gmail e funcionou, verifica certinho se você digitou o email corretamente, ok?!.

  • Rodrigo // 20/07/2009 às 14:12

    Gostaria de fazer um formulário com opções de email, sendo que teria um campo setor, onde o usuário iria selecionar e seria um email diferente para cada setor. Como faço isto?

  • Cleyton // 20/07/2009 às 14:50

    Fala Marcelo..
    entao, como assim ‘em localhost’ ? minha hospedagem é no ‘awardspace.com’, um site de hospedagem gratis!
    Editei a variavel ‘$seuemail’ sim.. nao sei o que estah dando errado.. se puder me ajudar eu agradeço! Valew!!!!

  • Marcelo Torres // 20/07/2009 às 19:02

    Cleyton então provavelmente esse serviço de hopedagem não suporta envio de email, já passei por esta experiencia também, ultizava um servidor gratuito e quando fui testar este script não dava certo, se tiver a oportunidade de testar em um servidor pago, testa, e ve se ocorre tudo bem ok?!

    localhost é quando você configura o apache, mysql, php na sua maquina e você poder trabalhar offline.

  • Marcelo Torres // 20/07/2009 às 19:07

    Rodrigo explique melhor por favor!

  • Cleyton // 20/07/2009 às 21:38

    Ah entendi Marcelo!
    Mas tipo, vc nao conhece nenhum lugar onde eu possa hospedar de graça para fazer isso?
    Obrigado.

  • Marcelo Torres // 20/07/2009 às 21:49

    Putz num tenho certeza, mas tenta este aqui

    http://www.000webhost.com/

  • Cleyton // 20/07/2009 às 22:01

    Esse site nao tem como vc confirmar seu cadastro, jah vi em varios foruns que realmente nao dá mais pra cadastrar no webhost.com ! Mas valew cara, obrigado..

  • Cleyton // 20/07/2009 às 22:53

    MARCELO, nao tem como fazer um formulario de contato em htm/html ?

    Obrigado.

  • Marcelo Torres // 20/07/2009 às 23:02

    Bom todos os formularios são em html, mesmo usanso PHP, ok?!

    …mas para enviar para um email diretamente não tem como, a unica coisa que da pra fazer é colocar o email no action do formulario, por exemplo:

    form action=”mailto:seuemail@exemplo.com”

    dai vai abrir no programa padrão de email do usuario, como o outlook, thunderbird…

  • Alexandre // 03/08/2009 às 10:50

    Esse formulário funciona em PHP5?

  • Marcelo Torres // 03/08/2009 às 20:16

    sim funciona com php 5

  • Alexandre // 03/08/2009 às 20:56

    Pelo que eu entendi sobre a resposta que você deu ao Clayton as páginas são feitas com terminação em HTML e depois a gente coloca o código php na página html? …… desculpe a ingnorância no assunto, mas para mim ajuda bastante.

  • Erick // 23/08/2009 às 15:58

    Olá,

    Ótimo tutorial!!!

    Bom, como eu nunca vi PHP na minha vida, n sei como fazer. tentei editar o css, mas n consegui td.

    alguma dica de como terminar de fazer isso?

    segue aqui o link do site: http://www.blackhair.ch/kontakt.htm

    Obrigado!

  • Marcelo Torres // 23/08/2009 às 19:58

    Erick sua hospedagem suporta PHP? ou só HTML?

  • Erick // 24/08/2009 às 20:26

    Olá,

    Marcelo, o host suporta os dois.

    Esse formulario era td q eu queria. mas infelizmente n to conseguindo editar, nunca mexi com php.

    vc pode ajudar?

  • Alexandre Montagna // 29/08/2009 às 03:57

    Me parece um código muito bom. Obrigado!

  • Savio // 10/09/2009 às 11:53

    Olá,
    estou tendo o seguinte problema:
    Warning: Server Error in c:\apache\htdocs\mail\enviar.php on line 81

    a linha 81 está ok.
    $enviando = mail($seuemail, $assunto, $conteudo, $headers);
    e coloquei meu email (para teste corretamente)… poderia me ajudar a localizar o problema?

  • Marcelo Torres // 10/09/2009 às 18:49

    Savio você colocou seu email, na linha que diz:

    $seuemail = “seuemail@exemplo.com”;/*email de destino*/

    ou na linha 81?

  • Fernando // 24/09/2009 às 13:38

    Obrigado! Fantástico tutorial. Me ajudou muito, sai de um problemão.

  • Lívia // 05/10/2009 às 10:37

    Oi gente, alguém sabe me dizer pq as mensagens enviadas pelo formulário estão sem acento? como posso arrumar isso?
    além disso, se algum campo estiver sem preenchimento, o campo assunto é o único q está sendo apagado depois q dá a mensagem q ´por ex um campo qualquer está sem preenchimento

    me ajudem ai!!
    bjsss

    PS: Otimo post

  • Marcelo Torres // 05/10/2009 às 11:30

    Livia tenta mudar o “charset=utf-8″ para “charset=iso-8859-1″…

  • Lívia // 05/10/2009 às 12:58

    Ahh e mais uma coisinha,,, não to conseguindo mandar o foto depois da mensagem pro campo não digitado!!

    abraços!!

  • Marcelo Torres // 05/10/2009 às 18:40

    Livia como assim “mandar o foto”?, num entendi nada!! hehehe

    explique-se melhor porfavor!

  • Lívia // 06/10/2009 às 07:01

    Ei Marcelo, primeiro deixa eu te agradecer!! vc é um anjinho!! deu certo a acentuação tá funcionando, e quanto ao campo assunto estar apagando após ter algum erro arrumei tb!!!

    Agora só falta uma coisinha… perdãoooooooooo
    é mudar o FOCO kkkkk, tipo se o cair na mensagem de erro ao sair dela (eu mudei as mensagens para alert) depois de dar ok, eu queria colocar o foco no campo com problema entendeu? agora que eu digitei certo vc vai entender né? kkkk

    bjosss

  • Marcelo Torres // 06/10/2009 às 12:25

    Ahhhh sim agora entendi Livia…hehhehe

    então você vai ter que usar javascript para isso
    tenho dois links que poderão te ajudar:

    http://claudiocoelho.wordpress.com/2008/10/14/foco-em-objeto-do-formulario-com-javascript/
    http://www.criarweb.com/artigos/validacao-formulario-com-javascript.html

    boa sorte!

  • Lucas // 05/11/2009 às 01:22

    Demais!!! Valeu!!

  • Thiago // 09/11/2009 às 10:25

    Nao consigo fazer funcionar, tentei copiando o codigo direto do site e depois baixei, mudei apenas o email e nao vai, ele fica dando a mensagem “Ouve um erro no envio, desculpe-nos pelo transtorno!!!”

    o que pode ser? a hospedagem é paga!

  • Thiago // 09/11/2009 às 10:54

    Desculpa o comentario duplo, mas era o site que hospedava que me bloquiava de enviar o formulario, testei no 000webhost (tinha uma conta antiga la) e funcionou perfeitamente, Muito obrigado pelo seu trabalho, está de ótima qualidade e mesmo eu que nao entendo nada pude aprender um bocado de php, agradeço!

  • Marcelo Torres // 09/11/2009 às 13:26

    valeu Thiago por retornar e colocar a solução do problema

  • Coisinho // 21/11/2009 às 12:40

    Boa tarde,
    Se pretendem começar a trabalhar com php / html / css / javascript aconselho a fazer download do programa WAMP (windows) / XAMP (linux) onde estes tem integrado (php/mysql/apache). Assim podem testar as vossas páginas sem estar preocupado com o alojamento.

  • Léia // 02/12/2009 às 00:07

    Ola Marcelo…
    Sou totalmente leiga no assunto php!!!!
    Cara ta brabo… o q ta errado num sei…
    + copiei o codigo, so mudei a parte:
    email de destino… somente isso e pus o meu email…
    stá correto, ou teria q mudar + alguma coisa??
    ñ vai nem q a vaca tussa!!! me ajuda ai, se puder, please…
    Aguardo e desde já agradeço a atenção… bj

  • Jacson // 11/12/2009 às 16:27

    Galera, também sou iniciante no php e tive o mesmo problema do Savio mas para o meu azar…ele nao respondeu a pergunta que o Marcelo lhe fez depois
    : (

    Vamos a questão novamente

    Olá,
    estou tendo o seguinte problema:
    Warning: Server Error in c:\apache\htdocs\mail\enviar.php on line 81

    a linha 81 está ok.
    $enviando = mail($seuemail, $assunto, $conteudo, $headers);
    e coloquei meu email (para teste corretamente)… poderia me ajudar a localizar o problema?

    Eu mudei o email na linha que diz

    Savio você colocou seu email, na linha que diz:

    $seuemail = “seuemail@exemplo.com”;/*email de destino*/

    Alguma boa alma, poderia me ajudar?
    Aguardo

Deixe um comentário