Tableless

Busca Menu

Formulário de e-mail e envio com PHP

Seja o primeiro a comentar por

Há anos atrás, quando queríamos colocar um formulário de e-mail em nosso site, simplesmente pegávamos um script em Perl que funcionava, mas não fazíamos ideia de como as coisas aconteciam por trás. Neste post demonstrarei que é muito simples fazer a mesma coisa em PHP. Perceba que o foco é principalmente no PHP, e não necessariamente na validação do formulário ou CSS, embora usaremos algumas boas práticas de validação.

Aviso: O script apenas enviará o e-mail se estiver em um servidor. Você não conseguirá mandar o e-mail do localhost (No Wamp ou Xampp por exemplo).

Criando os arquivos

Criaremos quatro arquivos que irão conter nosso script.

O index.php, para que a pasta sempre abra no nosso arquivo de contato (você pode renomear depois para contato.php se quiser). O arquivo mail_ok.php, para exibir a mensagem que o e-mail foi enviado, e o mail_error.php, contendo a mensagem de erro. Finalmente, o mail_send.php, contendo o script que envia o e-mail propriamente dito.

index.php

No index.php vamos fazer o nosso formulário:

<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="utf8">
        <title>Contato</title>
    </head>
    <body>
        <form action="mail_send.php" method="post">
            <fieldset>
                <label for="email">E-mail: </label>
                <input required name="email" type="email">
            </fieldset>
            <fieldset>
                <label for="mensagem">Mensagem: </label>
                <textarea required name="mensagem"></textarea>
            </fieldset>
            <fieldset>
                <button type="submit">Enviar</button>
            </fieldset>
        </form>
    </body>
</html>

Esse formulário contém os campos e-mail e mensagem, ambos campos obrigatórios.

Vamos agora fazer o mail_ok.php e mail_error.php:

mail_ok.php

 <!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="utf8">
        <title>Sucesso</title>
    </head>
    <body>
        <h1>Sucesso</h1>
        
        <hr>
        
        <p>O e-mail foi enviado com sucesso.</p>
    </body>
</html>

mail_error.php

 <!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="utf8">
        <title>Erro</title>
    </head>
    <body>
        <h1>Erro</h1>
        
        <hr>
        
        <p>Houve um erro no envio do e-mail. <a href="index.php">Tentar novamente</a>.</p>
    </body>
</html>

Os arquivos anteriores mostram mensagens se o e-mail foi enviado. O seguinte script PHP irá redirecionar para eles:

mail_send.php

<?php

function pegaValor($valor) {
    return isset($_POST[$valor]) ? $_POST[$valor] : '';
}

function validaEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

function enviaEmail($de, $assunto, $mensagem, $para, $email_servidor) {
    $headers = "From: $email_servidor\r\n" .
               "Reply-To: $de\r\n" .
               "X-Mailer: PHP/" . phpversion() . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
  
  mail($para, $assunto, nl2br($mensagem), $headers);
}

$email_servidor = "email@servidor.com";
$para = "seu@email.com";
$de = pegaValor("email");
$mensagem = pegaValor("mensagem");
$assunto = "Assunto da mensagem";

?>

Este último script define três funções:

  • pegaValor: se existir, pega a váriavel enviada via ‘post’, senão, retorna uma string vazia;
  • validaEmail: retorna se o e-mail é válido;
  • enviaEmail : chama a função mail do PHP com as variáveis que definimos.

As variáveis $de e $mensagem irão pegar os valores enviados pelo formulário. Nas variáveis $email_servidor e $para você deverá colocar seu e-mail do servidor e o e-mail para o qual será enviado o formulário, respectivamente. A variável $assunto será, obviamente, o assunto da mensagem.

Corpo do script

if ($nome && validaEmail($de) && $mensagem) {
    enviaEmail($de, $assunto, $mensagem, $para, $email_servidor);
    $pagina = "mail_ok.php";
} else {
    $pagina = "mail_error.php";
}

header("location:$pagina");

Esta parte do script é o controle de fluxo. Se as variáveis não forem vazias e o e-mail for válido, enviará o e-mail e atribuirá a variável $pagina para mail_ok.php. Caso contrário, a variável $pagina será mail_error.php. E finalmente, redirecionaremos a página com a função header.

Aviso: É de suma importância verificar no seu editor de texto se a codificação é UTF-8 sem BOM. Se não for, o script irá enviar um espaço em branco antes do cabeçalho de redirecionamente, e irá aparecer o seguinte erro:

Cannot modify header information - headers already sent

Com isso nosso script PHP está pronto. Adeus Perl!

Publicado no dia