Formulário de contato PHP

Resumo : neste tutorial você aprenderá como construir um formulário de contato em PHP que inclui validação de formulário, envio de email, honeypot, etc.

Introdução ao formulário de contato PHP

Um formulário de contato permite que os visitantes de um site deixem mensagens. Normalmente, um formulário de contato possui os campos de entrada de nome, e-mail, assunto e mensagem.

Os visitantes precisam preencher estes campos e clicar no botão enviar (ou enviar) para enviar uma mensagem. Em PHP, você pode validar os dados do formulário e enviar a mensagem inserida para o endereço de e-mail pretendido .

O formulário de contato é alvo de spammers que usam spambots para enviar mensagens não solicitadas para publicidade, phishing, propagação de malware, etc.

Um spambot é um software que automatiza as atividades de spam, como preencher e enviar formulários de contato automaticamente.

Para criar um formulário de contato livre de spam, você pode adicionar um captcha a ele. No entanto, às vezes, os captchas são impossíveis de ler. Como resultado, criam uma experiência terrível para utilizadores legítimos.

Para evitar o uso de captcha e ao mesmo tempo proteger o contato contra spam, você pode usar um honeypot para enganar os spambots.

Um honeypot é um campo do formulário que o visitante não pode ver, mas os spambots podem. Quando um spambot vê o campo honeypot, ele preenche o campo com um valor. No PHP, você pode verificar se o honeypot tem um valor e pular o envio da mensagem.

Para criar um honeypot, você precisa ter uma classe CSS que oculte completamente o campo honeypot da seguinte forma:

.user-cannot-see {
    display:none
}Linguagem de código:  CSS  ( css )

E você tem um campo honeypot no formulário:

<label for="nickname" aria-hidden="true" class="user-cannot-see"> Nickname
    <input type="text" 
           name="nickname" 
           id="nickname" 
           class="user-cannot-see" 
           autocomplete="off" 
           tabindex="-1">
</label>Linguagem de código:  HTML, XML  ( xml )

Observe que o nome do honeypot deve parecer legítimo. Recentemente, o spambot tornou-se mais inteligente e pode detectar o honeypot.

Para lidar com esses spambots inteligentes, você precisa de um honeypot inteligente. Por exemplo, um honeypot inteligente pode ter um nome diferente para cada solicitação. Além disso, sua localização no formulário é alterada aleatoriamente.

Crie o formulário de contato

Construiremos um formulário de contato conforme mostrado na imagem a seguir:

Formulário de contato PHP

O formulário de contato possui os seguintes recursos:

  • Validação de formulário
  • Envio de mensagem por e-mail
  • Prevenir SPAM
  • Evitar envio duplo

Primeiro, crie as seguintes pastas e arquivos:

├── config
|  └── app.php
├── css
|  └── style.css
├── inc
|  ├── footer.php
|  ├── get.php
|  ├── header.php
|  ├── mail.php
|  └── post.php
└── index.phpLinguagem de código:  PHP  ( php )

cabeçalho.php

O header.phparquivo contém a parte do cabeçalho do formulário de contato:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>PHP Contact Form</title>
</head>
<body>
    <main>Linguagem de código:  HTML, XML  ( xml )

rodapé.php

O footer.phparquivo contém as tags anexas das tags do cabeçalho:

    </main>
</body>
</html>Linguagem de código:  HTML, XML  ( xml )

obter.php

O get.phparquivo mostra o formulário de contato:

<?php if (isset($message)) : ?>
    <div class="alert alert-success">
        <?= $message ?>
    </div>
<?php endif ?>

<form action="index.php" method="post">
    <header>
        <h1>Send Us a Message</h1>
    </header>

    <div>
        <label for="name">Name:</label>
        <input type="text" value="<?= $inputs['name'] ?? '' ?>" name="name" id="name" placeholder="Full name">
        <small><?= $errors['name'] ?? '' ?></small>
    </div>

    <div>
        <label for="email">Email:</label>
        <input type="email" name="email" id="email" value="<?= $inputs['email'] ?? '' ?>" placeholder="Email address">
        <small><?= $errors['email'] ?? '' ?></small>
    </div>

    <div>
        <label for="subject">Subject:</label>
        <input type="subject" name="subject" id="subject" value="<?= $inputs['subject'] ?? '' ?>" placeholder="Enter a subject">
        <small><?= $errors['subject'] ?? '' ?></small>
    </div>

    <div>
        <label for="message">Message:</label>
        <textarea id="message" name="message" rows="5"><?= $inputs['message'] ?? '' ?></textarea>
        <small><?= $errors['message'] ?? '' ?></small>
    </div>

    <label for="nickname" aria-hidden="true" class="user-cannot-see"> Nickname
        <input type="text" name="nickname" id="nickname" class="user-cannot-see" tabindex="-1" autocomplete="off">
    </label>

    <button type="submit">Send Message</button>
