Aquí vamos a montar un formulario de contacto profesional y funcional con: Formulario embebido (contacto.html o dentro de tu página)
Procesado en servidor (enviar.php), validación básica en el navegador y protección mínima contra spam (honeypot).
Aquí tienes una versión profesional del formulario de contacto con campos extra, incluyendo:
- Aceptación de Política de Privacidad (RGPD)
- Selección de motivo de contacto
- Checkbox para consentimiento de comunicaciones
- Campo de empresa
- Campo de archivo adjunto (opcional)
- Protección anti‑spam (honeypot)
Incluyo también el enviar.php actualizado, la página de gracias.html, y todo el código necesario para que funcione.
Formulario profesional con campos extra (HTML)
html
<form action="enviar.php" method="post" enctype="multipart/form-data" class="contact-form" novalidate>
<div class="form-group">
<label for="nombre">Nombre completo *</label>
<input type="text" id="nombre" name="nombre" required>
</div>
<div class="form-group">
<label for="empresa">Empresa (opcional)</label>
<input type="text" id="empresa" name="empresa">
</div>
<div class="form-group">
<label for="email">Correo electrónico *</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="telefono">Teléfono *</label>
<input type="tel" id="telefono" name="telefono" required>
</div>
<div class="form-group">
<label for="motivo">Motivo del contacto *</label>
<select id="motivo" name="motivo" required>
<option value="">Selecciona una opción</option>
<option value="informacion">Solicitud de información</option>
<option value="presupuesto">Presupuesto</option>
<option value="soporte">Soporte técnico</option>
<option value="otros">Otros</option>
</select>
</div>
<div class="form-group">
<label for="mensaje">Mensaje *</label>
<textarea id="mensaje" name="mensaje" rows="5" required></textarea>
</div>
<div class="form-group">
<label for="archivo">Adjuntar archivo (opcional)</label>
<input type="file" id="archivo" name="archivo" accept=".pdf,.jpg,.png,.doc,.docx">
</div>
<!-- Honeypot anti-spam -->
<div style="display:none;">
<label for="website">No rellenar este campo</label>
<input type="text" id="website" name="website">
</div>
<div class="form-group checkbox">
<label>
<input type="checkbox" name="privacidad" required>
Acepto la <a href="/privacidad" target="_blank">Política de Privacidad</a> *
</label>
</div>
<div class="form-group checkbox">
<label>
<input type="checkbox" name="consentimiento">
Deseo recibir comunicaciones comerciales
</label>
</div>
<button type="submit">Enviar mensaje</button>
</form>
<style>
.contact-form {
max-width: 650px;
margin: 0 auto;
font-family: system-ui, sans-serif;
}
.form-group {
margin-bottom: 1rem;
}
.form-group label {
font-weight: 600;
margin-bottom: 0.3rem;
display: block;
}
.form-group input,
.form-group textarea,
.form-group select {
width: 100%;
padding: 0.6rem;
border: 1px solid #ccc;
border-radius: 4px;
}
.checkbox label {
font-weight: normal;
}
button {
background: #4a3b2f;
color: #fff;
padding: 0.7rem 1.4rem;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background: #3a2d24;
}
</style>
Código enviar.php con campos extra + adjuntos + RGPD
php
<?php
$destinatario = "tu-correo@tudominio.com"; // Cambia esto
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
header("Location: contacto.html");
exit;
}
// Honeypot
if (!empty($_POST["website"])) {
exit("Solicitud no válida.");
}
// Validación
$nombre = trim($_POST["nombre"]);
$email = trim($_POST["email"]);
$telefono = trim($_POST["telefono"]);
$empresa = trim($_POST["empresa"]);
$motivo = trim($_POST["motivo"]);
$mensaje = trim($_POST["mensaje"]);
$privacidad = isset($_POST["privacidad"]) ? "Sí" : "No";
$consentimiento = isset($_POST["consentimiento"]) ? "Sí" : "No";
if ($nombre === "" || $email === "" || $telefono === "" || $motivo === "" || $mensaje === "") {
exit("Por favor, rellena todos los campos obligatorios.");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit("Correo electrónico no válido.");
}
// Construcción del mensaje
$asunto = "Nuevo contacto profesional - " . $motivo;
$cuerpo = "Nuevo mensaje desde el formulario:\n\n";
$cuerpo .= "Nombre: $nombre\n";
$cuerpo .= "Empresa: " . ($empresa ?: "No indicada") . "\n";
$cuerpo .= "Email: $email\n";
$cuerpo .= "Teléfono: $telefono\n";
$cuerpo .= "Motivo: $motivo\n\n";
$cuerpo .= "Mensaje:\n$mensaje\n\n";
$cuerpo .= "Acepta privacidad: $privacidad\n";
$cuerpo .= "Consentimiento comercial: $consentimiento\n";
$cuerpo .= "IP del usuario: " . $_SERVER["REMOTE_ADDR"] . "\n";
// Adjuntos
$boundary = md5(time());
$cabeceras = "From: $nombre <$email>\r\n";
$cabeceras .= "Reply-To: $email\r\n";
$cabeceras .= "MIME-Version: 1.0\r\n";
$cabeceras .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$cuerpo_mensaje = "--$boundary\r\n";
$cuerpo_mensaje .= "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
$cuerpo_mensaje .= $cuerpo . "\r\n";
// Si hay archivo adjunto
if (!empty($_FILES["archivo"]["name"])) {
$archivo_tmp = $_FILES["archivo"]["tmp_name"];
$archivo_nombre = $_FILES["archivo"]["name"];
$archivo_tipo = $_FILES["archivo"]["type"];
$archivo_data = chunk_split(base64_encode(file_get_contents($archivo_tmp)));
$cuerpo_mensaje .= "--$boundary\r\n";
$cuerpo_mensaje .= "Content-Type: $archivo_tipo; name=\"$archivo_nombre\"\r\n";
$cuerpo_mensaje .= "Content-Disposition: attachment; filename=\"$archivo_nombre\"\r\n";
$cuerpo_mensaje .= "Content-Transfer-Encoding: base64\r\n\r\n";
$cuerpo_mensaje .= $archivo_data . "\r\n";
}
$cuerpo_mensaje .= "--$boundary--";
// Enviar
if (mail($destinatario, $asunto, $cuerpo_mensaje, $cabeceras)) {
header("Location: gracias.html");
exit;
} else {
exit("Error al enviar el mensaje.");
}
?>
Página gracias.html
html
<!DOCTYPE html> <html lang=»es»> <head> <meta charset=»UTF-8″> <title>Mensaje enviado</title> <style> body { font-family: system-ui, sans-serif; background: #f5f5f5; display: flex; justify-content: center; align-items: center; height: 100vh; } .box { background: white; padding: 2rem; border-radius: 8px; text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.1); } </style> </head> <body> <div class=»box»> <h1>Gracias por tu mensaje</h1> <p>Nos pondremos en contacto contigo lo antes posible.</p> <a href=»index.html»>Volver al inicio</a> </div> </body> </html>
Características del Formulario de Contacto Profesional
Campos incluidos
- Nombre completo
- Empresa (opcional)
- Correo electrónico
- Teléfono
- Motivo del contacto (desplegable con varias opciones)
- Mensaje
- Adjuntar archivo (PDF, imágenes, documentos)
- Aceptación de Política de Privacidad (RGPD)
- Consentimiento para comunicaciones comerciales
- Honeypot anti‑spam (campo oculto)
Funcionalidad del formulario
- Envío mediante POST a
enviar.php - Soporte para archivos adjuntos con
multipart/form-data - Validación básica en navegador (HTML + JavaScript)
- Validación completa en servidor (PHP)
- Redirección automática a gracias.html tras enviar
- Protección anti‑spam mediante honeypot
- Compatible con cualquier hosting con PHP
Seguridad y cumplimiento RGPD
- Campo obligatorio de aceptación de Política de Privacidad
- Registro del consentimiento en el correo recibido
- Validación del email con
filter_var() - Sanitización de campos para evitar inyecciones
- Adjuntos codificados en base64
- No se almacenan datos en servidor (solo se envían por email)
Diseño y experiencia de usuario
- Estilo profesional con colores neutros
- Tipografía moderna y legible
- Botón de envío destacado
- Campos amplios y accesibles
- Compatible con móviles (responsive)
- Estructura clara y ordenada
Código del servidor (enviar.php)
- Procesa todos los campos del formulario
- Maneja adjuntos con MIME multipart
- Envía correo con todos los datos organizados
- Redirige a página de agradecimiento
- Devuelve errores claros si algo falla
Página de confirmación (gracias.html)
- Mensaje profesional de confirmación
- Diseño limpio y centrado
- Enlace para volver a la página principal
Ventajas técnicas
- No requiere bases de datos
- Compatible con cualquier hosting
- Fácil de integrar en WordPress, HTML o PHP
- Código limpio y editable
- Preparado para añadir reCAPTCHA v3 si lo deseas
Resumen
| Categoría | Características |
|---|---|
| Campos | Nombre, empresa, email, teléfono, motivo, mensaje, adjunto, RGPD |
| Seguridad | Honeypot, validación PHP, RGPD, sanitización |
| Funcionalidad | Adjuntos, redirección, validación, envío por email |
| Diseño | Profesional, responsive, accesible |
| Servidor | PHP con MIME multipart y control de errores |