PHP Mail – Formulário De Contacto

Vocabulário: arquivo = ficheiro

A primeira linguagem de programação que aprendemos para desenvolver um website é o HTML, e aliado ao CSS conseguimos desenvolver um website básico inteiro. Mas quando chega no menu contato, nenhum cliente mais aceita que se coloque lá um link que abrirá o Outlook ou Thunderbird do usuário. É preciso um formulário de contato.

E nesse momento é necessário que você saiba uma função do php. A mail(). É ela a estrela deste tutorial.

Criaremos um formulário e o código PHP para validar e enviar as informações preenchidas para o e-mail do cliente.

Formulário de Contato

Formulário HTML

Vamos iniciar com o código HMTL básico para criação do formulário:


<div class="div-form">
<h1>Formulário de Contato</h1>
    <form action="envia-email.php" method="post">
        <fieldset>
            <p><label for="nome">Nome:</label></p>
            <input type="text" name="nome" size="30" class="width233" />
            <p><label for="email">E-mail:</label></p>
            <input type="text" name="email" size="30" class="width233"/>
            <p><label for="texto">Texto:</label></p>
            <textarea name="texto" rows="10" class="width233"></textarea><br />
            <input type="submit" name="enviar" value="Enviar" />
        </fieldset>
    </form>
</div>

A propriedade action do tag form informa para onde devem ser enviadas as informações quando o formulário for submetido. Apontamos para o arquivo que conterá o código PHP.

Caso deseja fazer tudo em um único arquivo o código ficaria:


<form action="<?php $_SERVER['PHP_SELF']?>" method="post">

E feita uma verificação para executar o código somente quando o formulário for submetido:


if (isset($_POST['enviar'])
{
//código php do arquivo
}

POST ou GET?

Voltando ao nosso código HTML, na propriedade method da tag form inserimos o valor POST. Ele permite que enviemos a quantidade que quisermos de informação e é um caminho somente de ida, onde as informações não poderão ser recuperadas, é indicado também para dados sensíveis como senhas. Perfeito para ser utilizado com formulários.

Nesse momento surge a dúvida de quando e por que não utilizar o GET, que também tem o papel de enviar informações. No nosso caso ele não é útil, pois além de mostrar as informações submetidas na url da página, limita o número de caracteres que podem ser enviados. Ele é mais útil quando precisamos passar dados de uma página para outro.

Identificar Os Dados

Para identificar os dados enviados, definimos a propriedade name para cada campo. Isso cria uma espécie de variável/valor. Ao submeter o form, a organização esclarecida será:

Nome = “informação digitada no campo nome”
E-mail = “informação digitada no campo e-mail”

Validação Dos Dados

Vamos partir agora para o arquivo “envia-email.php”.

Iniciamos o arquivo com as tags PHP e validamos os dados:


<?php
$nome = htmlspecialchars(strip_tags($_POST['nome']));
$texto = htmlspecialchars(strip_tags($_POST['texto']));
$email = htmlspecialchars(strip_tags($_POST['email']));
$refresh = '<meta http-equiv="refresh" content="1; url=form.html" />';
  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  {
    echo '<script type="text/javascript">alert("E-mail inválido!.")</script>';  
    exit ($refresh);    
  } elseif
    (!filter_var($email, FILTER_SANITIZE_EMAIL))
    {
    echo '<script type="text/javascript">alert("E-mail inválido!. Contém caracteres não permitidos.")</script>';
    exit ($refresh);    
  }
?>

Definimos as variáveis. E antes que recebam valores validamos utilizando as funções htmlspecialchars e strip_tags. Note que aparece $_POST pois foi isso que definimos no method do formulário, e o nome da variável igual ao que definimos na propriedade name.

Fizemos uma verificação a mais no campo de e-mail com a função filter_var para evitar injections e garantir que o e-mail é válido. Só não confirma que ele existe e esta disponível apartir da versão 5.2 do PHP.

Caso a verificação retorne um valor false, é mostrado ao usuário um alert informando que o e-mail fornecido é inválido e quando ele pressionar Ok é redirecionado para a página do contato utilizando uma meta tag.

Mas por que não utilizamos a função header? Porque ela não permite saídas html antes de sua execução. E como precisamos mostrar um alert para informar ao usuário que erro ocorreu, contornamos o problema utilizando a meta tag refresh, inserida dentro do comando exit, que pára a execução do script naquele ponto, evitando verificações e alertas desnecessários.

Estando tudo certo com os dados, faremos uma última verificação antes de iniciar o processo de envio. Garantimos que todos os campos obrigatórios foram preeenchidos.


if ($nome != '' && $email != '' && $texto != '')
{
//codigo
} else{
  echo '<script type="text/javascript">alert("Por favor preencha todos os campos.")</script>';
  exit ($refresh);      }

Antes de iniciarmos a organização das informações para o envio do e-mail, vamos conhecer a sintaxe da função mail(). Pois desta maneira fica mais claro o porquê de ter que preencher determinadas variáveis.

Função PHP mail()


Bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )

A palavra Bool na frente vem de Boolean, significa que o retorno da função será ou true, em caso de sucesso ou false.

Em seguida temos os campos a serem preenchidos. Para qual e-mail será enviado (string to), o título (string subject), a mensagem (string message) e parâmetros adicionais como cabeçalhos (headers).

Para tornar mais objetivo o tutorial, vamos simplificar a linha acima.


mail($recipient, $subject, $msg, $header)

Formando O E-Mail

São as variáveis acima que vamos preencher agora.


$msg = "<strong>Nome:</strong> $nome<br>";
$msg .= "<strong>E-mail:</strong> $email<br>";
$msg .= "<strong>Mensagem:</strong> $texto<br>";
$recipient = "seuemail@servidor.com.br";
$subject = "Contato Website";
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$header .= "From: $email\r\n";

$header .= "X-Priority: 1 (Higuest)\n";
$header .= "X-MSMail-Priority: High\n";
$header .= "Importance: High\n";

Corpo Da Mensagem

A variável $msg contém as informações que serão mostradas no corpo do e-mail. Podem ser utilizados códigos HTML e CSS para formatar o e-mail da forma que preferir. Isso porque mais abaixo vamos informar que o formato do e-mail é HTML.

Destinatário

Em seguida criamos a variável $recipient que contém o e-mail para o qual as informações preenchidas no formulário serão enviadas. Se quiser enviar para mais pessoas faça da seguinte maneira:


$header .= “\r\n Cc: email@servidor.com”;
$header .= “\r\n Bcc: outroemail@servidor.com”;

Dessa forma são enviadas cópias para os e-mails listados.

Título

A variável $subject mostra o título do e-mail, você pode colocar ali, por exemplo, o nome de quem esta enviando a mensagem, mas não pode formatar.

Cabeçalhos

Começamos a formar o cabeçalho do e-mail.


$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$header .= "From: $email\r\n";

//define a prioridade do e-mail
$header .= "X-Priority: 1 (Higuest)\n";
$header .= "X-MSMail-Priority: High\n";
$header .= "Importance: High\n";

Definimos o formato da mensagem. Indicamos que o conteúdo pode conter caracteres HTML (text/html), se fosse somente texto ficaria (text/plain), e utiliza a codificação ISO. Em seguida informamos de qual e-mail provem a mensagem (from). Caso considere necessário pode definir uma prioridade alta para a mensagem.

Enviando O E-Mail

Com todas as variáveis preenchidas podemos enviar o e-mail.


if (mail ($recipient, $subject, $msg, $header))
{
  echo '<script type="text/javascript">alert("Contato enviado.")</script>';
  exit ($refresh);    
} else {
  echo '<script type="text/javascript">alert("Problema no envio da mensagem. Por favor tente mais tarde..")</script>';
  exit ($refresh);    http://br2.php.net/manual/pt_BR/function.filter-var.php
}

Se o envio ocorreu, true, mostramos um alert informando o usuário e retornamos a página de contato. E o trabalho esta acabado. O código completo fica assim:

Código completo


<?php
$nome = htmlspecialchars(strip_tags($_POST['nome']));
$texto = htmlspecialchars(strip_tags($_POST['texto']));
$email = htmlspecialchars(strip_tags($_POST['email']));
$refresh = '<meta http-equiv="refresh" content="1; url=form.html" />';
  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  {
    echo '<script type="text/javascript">alert("E-mail inválido!.")</script>';  
    exit ($refresh);    
  } elseif
    (!filter_var($email, FILTER_SANITIZE_EMAIL))
    {
      echo '<script type="text/javascript">alert("E-mail inválido!. Contém caracteres não permitidos.")</script>';
    exit ($refresh);    
  }
  if ($nome != '' && $email != '' && $texto != '')
  {
    $msg = "<strong>Nome:</strong> $nome<br>";
    $msg .= "<strong>E-mail:</strong> $email<br>";
    $msg .= "<strong>Mensagem:</strong> $texto<br>";          $recipient = "seuemail @servidor.com.br";
    $subject = "Contato Website";
    $header = "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: text/html; charset=iso-8859-1\r\n";
    $header .= "From: $email\r\n";
    if (mail ($recipient, $subject, $msg, $header))
    {
        echo '<script type="text/javascript">alert("Contato enviado.")</script>';
        exit ($refresh);    
    } else {
        echo '<script type="text/javascript">alert("Problema no envio da mensagem. Por favor tente mais tarde..")</script>';
        exit ($refresh);    
    }
  } else{
      echo '<script type="text/javascript">alert("Por favor preencha todos os campos.")</script>';
    exit ($refresh);    
  }
