PHP - Como criar um formulário de contato para o seu site

Dezembro 2016

Com este formulário você poderá criar uma página para ser contatado em seu site, sem utilizar um software de mensagens. A pessoa que vai entrar em contato com você indicará o seu endereço, o objeto da mensagem e sua mensagem, é óbvio.

Leia o artigo do Locaweb sobre a Função mail(). Se ela não funcionar verifique se o seu provedor de hospedagem não a desativou ou bloqueou. O endereço e-mail do destinatário também conta. Ele não é seguro (sem verificação “anti-bots”), você tem que se virar. No entanto, todas as verificações efetuadas deveriam bloquear certos spams pouco evoluídos.

Se você fizer sozinho, a melhor maneira é colocar uma questão simples, como "Qual é o endereço desta página" ou “Quanto é: 2+2?". Um humano compreenderia perfeitamente, mas um robô responde qualquer coisa. É mais fácil gerar uma imagem e verifica-la depois, mesmo que este sistema pareça ser o mais eficaz em relação a certos robôs evoluídos.

Você poderá também participar da evolução do sistema, armazenando uma série de questões deste tipo e gerando uma de forma aleatória. No entanto, o sistema AntiSpam tem que se adaptar em função da frequentação do site e da confiança necessária.

O formulário

Eis o código. A única coisa a ser feita é Copiar > Colar o código e coloca-lo em um arquivo com extensão .php (ou .shtml, .php3, etc.). Atenção, não se esqueça de indicar seu endereço e-mail na terceira linha!

<?php  
//Escreva seu endereço e-mail entre aspas  
$destinatário='meu endereço@meudomínio';  
?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "[http://www.w3.org/TR/html4/strict.dtd]">  
<html lang="pt">  
<head>  
  <title>Contact</title>   
  <style type="text/css">  
    form#contact{border:2px solid red;width:70%;padding:1em}  
    p#msg,p#adr,p#obj{border:2px solid green;margin-right:10%;padding:10px}  
    p#msg textarea{border:2px solid blue;height:30em;width:80%}  
    p#adr input,p#obj input{border:2px solid blue}  
    p.bt{text-align:center}  
    p.bt input{border:1px red solid;width:50%}  
  </style>  
  <meta http-equiv="content-type" content="Content-type:text/html;charset=iso-8859-1">  
</head>  
<body style="direction: ltr;">  
<h1>Contact</h1>  
<?php  
$Previsualizar='<p class="bt">  
<input type="submit" name="previsualizar" tabindex="3" value="Previsualizar"></p>';  
$Envio="\n".'<p class="bt">  
<input name="envoi" tabindex="4" value="Enviar" type="submit"></p>';  
if (isset($_POST['mensagem']))  
  {  
    //A variável $verif  vai analisar se a semântica do e-mail está correta  
    $verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';  
    //algumas substituições para as  
    $mensagem=preg_replace('#(<|>)#', '-', $_POST['mensagem']);  
    $mensagem=str_replace('"', "'",$mensagem);  
    $mensagem=str_replace('&', 'et',$mensagem);  
    $objeto=preg_replace('#(<|>)#', '-', $_POST['objeto']);  
    $objeto=str_replace('"', "'",$objeto);  
    $objeto=str_replace('&', 'e',$objeto);  
    //Designamos e/ou protegemos nossas variáveis  
    $seue-mail=stripslashes(htmlentities($_POST['seuemail']));  
    $mensagem=stripslashes(htmlspecialchars($mensagem));  
    $objeto=stripslashes(htmlspecialchars($objeto));  
    //input envio/previsualizar  
    $envio=htmlentities($_POST['envio']);  
    $previsualizar=htmlentities($_POST['previsualizar']);  
    //tiramos os espaços  
    $seue-mail=trim($seuemail);  
    $mensagem=trim($mensagem);  
    $objeto=trim($objeto);  

    $pré-visualização_resultado='<p>Pré-visualização do resultado:</p>';  

    /*Verificamos se o e-mail e a mensagem estão completos e agimos em função.  
      (mostramos Pré-visualização do resultado, tal ou tal campo está vazio, , etc.*/  
    //Se não funcionar (mal completado, e-mail inválido, etc.)  
    if((empty($mensagem))or(empty($objeto))or(!preg_match($verif,$seuemail)))  
      {  
        //Os três campos estão vazios  
        if(empty($seuemail)and(empty($mensagem))and(empty($objeto)))  
          {  
            eco '<p>Todos os campos estão vazios.</p>';  
            $mensagem='';$eue-mail='';$objet='';$pré-visualização_resultado='';  
          }  
        //um dos campos está vazio  
        else  
          {  
            if(!preg_match($verif,$seuemail))  
              eco'<p>Seu endereço e-mail n\'é inválido.</p>';  
            else  
            {  
              eco'<p>É preciso completar todos os campos!</p>';  
              if(empty($mensagem))  
                $Pré-visualização_resultado='';  
            }  
          }  
      }  
    //Se os dois  estiverem completos e o endereço for válido, enviamos e pré-visualizamos sem envio   
    else  
      {  
        $domínio=preg_replace('#[^@]+@(.+)#','$1',$seuemail);  
        $DomínioMailExiste=checkdnsrr($domínio,'MX');  
        if(!$DomínioMailExiste)  
          eco'<p>O nome de domínio do endereço e-mail que você deu é inválido.</p>';  
        elseif(!empty($pré-visualizar))  
            {  
              $Pré-visualização_resultado='<p>Sua mensagem e seu endereço e-mail são válidos e prontos para serem enviados.  
              <br>Você deve clicar no botão: "Enviar".<br>Pré-visualização:</p>';  
              $Pré-visualizar='';  
            }  
        elseif(!empty($envio))  
            {  
              $objeto='[SITE] : '.$objeto;  
              $headers='From:'.$seuemail."\r\n".'To:'.$email."\r\n".'Subject:'.$objeto."\r\n".'Content-type:text/plain;charset=is-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');  
              if(mail($destinatário,$objeto,$mensagem,$headers))  
              {  
                eco '<p>Sua mensagem foi enviada;. Obrigado.</p><p><a href="/">Retorno à página inicial</a></p>';  
                $Envio='';  
                $Pré-visualizar='';  
              }  
              else  
                echo'<p>Ocorreu um problema durante o envio do e-mail.</p>';  
            }  
        else  
          echo'<p>Ocorreu uma situação inesperada na execução do script.</p>';  
      }  
