PHP : enviando formulários por email

setembro 3rd, 2008 | by DragaO~ |

olá pessoas-felizes-que-se-prestam-a-ler-isso :D
hoje quero fazer um novo tutorial e vou tentar ser o mais direto possivel ok ? ;D
como o titulo jah diz, faremos um formulario de contato para ser posteriormente enviado por email

antes de começar, certifique-se que o seu servidor onde vai ser (ou esta) hospedado este script tenha suporte à envios de emails

feito isso, maos à obra ;)

começando, precisamos do nosso formulario, obviamente :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formul&aacute;rio de Contato pelo Site</title>
<style type="text/css">
.c
{
	vertical-align: top;
	text-align: right;
}
</style>
</head>
 
<body>
<form action="envia_form_email.php" method="post">
<table>
	<tr>
		<td class="c">
		Nome:
		</td>
		<td>
		<input type="text" name="nome" />
		</td>
	</tr>
	<tr>
		<td class="c">
		Email:
		</td>
		<td>
		<input type="text" name="email" />
		</td>
	</tr>
	<tr>
		<td class="c">
		O que voc&ecirc; achou do tutorial?
		</td>
		<td>
		<textarea rows="5" cols="20" name="opiniao"></textarea>
		</td>
	</tr>
	<tr>
		<td>
		</td>
		<td>
		<input type="submit" value="Enviar Email" />
		</td>
	</tr>
</table>
</form>
</body>
</html>

agora, explicando o que foi feito :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formul&aacute;rio de Contato pelo Site</title>
<style type="text/css">
.c
{
	vertical-align: top;
	text-align: right;
}
</style>
</head>
<body>

nao vou me ater às linhas acima, pois nao sao o foco deste tutorial, pois sao apenas um estilo CSS e declaraçoes HTML

15
<form action="envia_form_email.php" method="post">

a linha acima indoca que os dados do nosso formulario serao enviados para o arquivo “envia_form_email.php” (que veremos a seguir) e que o metodo de envio escolhido foi o “post”, nenhum misterio ateh entao ;)

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<table>
	<tr>
		<td class="c">
		Nome:
		</td>
		<td>
		<input type="text" name="nome" />
		</td>
	</tr>
	<tr>
		<td class="c">
		Email:
		</td>
		<td>
		<input type="text" name="email" />
		</td>
	</tr>
	<tr>
		<td class="c">
		O que voc&ecirc; achou do tutorial?
		</td>
		<td>
		<textarea rows="5" cols="20" name="opiniao"></textarea>
		</td>
	</tr>
</table>

acima temos o nosso formulario propriamente dito, com os campos “nome”, “email” e “opiniao”, que sao os dados que queremos enviar para nosso email

42
43
44
</form>
</body>
</html>

fechamento das tags previamente abertas

pronto, temos um simples formulario :D
agora basta fazer a “ardua” tarefa de enviar seu conteudo por email ;)
a seguir, o arquivo que faz isso, o nosso “envia_form_email.php” :

envia_form_email.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
foreach($_POST as $campo => $valor)
{
	$temp = "\$".$campo."='".htmlentities($valor, ENT_QUOTES)."';";
	eval($temp);
}
 
$para = "dragaoarrobapensaofunbari.com";
$assunto = "Email automatico via formulario";
$cabecalhos .= "MIME-Version: 1.0\n";
$cabecalhos .= "Content-type: text/html; charset=iso-8859-1\n";
 
$mensagem = $nome." enviou uma avalia&ccedil;&atilde;o sobre o tutorial :<br />";
$mensagem .= "<br />";
$mensagem .= "email para contato : ".$email."<br />";
$mensagem .= "opiniao : ".nl2br($opiniao)."<br />";
 
if(mail($para, $assunto, $mensagem, $cabecalhos))
{
	echo "Obrigado pelo contato";
}
else
{
	echo "Desculpe-nos, ocorreu uma falha";
}
?>

basicamente seria isso ^^
agora, explicando o codigo :

2
3
4
5
6
foreach($_POST as $campo => $valor)
{
	$temp = "\$".$campo."='".htmlentities($valor, ENT_QUOTES)."';";
	eval($temp);
}

nao me aterei à este loop, pois eu explico ele com detalhes neste post ;D

8
$para = "dragaoarrobapensaofunbari.com";

aqui estamos setando a variavel que vai receber o email para qual o “resultado” do formulario vai ser enviado
basicamente, coloque seu email ai para que o email seja enviado para voce

9
$assunto = "Email automatico via formulario";

o assunto do email, creio nao ter nenhum misterio pra quem jah enviou emails alguma vez na vida ;D