</form>Linguagem de código:  PHP  ( php )

Como funciona.

Primeiro, exiba uma mensagem de sucesso se estiver definida:

<?php if (isset($message)) : ?>
    <div class="alert alert-success">
        <?= $message ?>
    </div>
<?php endif ?>Linguagem de código:  PHP  ( php )

Segundo, preencha os campos de entrada com dados do array $inputs. Se o campo contiver dados inválidos, mostre a mensagem de erro do array $errors.

Terceiro, adicione um honeypot ao formulário:

<label for="nickname" aria-hidden="true" class="user-cannot-see"> Nickname
    <input type="text" name="nickname" id="nickname" class="user-cannot-see" tabindex="-1" autocomplete="off">
</label>Linguagem de código:  PHP  ( php )

post.php

O post.phplida com o envio do formulário:

<?php

// check the honeypot
$honeypot = filter_input(INPUT_POST, 'nickname', FILTER_SANITIZE_STRING);
if ($honeypot) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed');
    exit;
}

// validate name
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$inputs['name'] = $name;
if (!$name || trim($name) === '') {
    $errors['name'] = 'Please enter your name';
}

// validate email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$inputs['email'] = $email;
if ($email) {
    $email = filter_var($email, FILTER_SANITIZE_EMAIL);
    if (!$email) {
        $errors['email'] = 'Please enter a valid email';
    }
} else {
    $errors['email'] = 'Please enter an email';
}

// validate subject
$subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_STRING);
$inputs['subject'] = $subject;
if (!$subject || trim($subject) === '') {
    $errors['subject'] = 'Please enter the subject';
}

// validate message
$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
$inputs['message'] = $message;
if (!$message || trim($message) === '') {
    $errors['message'] = 'Please enter the message';
}Linguagem de código:  PHP  ( php )

Ele post.phpverifica o honeypot e retorna o código de status HTTP 405 se detectar o spambot. Caso contrário, ele limpa e valida os campos de entrada, incluindo nome, email, assunto e mensagem.

config.php

Armazena config.phpas informações de configuração, por exemplo, o endereço de e-mail do destinatário:

<?php

return [
    'mail' => [
        'to_email' => '[email protected]'
    ]
];Linguagem de código:  PHP  ( php )

correio.php

Obtém mail.phpo endereço de e-mail do destinatário do arquivo de configuração app.php. Envia para a mensagem inserida no formulário de contato utilizando a mail()função:

<?php

// get email from the config file
$config = require_once __DIR__ . '/../config/app.php';
$recipient_email = $config['mail']['to_email'];

// contact information
$contact_name = $inputs['name'];
$contact_email = $inputs['email'];
$message = $inputs['message'];
$subject = $inputs['subject'];

// Email header
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=utf-8';
$headers[] = "To: $recipient_email";
$headers[] = "From: $contact_email";
$header = implode('\r\n', $headers);

mail($recipient_email, $subject, $message, $header);Linguagem de código:  PHP  ( php )

index.php

O index.phparquivo contém a lógica principal:

<?php

session_start();

$errors = [];
$inputs = [];

$request_method = strtoupper($_SERVER['REQUEST_METHOD']);

if ($request_method === 'GET') {

    // show the message
    if (isset($_SESSION['message'])) {
        $message = $_SESSION['message'];
        unset($_SESSION['message']);
    } elseif (isset($_SESSION['inputs']) && isset($_SESSION['errors'])) {
        $errors = $_SESSION['errors'];
        unset($_SESSION['errors']);
        $inputs = $_SESSION['inputs'];
        unset($_SESSION['inputs']);
    }
    // show the form
    require_once __DIR__ . '/inc/get.php';
} elseif ($request_method === 'POST') {
    // check the honeypot and validate the field
    require_once __DIR__ . '/inc/post.php';

    if (!$errors) {
        // send an email
        require_once __DIR__ . '/inc/mail.php';
        // set the message
        $_SESSION['message'] =  'Thanks for contacting us! We will be in touch with you shortly.';
    } else {
        $_SESSION['errors'] =   $errors;
        $_SESSION['inputs'] =   $inputs;
    }

    header('Location: index.php', true, 303);
    exit;
}Linguagem de código:  PHP  ( php )

Como funciona.

Primeiro, mostre o formulário de contato se o método de solicitação HTTP for GET. Além disso, obtenha os dados $message, $errorse $inputsdo arquivo $_SESSION.

Em segundo lugar, lide com o envio do formulário se o método de solicitação HTTP for POST, envie um e-mail se não houver erro e redirecione para o formulário de contato. Observe que usamos a técnica PRG (Post-Redirect-Get) para evitar o problema de envio duplo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *