En este tutorial aprenderás a enviar correos desde PHP usando PHPMailer, sin necesidad de Composer ni acceso SSH, ideal para planes de hosting compartido.
Además, añadiremos una protección anti-spam para evitar envíos automáticos.
✅ Requisitos
- Hosting con PHP 7.4 o superior
- Acceso a cPanel o File Manager, o FTP
- Una cuenta de correo configurada en el hosting
- PHPMailer (descarga manual)
Estructura de archivos recomendada
public_html/
├── form.html
├── ejemplo_envio.php
└── lib/
└── PHPMailer/
└── src/
├── PHPMailer.php
├── SMTP.php
└── Exception.php
💡 Consejo de seguridad:
Si es posible, coloca la carpetalib/fuera depublic_html.
📦 Paso 1: Descargar PHPMailer
- Ve al sitio oficial:
https://github.com/PHPMailer/PHPMailer - Descarga la versión estable (ZIP)
- Extrae y sube solo esta carpeta:
PHPMailer/src/
🧾 Paso 2: Crear el formulario HTML (form.html)
Incluimos un campo honeypot invisible para bloquear bots.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Formulario de contacto</title>
<style>
.hp { display: none; }
</style>
</head>
<body>
<h2>Formulario de contacto</h2>
<form method="post" action="ejemplo_envio.php">
<label>Email:</label><br>
<input type="email" name="email" required><br><br>
<label>Mensaje:</label><br>
<textarea name="mensaje" rows="5" required></textarea><br><br>
<!-- Honeypot anti-spam -->
<div class="hp">
<input type="text" name="website">
</div>
<button type="submit">Enviar</button>
</form>
</body>
</html>
🔐 ¿Qué es esto?
Los humanos no ven el campo website, pero los bots sí.
Si viene relleno → se bloquea el envío.
✉️ Paso 3: Script PHP con PHPMailer (ejemplo_envio.php)
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// Cargar PHPMailer manualmente
require __DIR__ . '/lib/PHPMailer/src/Exception.php';
require __DIR__ . '/lib/PHPMailer/src/PHPMailer.php';
require __DIR__ . '/lib/PHPMailer/src/SMTP.php';
// Solo permitir POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
exit('Acceso no permitido');
}
// Honeypot anti-spam
if (!empty($_POST['website'])) {
exit('Spam detectado');
}
// Validar datos
$emailDestino = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$mensaje = trim($_POST['mensaje']);
if (!$emailDestino || empty($mensaje)) {
exit('Datos inválidos');
}
$mail = new PHPMailer(true);
try {
// CONFIGURACIÓN SMTP
$mail->isSMTP();
$mail->Host = 'mail.tudominio.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'PASSWORD_DEL_CORREO';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// DATOS DEL MENSAJE
$mail->setFrom('[email protected]', 'Formulario Web');
$mail->addAddress($emailDestino);
$mail->Subject = 'Mensaje desde el formulario';
$mail->Body = $mensaje;
$mail->send();
echo '✅ Mensaje enviado correctamente';
} catch (Exception $e) {
echo '❌ Error al enviar el mensaje';
}
🔐 Medidas anti-spam incluidas
✔ Honeypot invisible (muy efectivo)
✔ Validación de método POST
✔ Validación de email
✔ SMTP autenticado
👉 En la mayoría de los casos NO necesitas CAPTCHA.
🧩 (Opcional) Protección adicional con Google reCAPTCHA
Si el formulario es público y recibe mucho spam, puedes añadir:
- Google reCAPTCHA v2 o v3
- Validación server-side antes de enviar el correo
📌 Recomendado solo para sitios con alto tráfico.
🧠 Errores comunes y solución
| Problema | Solución |
|---|---|
| No llegan correos | Revisar SMTP / contraseña |
| Va a spam | Configurar SPF y DKIM |
| Error de conexión | Revisar puerto 587 |
| Página en blanco | Activar errores PHP |
📌 Conclusión
- PHPMailer no requiere Composer
- Funciona perfectamente en hosting compartido
- Es seguro y fácil de implementar
- El honeypot bloquea la mayoría del spam
- Ideal para formularios de contacto
📞 ¿Necesitas ayuda?
Si tienes problemas con el envío de correos o la configuración SMTP, abre un ticket en nuestro soporte técnico y con gusto te ayudaremos.