- Cómo funciona un sistema de notificaciones por email
- Integración con una API de terceros (EmailJS) desde el frontend
- Programación orientada a eventos en JavaScript (event listeners)
- Manejo de estados asíncronos con
async/await - Despliegue de un sitio estático en GitHub Pages
[Usuario] → llena el form → [JavaScript] → llama a [EmailJS API]
↓
[Servidor de EmailJS] envía el email
↓
[Dueño del portafolio] recibe notificación
EmailJS actúa como intermediario: recibe los datos del formulario y los entrega al servidor de correo (Gmail, Outlook, etc.) sin necesidad de un backend propio.
- Ve a https://www.emailjs.com y regístrate (gratis)
- El plan gratuito permite 200 emails/mes — más que suficiente para el lab
- En el dashboard, ve a Email Services → Add New Service
- Elige Gmail (recomendado para el lab)
- Conecta tu cuenta de Google cuando te lo pida
- Copia el Service ID (ejemplo:
service_abc123)
- Ve a Email Templates → Create New Template
- Configura el template así:
| Campo | Valor |
|---|---|
| To Email | tu-email@gmail.com (el que recibirá las notificaciones) |
| From Name | {{from_name}} |
| Reply To | {{from_email}} |
| Subject | Nuevo mensaje: {{subject}} |
Body del email:
Hola, tienes un nuevo mensaje desde tu portafolio.
Nombre: {{from_name}}
Email: {{from_email}}
Asunto: {{subject}}
Mensaje:
{{message}}
---
Enviado desde tu portafolio web.
- Guarda y copia el Template ID (ejemplo:
template_xyz789)
- Ve a Account → API Keys
- Copia tu Public Key (ejemplo:
aBcDeFgHiJkLmNoP)
La Public Key vive en el JavaScript del frontend, así que cualquiera puede verla inspeccionando el código. Sin protección, alguien podría copiarla y enviar emails usando tu cuenta.
Solución: restringir qué dominios pueden usar tu key.
- En el dashboard de EmailJS ve a Account → Security
- En Allowed Origins, agrega únicamente tu dominio de GitHub Pages:
https://TU_USUARIO.github.io - Guarda. A partir de ese momento, cualquier petición desde otro origen será rechazada automáticamente por EmailJS.
Mientras desarrollas localmente (abriendo el
.htmldesde el disco), EmailJS no valida origen. Solo agrega el dominio de producción cuando hagas el deploy a GitHub Pages.
Las credenciales nunca se escriben directamente en el código. En su lugar:
- Copia el archivo de ejemplo:
cp js/config.example.js js/config.js
- Abre
js/config.jsy reemplaza los valores:const EMAILJS_PUBLIC_KEY = 'aBcDeFgHiJkLmNoP'; const EMAILJS_SERVICE_ID = 'service_abc123'; const EMAILJS_TEMPLATE_ID = 'template_xyz789';
js/config.jsestá en.gitignore→ nunca se sube al repositorio
Los valores se guardan como Secrets en GitHub y el pipeline los inyecta
en js/config.js durante el despliegue, sin que aparezcan en el código:
Secrets (GitHub) → GitHub Actions → genera config.js → despliega en Pages
¿Qué protege esto exactamente?
- Las credenciales no aparecen en el historial de git
- Si alguien forkea tu repo, no obtiene las credenciales
- Los valores sí son visibles en el JS que el navegador descarga
Por eso el Allowlist de dominios (paso 1.5) sigue siendo necesario: juntos garantizan que las credenciales no están en el repo Y solo funcionan desde tu dominio.
Edita index.html y cambia:
- Tu nombre (busca "Alex García")
- Tu título profesional (hero section)
- Tu descripción en "Sobre mí"
- Tus skills (badges en la sección Sobre mí)
- Los proyectos (nombres, descripciones, tecnologías)
- Tu foto (reemplaza la imagen de placeholder con una etiqueta
<img>propia)
- Abre
index.htmldirectamente en el navegador - Llena el formulario de contacto
- Haz clic en "Enviar mensaje"
- Revisa tu bandeja de entrada (puede tardar hasta 1 minuto)
- Abre la consola del navegador (
F12) para ver los logs
Resultado esperado:
- El botón muestra un spinner mientras envía
- Aparece el mensaje "Mensaje enviado correctamente"
- Recibes un email en la cuenta configurada en el template
# 1. Inicializa un repositorio Git
git init
git add .
git commit -m "feat: portafolio con sistema de notificaciones"
# 2. Crea un repositorio en GitHub (sin README) y conéctalo
git remote add origin https://github.com/TU_USUARIO/mi-portafolio.git
git branch -M main
git push -u origin mainAntes de activar Pages, agrega las credenciales de EmailJS como Secrets:
- Ve a tu repositorio → Settings → Secrets and variables → Actions
- Crea 3 secrets con New repository secret:
| Name | Value |
|---|---|
EMAILJS_PUBLIC_KEY |
tu Public Key |
EMAILJS_SERVICE_ID |
tu Service ID |
EMAILJS_TEMPLATE_ID |
tu Template ID |
- Ve a Settings → Pages
- En Source selecciona: GitHub Actions
- Haz un push cualquier a
main(o re-corre el workflow manualmente) - El pipeline genera
config.jscon los secrets y despliega el sitio - Tu sitio estará en
https://TU_USUARIO.github.io/mi-portafolio
El workflow vive en
.github/workflows/deploy.ymly se ejecuta automáticamente en cada push amain.
mi-portafolio/
├── index.html ← Página principal (estructura HTML)
├── css/
│ └── style.css ← Estilos personalizados (animaciones, componentes)
├── js/
│ └── main.js ← Lógica JavaScript + sistema de notificaciones
└── README.md ← Esta guía
- ¿Por qué se usa
event.preventDefault()en el formulario? - ¿Qué ventaja tiene usar
async/awaitfrente a callbacks para el envío del email? - ¿Cuál es la diferencia entre el
Service IDy elTemplate IDen EmailJS? - ¿Qué pasa si el usuario envía el formulario sin conexión a internet?
- ¿Por qué se valida el formulario en el cliente antes de llamar a la API?
- ¿Es seguro usar la Public Key de EmailJS en el código frontend? ¿Qué riesgo existe y cómo lo mitiga el Allowlist de dominios?
- ¿Qué alternativa existiría si necesitáramos enviar emails con mayor control (ej. con archivos adjuntos, historial, etc.)?
- Agregar reCAPTCHA para evitar spam en el formulario
- Guardar los mensajes en una base de datos (Supabase, Firebase)
- Enviar una confirmación al remitente (segundo template en EmailJS)
- Analitics con Google Analytics o Plausible
| Tecnología | Rol | Por qué |
|---|---|---|
| HTML/CSS/JS | Frontend | Base del portafolio |
| CSS | Estilos | Estándar, sin dependencias, fácil de modificar |
| EmailJS | Notificaciones | API gratuita, sin backend |
| GitHub Pages | Hosting | Gratuito, integrado con Git |