eco $Pré-visualização_resultado;  
  }  
else  
  {  
  eco '<p>Você pode utilizar este formulário para entrar em contato conosco.</p>';  
  $seuemail='';$mensagem='';  
  }  
$bas_formulário=$Pré-visualizar.$Envio;  
?>  
<form id='contact' method="post" action="<?php echo $_SERVER['PHP_SELF'];?>" enctype="multipart/form-data">  
  <p id='obj'><label for='objet'>Objeto de sua mensagem:<br>  
  <input type='text' name='objet' id='objet' tabindex='10' size='30'></label></p>   

  <p id="adr"><label for="mail">Seu endereço de e-mail<br>  
  <input name="seue-mail" tabindex="20" size="30" type="text" id="mail" value="<?php eco $seuemail; ?>"></label></p>  
    
  <p id="msg"><label for="message">Sua mensagem<br>  
  <textarea tabindex="30" rows="20" cols="120" name="message" id="message"><?php eco $mensagem; ?></textarea>  
  </label></p>  
<?php eco $bas_formulário;?>  
</form>  
</body>  
</html>  

Uma outra versão em PHP5. Este formulário foi escrito em PHP5 e não comporta pré-visualização.
O código fonte e Links PHPsecure

<?php  
    define( 'MAIL_TO', /* >>>>> */'usuáriodomínio.tld'/* <<<<< */ );  //acrescentar seu e-mail  
    define( 'MAIL_FROM', 'usuário@domínio.tld' ); // valor padrão  
    define( 'MAIL_OBJECT', 'objeto da mensagem' ); // valor padrão  
    define( 'MAIL_MESSAGE', 'sua mensagem' ); // valor padrão  

    $mailSent = false; // bandeira que orienta a visualização do formulário OU de recapitulativo  
    $errors = array(); // quadro de erros de digitação  
      
    if( filter_has_var( INPUT_POST, 'send' ) ) // o formulário foi submetido com o botão [Enviar]  
    {  
        $from = filter_input( INPUT_POST, 'from', FILTER_VALIDATE_E-MAIL );  
        if( $from === NULL || $from === MAIL_FROM ) // se o e-mail fornecido estiver  vazio OU igual ao valor padrão  
        {  
            $errors[] = 'Você deve informar seu endereço de e-mail';  
        }  
        elseif( $from === false ) // se o e-mail fornecido for inválido  
        {  
            $errors[] = 'O e-mail é inválido';  
            $from = filter_input( INPUT_POST, 'from', FILTER_SANITIZE_E-MAIL );  
        }  

        $objeto = filter_input( INPUT_POST, 'object', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_LOW );  
        if( $object === NULL OR $object === false OR empty( $object ) OR $object === MAIL_OBJECT ) // se o objeto estiver vazio, inválido ou igual ao valor padrão  
        {  
            $errors[] = ‘você deve informar o objeto’;  
        }  

 /* desnecessário limpar a mensagem.  
 / [http://www.phpsecure.info/v2/.php]  
 / Logicamente, as partes da mensagem, To: e Subject: também poderiam servir para injetar alguma coisa, mas a função e-mail ()  
 / filtra as duas últimas, a primeira é a mensagem e, a partir do momento onde pulamos  uma linha no envio do e-mail.  
 / é considerado como texto; a mensagem  restaria como uma simples mensagem. */  
        $message = filter_input( INPUT_POST, 'message', FILTER_UNSAFE_RAW );  
        if( $message === NULL OR $message === false OR empty( $message ) OR $message === MAIL_MESSAGE ) // se a mensagem fornecida estiver vazia ou igual ao valor padrão  
        {  
            $errors[] = 'Você deve escrever uma mensagem';  
        }  

        if( count( $errors ) === 0 ) // se não houver erros  
        {  
            if( mail( MAIL_TO, $object, $message, "From: $from\nReply-to: $from\n" ) ) // tentativa de envio da mensagem  
            {  
                $mailSent = true;  
            }  
            else // envio interrompido  
            {  
                $errors[] = ‘Sua mensagem não foi enviada.’;
            }  
        }  
    }  
    else //o formulário foi mostrado pela primeira vez, com os valores padrão   
    {  
        $from = MAIL_FROM;  
        $object = MAIL_OBJECT;  
        $message = MAIL_MESSAGE;  
    }  
