# Configuración de Correos Electrónicos - Ticketera

## Descripción
Sistema automatizado de envío de correos electrónicos para activación de usuarios con diseño profesional y validación de tokens.

## Características Implementadas

### ✅ Envío Automático de Correos
- Al crear un usuario, se envía automáticamente un correo de bienvenida
- Template HTML profesional con diseño responsive
- Validación de 48 horas para tokens de activación
- Función de reenvío de correos de activación

### ✅ Diseño del Correo
- Diseño moderno con gradiente morado
- Responsive para dispositivos móviles
- Botón CTA (Call To Action) prominente
- Información del usuario claramente visible
- Consejos de seguridad para contraseñas
- Enlace alternativo en caso de problemas con el botón
- Footer profesional con información del sistema

## Configuración SMTP

### Opción 1: Gmail (Recomendado para desarrollo)

1. **Habilitar verificación en 2 pasos en tu cuenta de Gmail**
   - Ve a https://myaccount.google.com/security
   - Activa "Verificación en 2 pasos"

2. **Generar contraseña de aplicación**
   - Ve a https://myaccount.google.com/apppasswords
   - Selecciona "Correo" y "Otro (nombre personalizado)"
   - Escribe "Ticketera" y haz clic en Generar
   - Copia la contraseña de 16 caracteres (sin espacios)

3. **Actualizar archivo `.env`**
```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tu-correo@gmail.com
MAIL_PASSWORD=tu-app-password-de-16-caracteres
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@ticketera.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### Opción 2: Outlook/Hotmail

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp-mail.outlook.com
MAIL_PORT=587
MAIL_USERNAME=tu-correo@outlook.com
MAIL_PASSWORD=tu-contraseña
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@ticketera.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### Opción 3: Mailtrap (Solo para desarrollo/testing)

Mailtrap captura todos los correos sin enviarlos realmente, perfecto para pruebas.

1. Crear cuenta en https://mailtrap.io
2. Obtener credenciales SMTP de tu inbox
3. Configurar:

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=tu-mailtrap-username
MAIL_PASSWORD=tu-mailtrap-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@ticketera.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### Opción 4: Servidor SMTP Propio

```env
MAIL_MAILER=smtp
MAIL_HOST=mail.tudominio.com
MAIL_PORT=587
MAIL_USERNAME=noreply@tudominio.com
MAIL_PASSWORD=tu-contraseña
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tudominio.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### Opción 5: SendGrid (Producción recomendada)

SendGrid es gratuito hasta 100 correos/día.