10
11
$cabecalhos .= "MIME-Version: 1.0\n";
$cabecalhos .= "Content-type: text/html; charset=iso-8859-1\n";

cabeçalhos do email, eles informaram o que contem no email
no nosso caso, informaram a versao do tipo mime (linha 10) que queremos/estamos utilizar/utilizando e que o conteudo do email (linha 11) sao texto puro ou html, e que a codificaçao de caracteres utilizada no email eh a ISO-8859-1

13
$mensagem = $nome." enviou uma avalia&ccedil;&atilde;o sobre o tutorial :<br />";

aqui estamos montando o corpo do nosso email, e primeiramente colocamos o nome de quem enviou, seguido de um texto qualquer
perceba que ao final da linha nos colocamos um “
“, que em HTML quebra a linha, e que no nosso email, graças ao que especificamos no “Content-type” de nosso cabeçalho de email, vai ser visualizado como uma quebra de linha, pois ele (o email) vai interpretar comandos HTML (se o cliente tiver suporte à isso, o que hoje em dia eh dificil acontecer de o cliente nao possuir suporte à HTML)

14
15
$mensagem .= "<br />";
$mensagem .= "email para contato : ".$email."<br />";

aqui colocamos o que foi informado no campo “email” de nosso formulario

16
$mensagem .= "opiniao : ".nl2br($opiniao)."<br />";

aqui colocamos a opiniao que a pessoa escreveu, utilizando a funçao “nl2br()
esta funçao basicamente substitui os “\n” por “
” (lembre-se, os campos textarea assumem “\n” como quebra de linha)

18
19
20
21
22
23
24
25
if(mail($para, $assunto, $mensagem, $cabecalhos))
{
	echo "Obrigado pelo contato";
}
else
{
	echo "Desculpe-nos, ocorreu uma falha";
}

aqui fazemos a incrivel tarefa de enviar tudo isso por email e mostrar uma mensagem para o usuario ;)
acho que o que eu pus ali eh auto-explicativo, mas caso nao seja, basta olhar o php.net e ver como funciona a funçao “mail()” ;D

bom, acho que eras isso :D
duvidas? pergute ;)
falhas? informe-as ;D

ateh a proxima =D/

referencia das funçoes :
mail(), nl2br(), htmlentities(), eval()

VN:F [1.4.3_701]
Rating: 8.7/10 (3 votes cast)


