📧 Configurar Email para Formulario de Contacto
🔴 Problema
El formulario de contacto no envía emails porque faltan las variables de entorno SMTP.
Estado actual:
- ✅ Código implementado y funcional
- ✅ Tests pasando (80%+ coverage)
- ❌ Variables de entorno NO configuradas
- ❌ Emails NO se envían
✅ Solución
Configurar las 6 variables de entorno requeridas:
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=angel@gestionominegocio.es
EMAIL_PASSWORD=xxxx xxxx xxxx xxxx # Gmail App Password
EMAIL_FROM=angel@gestionominegocio.es
EMAIL_TO=angel@gestionominegocio.es
📋 Tareas
1. Crear .env.local para desarrollo
Archivo: apps/portfolio/.env.local
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=angel@gestionominegocio.es
EMAIL_PASSWORD=xxxx xxxx xxxx xxxx
EMAIL_FROM=angel@gestionominegocio.es
EMAIL_TO=angel@gestionominegocio.es
Obtener Gmail App Password:
- Ir a: https://myaccount.google.com/security
- Activar "Verificación en 2 pasos" (requisito)
- Buscar "Contraseñas de aplicaciones"
- Seleccionar "Correo" → "Otro"
- Copiar código de 16 dígitos
- Pegar en
EMAIL_PASSWORD (mantener espacios)
⏱️ Tiempo: 10-15 minutos
2. Crear .env.example como documentación
Archivo: apps/portfolio/.env.example
# Email Configuration (Required for Contact Form)
# Copy this file to .env.local and fill with your SMTP credentials
# SMTP Server
EMAIL_HOST=smtp.example.com
# SMTP Port (587 for TLS, 465 for SSL)
EMAIL_PORT=587
# SMTP User
EMAIL_USER=your-email@example.com
# SMTP Password (Gmail: use App Password)
EMAIL_PASSWORD=your-app-password
# Email From Address
EMAIL_FROM=noreply@example.com
# Email To Address (where messages are sent)
EMAIL_TO=contact@example.com
⏱️ Tiempo: 5 minutos
3. Configurar variables en Vercel (Producción)
Pasos:
- Ir a: https://vercel.com/dashboard
- Seleccionar proyecto "DevPortfolio"
- Settings → Environment Variables
- Añadir cada variable:
- Click Save en cada una
- Redeploy la aplicación (obligatorio)
⏱️ Tiempo: 10 minutos + redeploy (3 min)
4. Probar en desarrollo
cd apps/portfolio
npm run dev
- Abrir: http://localhost:3002
- Scroll a sección Contacto
- Llenar formulario:
- Click "Enviar mensaje"
Resultado esperado:
- ✅ Mensaje verde de éxito
- ✅ Formulario se limpia
- ✅ Email recibido en
EMAIL_TO
⏱️ Tiempo: 5 minutos
5. Verificar en producción
- Ir a: https://desenvolupadormaster.vercel.app
- Sección Contacto → Enviar mensaje de prueba
- Verificar email recibido
⏱️ Tiempo: 5 minutos
⚙️ Proveedores SMTP Alternativos
Gmail (Recomendado para desarrollo)
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=tu.email@gmail.com
EMAIL_PASSWORD=[App Password de 16 dígitos]
- ✅ Gratis
- ✅ Fácil configuración
- ⚠️ Requiere App Password
- ⚠️ Límite: 500 emails/día
SendGrid (Profesional)
EMAIL_HOST=smtp.sendgrid.net
EMAIL_PORT=587
EMAIL_USER=apikey
EMAIL_PASSWORD=[Tu API Key]
- ✅ 100 emails/día gratis
- ✅ Mejor deliverability
- ✅ Analytics incluido
Mailgun (Profesional)
EMAIL_HOST=smtp.mailgun.org
EMAIL_PORT=587
EMAIL_USER=postmaster@mg.tudominio.com
EMAIL_PASSWORD=[API Key]
- ✅ API flexible
- ✅ Buen soporte
🐛 Troubleshooting
Error: "Email configuration is incomplete"
Causa: Faltan variables de entorno
Solución:
- Verificar
.env.local existe en apps/portfolio/
- Verificar tiene las 6 variables
- Reiniciar
npm run dev
Error: "Invalid login" (Gmail)
Causa: Usando contraseña normal en vez de App Password
Solución:
- Generar App Password en: https://myaccount.google.com/apppasswords
- Usar ese código en
EMAIL_PASSWORD
Error: "Connection timeout"
Causa: Puerto o host incorrecto
Solución:
- Usar
smtp.gmail.com y puerto 587
- Verificar firewall
Email llega a spam
Solución temporal:
Solución permanente:
- Usar SendGrid con dominio verificado
- Configurar SPF/DKIM
✅ Checklist de Implementación
Local (Desarrollo)
Documentación
Producción (Vercel)
⏱️ Tiempo Total Estimado
| Tarea |
Tiempo |
Crear .env.local |
10-15 min |
Crear .env.example |
5 min |
| Configurar Vercel |
10 min |
| Redeploy |
3 min |
| Probar desarrollo |
5 min |
| Probar producción |
5 min |
| Total |
40-45 min |
🎯 Resultado Esperado
✅ Formulario de contacto funcional en desarrollo
✅ Formulario de contacto funcional en producción
✅ Emails llegan correctamente
✅ Documentación completa en .env.example
✅ Zero cambios de código (solo configuración)
📚 Recursos
Prioridad: 🔴 ALTA
Complejidad: 🟢 BAJA (solo configuración)
Impacto: 🔴 ALTO (contactabilidad del portfolio)
📧 Configurar Email para Formulario de Contacto
🔴 Problema
El formulario de contacto no envía emails porque faltan las variables de entorno SMTP.
Estado actual:
✅ Solución
Configurar las 6 variables de entorno requeridas:
📋 Tareas
1. Crear
.env.localpara desarrolloArchivo:
apps/portfolio/.env.localObtener Gmail App Password:
EMAIL_PASSWORD(mantener espacios)⏱️ Tiempo: 10-15 minutos
2. Crear
.env.examplecomo documentaciónArchivo:
apps/portfolio/.env.example⏱️ Tiempo: 5 minutos
3. Configurar variables en Vercel (Producción)
Pasos:
⏱️ Tiempo: 10 minutos + redeploy (3 min)
4. Probar en desarrollo
cd apps/portfolio npm run devResultado esperado:
EMAIL_TO⏱️ Tiempo: 5 minutos
5. Verificar en producción
⏱️ Tiempo: 5 minutos
⚙️ Proveedores SMTP Alternativos
Gmail (Recomendado para desarrollo)
SendGrid (Profesional)
Mailgun (Profesional)
🐛 Troubleshooting
Error: "Email configuration is incomplete"
Causa: Faltan variables de entorno
Solución:
.env.localexiste enapps/portfolio/npm run devError: "Invalid login" (Gmail)
Causa: Usando contraseña normal en vez de App Password
Solución:
EMAIL_PASSWORDError: "Connection timeout"
Causa: Puerto o host incorrecto
Solución:
smtp.gmail.comy puerto587Email llega a spam
Solución temporal:
Solución permanente:
✅ Checklist de Implementación
Local (Desarrollo)
apps/portfolio/.env.localnpm run devDocumentación
apps/portfolio/.env.example.env.exampleal repo.env.localestá en.gitignoreProducción (Vercel)
⏱️ Tiempo Total Estimado
.env.local.env.example🎯 Resultado Esperado
✅ Formulario de contacto funcional en desarrollo
✅ Formulario de contacto funcional en producción
✅ Emails llegan correctamente
✅ Documentación completa en
.env.example✅ Zero cambios de código (solo configuración)
📚 Recursos
Prioridad: 🔴 ALTA
Complejidad: 🟢 BAJA (solo configuración)
Impacto: 🔴 ALTO (contactabilidad del portfolio)