?>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "[http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd]">  
<html lang="pt" xmlns="[http://www.w3.org/1999/xhtml]" xml:lang="pt">  
    <head>  
        <title>Contact</title>  
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />  
        <meta http-equiv="content-language" content="pt" />  
        <style type="text/css">  
html{ font-family:Geneva, Arial, Helvetica, sans-serif; margin:0; padding:0; font-size:.88em;}  
body{ width:772px; margin:0 auto; padding:0; }  
textarea{ width:772px; }  
label{ display:block; font-weight:bold; }  
p#welcome{ padding:10px 20px; border:1px dotted #00f; color:#00f; font-weight:bold; }  
ul{ padding:10px 20px; border:1px dotted #f00; color:#f00; font-weight:bold; }  
p#success{ padding:10px 20px; border:1px dotted #0f0; color:#0f0; font-weight:bold; }  
p em{ display:block; font-weight:normal; }  
        </style>  
    </head>  
    <body>  
        <h1>Contact</h1>  
        <hr />  
<?php  
    if( $mailSent === true ) // se a mensagem foi enviada com sucesso, mostramos o   recapitulativo   
    {  
?>  
        <p id="success">Sua mensagem  foi enviada com sucesso.</p>  
        <p><strong>Correio para a resposta </strong><br /><?php echo( $from ); ?></p>  
        <p><strong>Objeto:</strong><br /><?php echo( $object ); ?></p>  
        <p><strong>Mensagem:</strong><br /><?php echo( nl2br( htmlspecialchars( $message ) ) ); ?></p>  
<?php  
    }  
    else // O formulário é exibido pela primeira vez ou o formulário foi submetido mas continha erros  
    {  
        if( count( $errors ) !== 0 )  
        {  
            eco( "\t\t<ul>\n" );  
            foreach( $errors as $error )  
            {  
                eco( "\t\t\t<li>$error</li>\n" );  
            }  
            eco( "\t\t</ul>\n" );  
        }  
        else  
        {  
            eco( "\t\t<p id=\"welcome\"><em>Todos os campos são obrigatórios</em></p>\n" );  
        }  
?>  
        <form id='contact' method="post" action="<?php echo( $_SERVER['REQUEST_URI'] ); ?>">  
            <p>  
                <label for="from">E-mail para resposta</label>  
                <input type="text" name="from" id="from" value="<?php echo( $from ); ?>" />  
            </p>  
            <p>  
                <label for="object">Objeto</label>  
                <input type="text" name="object" id="object" value="<?php echo( $object ); ?>" />  
            </p>   
            <p>  
                <label for="message">Mensagem</label>  
                <textarea name="message" id="message" rows="20" cols="80"><?php echo( $message ); ?></textarea>  
            </p>  
            <p>  
                <input type="reset" name="reset" value="Apagar" />  
                <input type="submit" name="send" value="Enviar" />  
            </p>  
        </form>  
<?php  
    }  
?>  
    </body>  
</html>

Foto: © PHP.

Veja também :
Este documento, intitulado « PHP - Como criar um formulário de contato para o seu site »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.