Postagens parecidas/interessantes:

  1. 10 Responses to “PHP : enviando formulários por email”

  2. By Claiton Padilha on out 2, 2008 | Reply

    Concordo com o que o Guitarrista Kurumin disse,
    tu tens uma boa didática :D.
    Tu poderias também postar tutoriais de como integrar PHP+Javascript, já que é o que mais se utiliza.
    Flw ;)

    Quote

    VA:F [1.4.3_701]
    Rating: 5.0/5 (1 vote cast)
  3. By DragaO~ on out 5, 2008 | Reply

    Concordo com o que o Guitarrista Kurumin disse,
    tu tens uma boa didática :D.

    que bom, assim o pessoal consegue compreender bem o que eu tento “passar” nos “tutoriais” que eu posto aqui ^^
    e obrigado pelo elogio :D

    Tu poderias também postar tutoriais de como integrar PHP+Javascript, já que é o que mais se utiliza.
    Flw ;)

    hm…
    tipo, eu nao sou muito “fan” de javascript pelo simples fato de ele ser facilmente bloqueavel pelo usuario
    imagina depender de uma validaçao que utiliza somente javascript (jah vi casos de sites “grandes” ser assim), o cara vai ali e bloqueia e pronto, sem validaçao alguma =x
    tudo bem que alguem pode vir e falar

    mas ae tu valida pelo PHP tambem

    imagina o “desperdicio” de codigo que eh :S
    tem uns que dizem que eh “mais rapido”, pq tu “joga” uma parte do processamento pro cliente e tudo mais
    e se o cliente conseguir burlar o javascript, tem ali o PHP “imburlavel” e tal

    mas eu acho o seguinte : pra que colocar mais codigo em uma pagina e aumentar (dependendo do caso, consideravelmente) o tempo de carregameno da pagina ?

    e veja, se tu fizer a validaçao com javascript, e quiser “garantir” a validaçao utilizando o PHP, teriamos outros problemas, como duplicaçao de codigo (sim, seria o mesmo em duas linguagens), e o PHP SEMPRE seria utilizado, mesmo que tudo estivesse correto e tal, o PHP iria fazer o “serviço” dele

    acho que ficou um pouco confuso o que eu quis dizer :S

    mas acho desnecessaria a validaçao de formularios utilizando javascript
    (jah vi casos de sites INTEIRAMENTE feitos em javascript…eles eram tao pesados que meu firefox travava :S)

    bom, acho que tae a minha opiniao ^^
    e obrigado pelo comentario, espero que continue acompanhando os posts aqui ;D

    flw xD/

    Quote

    VN:F [1.4.3_701]
    Rating: 3.0/5 (1 vote cast)
  4. By Claiton Padilha on out 7, 2008 | Reply

    A questão é que os efeitos visuais são 99% em javascript…
    Foi a isso que quis me referir…
    Sem dúvidas que fazer validações com JS é total perca de tempo…
    Certamente continuarei acompanhando os POST’S e GET’S por aqui :D

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  5. By DragaO~ on out 22, 2008 | Reply

    cara, juro que nao tinha visto que tu tinha comentado aqui o.o
    e o mais curioso, foi que eu aceitei teu comentario mas fui ler hoje, sei lah pq vim aqui XD
    bom, quanto à isso :

    A questão é que os efeitos visuais são 99% em javascript…

    nao se esqueça das CSS ;D

    eu tava mesmo pensando em aprender DHTML, tem umas coisas muito bonitas (sem contar a facilidade pro usuario final) que se pode fazer com isso

    Certamente continuarei acompanhando os POST’S e GET’S por aqui :D

    HASUEhUASEhuAHSUehuASHeuhAUSeuASHE
    MUITO boa a piada (Y)
    serio, eu ri na hora que li XDDDDD
    bom, serah sempre bem-vindo aqui ^^

    obrigado pelo comentario :)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  6. By Carlos Alexandre on set 4, 2009 | Reply

    Olá Professor.
    Queria saber uma coisa…eu tenho um formulario que copiei de um site, ele é em php.
    Eu queria editar esse formulario para ele ser enviado para o e-mail do meu cliente.
    O senhor pode me dar essa força?
    Posso te enviar o formulario?
    Obrigado

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  7. By DragaO~ on set 10, 2009 | Reply

    “senhor”, “professor”?
    realmente isso não combina comigo XD

    pode passar o formulário sim, mas eu prefiro que tu poste ele aqui no blog mesmo (lembre-se de ler isso antes de postar os códigos)

    posta ambos códigos, do formulário e do arquivo que faz o envio do email

    qualquer coisa, tu pode tentar ler o meu post (que é justamente esse) e ver se ele te ajuda em algo :)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  8. By Ronaldo on mar 25, 2010 | Reply

    Boa tarde,

    Estou utilizando o código acima para terminar meu site, porém não consigo… (novato de tudo!!!rs..) qdo. eu aplico o contato.htm e clico em enviar, ele abre o arquivo.php, estou fazendo uma caca? com certeza estou… queria saber qual?

    Obrigado.

    Ronaldo.

    Obs.: minha hospedagem é locaweb, e o site que está em funcionamento é em flash, mas estou fazendo outro todo em XHTML!

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  9. By DragaO~ on abr 8, 2010 | Reply

    @Ronaldo

    Tu tá usando a locaweb? Eu, particularmente, acho que a hospedagem da locaweb não é lá essas coisas, mas em todo caso…
    Se não me engano, os servidores da locaweb são máquinas Windows né? Se for, tentar mudar os “\n” para “\r\n”, assim ó:

    10
    11
    
    $cabecalhos .= "MIME-Version: 1.0\r\n";
    $cabecalhos .= "Content-type: text/html; charset=iso-8859-1\r\n";

    Lembre-se de fazer em todas partes do código :)

    Eu lembro que uma vez tive que colocar um sistema no servidor da locaweb, e, por ser servidor Windows, só reconhecia e envia o email quando eu colocava o “\r\n” (carriage return e new line) ao invés de apenas o “\n” (new line)

    Se nada disso funcionar, se possível, peço que poste todos os códigos envolvidos nesse processo

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  10. By Eder on jun 23, 2010 | Reply

    Olá dragão, estou hospedado na locaweb, e está aparecendo o seguinte erro:

    PHP Warning: mail() [function.mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in E:\home\xxxx\Web\envia_form_email.php on line 18

    Pode me ajudar?
    Abraço!

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  11. By DragaO~ on set 2, 2010 | Reply

    @Eder

    isso não é um erro, é um aviso :)

    basicamente, tu tem que adicionar um campo dizendo quem está enviando o email.
    basta tu fazer algo como

    $cabecalho .= 'From: seu@email.com';

    assim :

    10
    11
    12
    
    $cabecalhos .= "MIME-Version: 1.0\n";
    $cabecalhos .= "Content-type: text/html; charset=iso-8859-1\n";
    $cabecalhos .= "From: seu@email.com\n";

    no mais, desculpe a demora em responder :)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)

Deixe um comentário

Vai postar algum código? Leia isso antes