?>

Formulário De Contacto Avançado

Se você pretende ir um pouco além, e autenticar os e-mail enviados ou anexar arquivos esta função já não pode ajudá-lo muito. Primeiro porque ela não dá suporte para autenticação via SMTP e depois porque é mais complicado anexar arquivos com ela. Para facilitar seu trabalho com isso, você pode utilizar a função PHPMailer.

DOWNLOAD: Descarregue o código utilizado neste tutorial para a criação dum Formulário de Contacto Em PHP, em formato .zip.

Be Sociable, Share!

29 Comentários

  1. Parabéns amigo pelo tuto.
    Abraços forte

  2. Estava procurando isso e com uma boa explicação. Valeu mesmo pelo post.

  3. Danilo

    Olá Rui,
    Estou com problema para com a função mail. ele esta dando a mensagem
    Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\Arquivos de programas\VertrigoServ\www\ecologic\contatos\envia-email.php on line 27

    Eu já editei o php.ini e deixei assim
    [mail function]; For Win32 only.SMTP=smtp.gmail.comsmtp_port=465
    ; For Win32 only.;sendmail_from=meuemail@meudominio.com.br

  4. Atenção, HTML não é uma linguagem de programação. ; )

    • Olá Luís! Temos aqui uma ideia sobre conceitos:http://www.webmaster.pt/tutoriais-programacao-web… onde dividimos o que faz parte da categoria Web Design e o que faz parte da categoria Programação. Em termos de conceito, o HTML é uma linguagem de marcação. Mas, não vou ser demasiado rigoroso no uso que os vários autores fazem desses conceitos, excepto se o artigo for na categoria teoria > web design. O que importa aprender neste tutorial é o código PHP necessário para processar o envio dos dados inseridos num formulário para uma conta de email. Mas, concordo contigo que o HTML não é uma linguagem de programação. Recomendo TODOS os tutoriais do Maicon. Um Abraço Rui Soares

  5. @erikoli

    so um porem corrigindo em:

    if (isset($_POST['enviar'])

    é

    if (isset($_POST['enviar'])) // esqceu de fechar o parenteses

  6. manuel Rodrigues

    O meu nome é manuel mas não sou um grande programador , precisava de uma ajuda, fiz download do teu ficheiro formulário, necessitava disso para o meu site, agora o meu problema e que o meu site é um índex.html e o índex.swf, então eu criei uma pasta no ftp em que dei o nome contacto onde tem os teus ficheiros já alterados para o meu e-mail e essas coisas, agora não sei a síntese que devo aplicar no fla
    para ele efectuar o geturl mas em versão pop up, ou seja a pessoa carrega num botão a indicar formulário e ele aparecesse como pop up, e possível?

  7. Douglas

    Ei cara, eu não consigo ajeitar o código para redirecionar a página !

  8. Prezado Rui Soares
    ,
    Estou com um probleminha, meu pastor pediu para construir uma pagina para domínio da igreja, se vc quiser acessar é esse portaltabernaculo.com.br é um blogger.

    Fiz um layout no fireworks, baseando nos site que navega.

    Como tenho muitas dúvidas revolvi pesquisar na net, encontrei um tutorial seu CRIANDO SITE DINAMICO, muito bom, nesse tutorial você explica com fazer um sistema de noticia, inclusive fiz sua ideia no site da igreja.

    Minha duvida é: Como desenvolver um esquema que ao cadastrar uma noticia no painel automaticamente ele exibir na pagina uma do lado da outra, tipo: na 1º linha not 1 e not 2 na 2º linha not 4 e not 5 e assim por diante. Pra você ter uma ideia ver o layout que estou desenvolvendo maniadigitalpc.com.br/trp/new_portal.php

    Tem um capitulo que você disponibiliza uns arquivos extras, ferramentas de formatação de texto. Tipo negrito, tamanho e outros… Por favor, poderia disponibilizar eles.

    Muito Obrigado..

  9. kaxa

    Excelente Post………Obrigado a pessoas com tu que gostam de partilhar Sabedoria …….Funciona a 100%, agora só tenho de personalizar, seguindo mais algumas dicas……………THANKS AGAIN 

  10. Andrefv

    Cara, agradeço muio pelo post, porém comigo, sempre dá o mesmo erro: "Problema no envio da mensagem. Por favor tente mais tarde.."
    Até mesmo com o código original disponível para download, sem alterações (apenas no e-mail a ser recebido o contato), o erro persiste. O que fazer? Obrigado.

  11. Muito bom o formulário. Muito obrigada por compartilhar.
    Cris

  12. Tiago Pires

    Cara eu tava com um projeto em cima do prazo, mas com seu tuto eu fiz tudo rapidinho… ^^ .. vlw!!!

  13. Andrea

    olá… estou testando o formulario .. mas a msg que ele retorna é esta.. :

    Warning: mail(): Failed to connect to mailserver at "127.0.0.1" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:Program FilesEasyPHP-DevServer-13.1VC9datalocalwebmy portable filesenvia-email.php on line 27

    na linha 27 esta o seguinte:

    if (mail ($recipient, $subject, $msg, $header))

    Por que o meu não está funcionando?

    obs.: o e-mail de destino é dominio proprio (.com.br) não é do gmail…

  14. ricardopcarvalho1

    Adorei o blog, continue postando, no site Scriptcase contem algumas informações sobre.

  15. Tide

    viva
    estou a criar um formulário que envia a inscrição para o email indicado.
    a questão é a seguinte, é possível colocar o formulário a aparecer na caixa de correio com o mesmo aspecto que a página web? ou,  em alternativa converter  o formulário em PDF e enviar automáticamente por email.

    Agradeço desde já a vossa atenção

  16. Bobb

    Alguns erros relatados, tem a ver com SMTP, porém até agora não sei exatamente como e onde adiciona smtp = 587 , no lugar de 25 , se isto for esclarecido resolveria-se a outra metade dos problemas
    Agradeço as explanações e as dicas. T+

  17. anonimo

    Obrigado pelo artigo. Funciona 100%

  18. Paulão

    Obrigado pelo artigo. O Script funciona 100%.

    Alguem saberia como fazer a formatação para quebra de linha na caixa texto (campo Mensagem)

    Se a sua mensagem for longa ele entrega todo o conteudo na primeira linha.

    No mais esta perfeito…

    O Site está de Parabens!!

  19. leia isso…. e vote certo em 2014 / Diga não ao GOVERNO corrupto de Cuiaba e Mato Grosso, chega de Robalheira. Vamos mudar.

    http://www.folhamax.com.br/politica/alvo-da-pf-em

    Ip: 187.63.226.185

  20. Andre S. Vidal

    Ola primeiramente obrigado por postar seus conhecimentos na web e disponibilizar para todos.
    não sei programar em php, porem eu consigo editar pegando scripts pronto igual o seu, eu trabalho mais com flash as2 e as3.
    estou com um problema eu tinha um formulario em php 5.1 porem ele parou de funcionar na uolhost, hj eu vi seu post e reformulei meu formulario para 5.2 com o seu script porem nao funcionou.
    vc poderia dar uma revisao por favor? ver se tem algo errado. eu agradeço.

    vou postar aqui o script do php em alguns comentarios continuos pq é um pouco grande.

  21. randolph90

    Muito bom o tutorial! me ajudou muito, muito obrigado pela ajuda!!!

  22. Rodrigo

    Parabéns pelo tutorial só tenho um problema na hora de voltar a paginá index.php 

  23. Victor

    Boa tarde Amigos,

    Tenho este código em php de formulário de contacto. Está a funcionar bem mas o problema é que no mail que recebe  não chega os campos de nome, mail e mensagem. Alguma dica?

    "Uma mensagem vinda do site !
    Algum vistante mandou essa mensagem pelo site.
    Nome: 
    Email: 
    Mensagem:
    "

    Agradeco desde já quem me puder ajudar a encontrar o erro no php

    <?

    $nome=$_POST['nome'];

    $email=$_POST['email'];

    $titulo=$_POST['titulo'];

    $texto=$_POST['texto'];

    $Destinatario="aquivaiseuemail";

    $Titulo="$titulo";

    $mensagem1="

    Uma mensagem vinda do site !

    Algum vistante mandou essa mensagem pelo site.

    Nome: $nome

    Email: $email

    Mensagem: $mensagem";

    mail("$Destinatario","$Titulo", "$mensagem1","From:$email");

    ?>

Participa! Comenta... para kaxa