1. Crear cuenta en https://sendgrid.com
2. Crear API Key en Settings > API Keys
3. Configurar:

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=tu-sendgrid-api-key
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tudominio.com"
MAIL_FROM_NAME="${APP_NAME}"
```

## Archivos Creados

### 1. Clase Mailable
**Archivo:** `app/Mail/UserActivationMail.php`
- Define el correo de activación
- Pasa variables al template (user, activationLink)
- Configura el asunto del correo

### 2. Template de Correo
**Archivo:** `resources/views/emails/user-activation.blade.php`
- Diseño HTML completo con CSS inline
- Información del usuario
- Botón de activación prominente
- Instrucciones paso a paso
- Consejos de seguridad
- Enlace alternativo

### 3. Controlador Actualizado
**Archivo:** `app/Http/Controllers/UserController.php`
- `store()`: Envía correo automáticamente al crear usuario
- `resendActivation()`: Reenvía correo si el usuario no lo recibió
- `showActivationForm()`: Valida token y expiración (48 horas)
- `activate()`: Activa cuenta y establece contraseña

### 4. Rutas Agregadas
**Archivo:** `routes/web.php`
- POST `/users/{user}/resend-activation`: Reenviar correo

### 5. Vista Actualizada
**Archivo:** `resources/views/users/show.blade.php`
- Botón "Reenviar Activación" para usuarios inactivos

## Flujo Completo

### 1. Administrador crea usuario
```
Dashboard > Usuarios > Nuevo Usuario
```

### 2. Sistema envía correo automáticamente
```php
Mail::to($user->email)->send(new UserActivationMail($user, $activationLink));
```

### 3. Usuario recibe correo
- Asunto: "Bienvenido a Ticketera - Activa tu cuenta"
- Contenido: Diseño profesional con información y botón CTA

### 4. Usuario hace clic en "Activar mi cuenta"
- Se valida el token
- Se verifica que no haya expirado (48 horas)
- Se muestra formulario de establecimiento de contraseña

### 5. Usuario establece contraseña
- Mínimo 8 caracteres
- Confirma la contraseña
- Sistema activa la cuenta

### 6. Usuario puede iniciar sesión
- Con su correo y la contraseña que estableció

## Validaciones de Seguridad

### Token único de 64 caracteres
```php
$activationToken = Str::random(64);
```

### Expiración de 48 horas
```php
if ($user->activation_token_sent_at->addHours(48)->isPast()) {
    return redirect()->route('login')->with('error', 'Token expirado');
}
```

### Verificación de uso único
```php
if ($user->is_active && $user->activation_token === null) {
    return redirect()->route('login')->with('error', 'Cuenta ya activada');
}
```

### Usuario inactivo hasta activación
```php
'is_active' => false, // Al crear
'is_active' => true,  // Al activar
```

## Manejo de Errores

### Error en envío de correo
Si falla el envío (configuración SMTP incorrecta, etc.), el sistema muestra el enlace de activación manualmente:

```php
try {
    Mail::to($user->email)->send(new UserActivationMail($user, $activationLink));
    return redirect()->route('users.index')->with('success', 
        'Correo enviado exitosamente a ' . $user->email);
} catch (\Exception $e) {
    return redirect()->route('users.index')->with('success', 
        'Error al enviar correo. Link de activación: ' . $activationLink);
}
```

## Testing

### 1. Configurar Mailtrap (Recomendado para pruebas)
- No envía correos reales
- Captura todos los correos en un inbox virtual
- Permite inspeccionar HTML, texto plano, headers, etc.

### 2. Crear usuario de prueba
```
1. Login como admin
2. Ir a Usuarios > Nuevo Usuario
3. Llenar formulario
4. Verificar mensaje de éxito
```

### 3. Verificar correo en Mailtrap
```
1. Abrir Mailtrap inbox
2. Verificar que llegó el correo
3. Inspeccionar diseño HTML
4. Probar enlaces
```

### 4. Activar cuenta
```
1. Copiar enlace del correo
2. Abrir en navegador
3. Establecer contraseña
4. Iniciar sesión
```

## Comandos Útiles

### Ver cola de correos (si usas queue)
```bash
php artisan queue:work
```

### Limpiar cache de config
```bash
php artisan config:clear
php artisan cache:clear
```

### Probar envío de correo
Crear ruta temporal en `routes/web.php`:
```php
Route::get('/test-mail', function() {
    $user = \App\Models\User::first();
    $activationLink = 'http://ejemplo.com/activate/test123';
    
    try {
        Mail::to('test@example.com')->send(new \App\Mail\UserActivationMail($user, $activationLink));
        return 'Correo enviado';
    } catch (\Exception $e) {
        return 'Error: ' . $e->getMessage();
    }
});
```

## Características del Template de Correo

### Diseño Visual
- ✅ Header con gradiente morado (667eea → 764ba2)
- ✅ Logo e icono de Ticketera
- ✅ Información del usuario en tarjeta destacada
- ✅ Botón CTA grande y atractivo
- ✅ Secciones claramente diferenciadas
- ✅ Íconos visuales (⏰, 🔒)
- ✅ Footer profesional

### Contenido
- ✅ Mensaje de bienvenida personalizado
- ✅ Datos del usuario (nombre, email, rol)
- ✅ Instrucciones paso a paso (lista numerada)
- ✅ Consejos de seguridad (lista con viñetas)
- ✅ Enlace alternativo en texto plano
- ✅ Información de validez del token (48 horas)
- ✅ Mensaje de soporte

### Responsive
- ✅ Max-width: 600px
- ✅ Padding responsive
- ✅ Botones táctiles grandes
- ✅ Texto legible en móviles

## Troubleshooting

### Error: "Connection could not be established with host"
**Solución:**
1. Verificar credenciales SMTP
2. Verificar puerto (587 para TLS, 465 para SSL)
3. Verificar firewall/antivirus
4. Probar con Mailtrap primero

### Error: "Authentication failed"
**Solución:**
1. Gmail: Usar App Password, no contraseña normal
2. Verificar que el correo/usuario sea correcto
3. Verificar que la contraseña no tenga espacios

### Correo no llega
**Solución:**
1. Revisar carpeta de spam
2. Verificar que MAIL_FROM_ADDRESS sea válido
3. Usar Mailtrap para debugging
4. Verificar logs: `storage/logs/laravel.log`

### Token expirado
**Solución:**
1. Admin usa botón "Reenviar Activación" en perfil del usuario
2. Se genera nuevo token con 48 horas más

## Mejoras Futuras Sugeridas

### 1. Cola de correos (Queue)
Enviar correos en segundo plano para no bloquear la respuesta:
```php
Mail::to($user->email)->queue(new UserActivationMail($user, $activationLink));
```

### 2. Notificaciones adicionales
- Correo de bienvenida después de activar
- Notificación de ticket asignado
- Resumen diario de tickets
- Alertas de tickets críticos

### 3. Personalización
- Logo personalizado en el correo
- Colores corporativos configurables
- Firma personalizada del administrador

### 4. Tracking
- Registrar si el correo fue abierto
- Registrar si el enlace fue clickeado
- Dashboard de estadísticas de activación

## Seguridad

### Recomendaciones
- ✅ No usar contraseña de Gmail principal
- ✅ Usar App Passwords de Gmail
- ✅ No commitear credenciales al repositorio
- ✅ Usar variables de entorno (.env)
- ✅ Regenerar tokens si hay sospecha de compromiso
- ✅ Limitar intentos de activación
- ✅ Log de intentos de activación

### Variables Sensibles
Nunca incluir en Git:
- `.env` (ya está en `.gitignore`)
- Credenciales SMTP
- API Keys
- Contraseñas

## Licencias
- Bootstrap 5: MIT License
- Bootstrap Icons: MIT License
- Laravel Mail: MIT License

---

**Última actualización:** {{ date('Y-m-d') }}
**Autor:** Sistema Ticketera
**Versión:** 1.0.0
