

# 📧 Respuestas - Configuración de Emails en La Mundial CMS

---

# 🚀 INICIO RÁPIDO: Usar desde Node.js

## 📍 URL del API
```
POST https://qaapi.lamundialdeseguros.com/api/sendmailer/
```

## 📦 JSON del Request
```json
{
  "address": "destinatario@ejemplo.com",
  "name": "Nombre Destinatario",
  "subject": "Asunto del correo",
  "body": "<html><body><h1>Contenido HTML</h1></body></html>"
}
```

## 💻 Código Node.js (Copiar y pegar)

### Con Axios
```javascript
const axios = require('axios');

async function sendEmail(email, nombre, asunto, htmlBody) {
  try {
    const response = await axios.post(
      'https://qaapi.lamundialdeseguros.com/api/sendmailer/',
      {
        address: email,
        name: nombre,
        subject: asunto,
        body: htmlBody
      },
      {
        headers: { 'Content-Type': 'application/json' },
        timeout: 30000
      }
    );
    
    return response.data; // { success: true, message: "Email enviado correctamente", code: 200 }
  } catch (error) {
    console.error('Error:', error.response?.data);
    throw error;
  }
}

// USO:
await sendEmail(
  'usuario@ejemplo.com',
  'Juan Pérez',
  'Tu código OTP',
  '<h1>Tu código es: 123456</h1>'
);
```

### Con Fetch (Native)
```javascript
async function sendEmail(email, nombre, asunto, htmlBody) {
  const response = await fetch('https://qaapi.lamundialdeseguros.com/api/sendmailer/', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      address: email,
      name: nombre,
      subject: asunto,
      body: htmlBody
    })
  });
  
  return await response.json();
}
```

## ✅ Respuesta Success
```json
{
  "success": true,
  "message": "Email enviado correctamente",
  "code": 200,
  "recipient": "destinatario@ejemplo.com"
}
```

## ❌ Respuesta Error
```json
{
  "success": false,
  "message": "Email inválido",
  "code": 400
}
```

---

## 🎯 Ejemplo para OTP

```javascript
// emailService.js
const axios = require('axios');

class EmailService {
  constructor() {
    this.apiUrl = 'https://qaapi.lamundialdeseguros.com/api/sendmailer/';
  }

  async sendOTP(email, name, otpCode) {
    const html = `
      <!DOCTYPE html>
      <html>
      <body style="font-family: Arial; max-width: 600px; margin: 0 auto;">
        <div style="background: #0066cc; color: white; padding: 20px; text-align: center;">
          <h1>Recuperación de Contraseña</h1>
        </div>
        <div style="padding: 30px; background: #f5f5f5;">
          <p>Hola ${name},</p>
          <p>Tu código de verificación es:</p>
          <div style="font-size: 32px; font-weight: bold; color: #0066cc; 
                      text-align: center; padding: 20px; background: white; 
                      border-radius: 5px; margin: 20px 0;">
            ${otpCode}
          </div>
          <p>Este código expirará en 10 minutos.</p>
        </div>
      </body>
      </html>
    `;

    try {
      const response = await axios.post(this.apiUrl, {
        address: email,
        name: name,
        subject: 'Tu código de verificación - La Mundial',
        body: html
      }, {
        headers: { 'Content-Type': 'application/json' },
        timeout: 30000
      });

      return { success: true, data: response.data };
    } catch (error) {
      console.error('Error enviando OTP:', error.response?.data || error.message);
      return { success: false, error: error.response?.data || error.message };
    }
  }
}

module.exports = EmailService;

// USO en tu controlador:
// const EmailService = require('./emailService');
// const emailService = new EmailService();
// await emailService.sendOTP('usuario@ejemplo.com', 'Juan Pérez', '123456');
```

---

## 🎯 Análisis del Sistema Actual

Basado en el análisis del código del proyecto **lamundialcms**, se encontró la implementación de envío de emails usando **PHPMailer**, pero **NO existe una API `/sendmailer/`** en este proyecto.

---

## ✅ Hallazgos en el Código

### 📂 Archivos Relacionados
- `@c:\xampp\htdocs\lamundialcms\core\includes\send_email.php`
- `@c:\xampp\htdocs\lamundialcms\core\includes\send_email2.php`
- `@c:\xampp\htdocs\lamundialcms\core\includes\send_email_pdf.php`

---

## 📝 Respuestas a las Preguntas

### 1️⃣ ¿Los emails SÍ llegan desde el otro programa?
```
❌ NO APLICA - No existe API /sendmailer/ en este proyecto
✅ El proyecto usa PHPMailer directamente en PHP
```

---

### 2️⃣ Código Exacto del Request

**NO existe una API REST `/sendmailer/`** en este proyecto. En su lugar, el sistema usa clases PHP con PHPMailer.

**Implementación encontrada:**

```php
// Archivo: send_email.php
require('PHPMailer-master/src/Exception.php');
require('PHPMailer-master/src/PHPMailer.php');
require('PHPMailer-master/src/SMTP.php');
use PHPMailer\PHPMailer\PHPMailer;

$email = new emails();
$email->send_email($destinatario, $nombre, $asunto, $body_html);
```

**Funciones disponibles en la clase `emails`:**
- `send_email()` - Envío estándar con info@lamundialdeseguros.com
- `send_email_localhost()` - Envío de prueba con Gmail
- `send_email_api()` - Envío con adjunto de documentación API
- `send_email_card_api()` - Envío con adjunto de registro en caja
- `send_campaign()` - Envío masivo de campañas

---

### 3️⃣ Estructura del Body HTML

```
✅ HTML completo con etiquetas MsgHTML()
```

El sistema acepta HTML completo y usa el método `MsgHTML()` de PHPMailer:

```php
$correo->MsgHTML($body_html);
```

**Ejemplo de uso:**
```html
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>Título del mensaje</h1>
    <p>Contenido del correo</p>
</body>
</html>
```

---

### 4️⃣ Parámetros del Request

**Para la función `send_email()`:**

```php
function send_email($email, $name, $asunto, $body_html)
```

**Parámetros:**
```php
{
    "email": "destinatario@ejemplo.com",  // Email del destinatario
    "name": "Nombre Destinatario",         // Nombre del destinatario
    "asunto": "Asunto del correo",         // Asunto
    "body_html": "<html>...</html>"        // Cuerpo HTML completo
}
```

**NO se usan:**
- ❌ `from` - Se define en la configuración SMTP
- ❌ `replyTo` - Se define en la configuración SMTP
- ❌ `cc` - No implementado
- ❌ `bcc` - No implementado
- ⚠️ `attachments` - Solo en funciones específicas

---

### 5️⃣ Headers HTTP

```
❌ NO APLICA - No es una API REST
✅ Es una clase PHP que se importa directamente
```

**Cómo se usa:**
```php
require_once('core/includes/send_email.php');
$emailService = new emails();
$resultado = $emailService->send_email($email, $name, $asunto, $body);
```

---

### 6️⃣ Respuesta del Sistema

**Tipo de retorno:**
```php
// Función send_email() retorna:
return $send; // boolean (true/false)

// Función send_campaign() retorna:
return [
    'completos' => $completos,  // Array de emails enviados exitosamente
    'fallidos' => $fallidos,    // Array de emails que fallaron
    'status' => true            // Boolean
];
```

---

### 7️⃣ Desde dónde se llama

```
✅ Backend PHP
```

**Ubicaciones encontradas:**
- `core/controller/reports_buy_controller.php`
- `core/controller/reports_controller.php`
- `core/controller/advisers_controller.php`
- `core/controller/agencies_controller.php`
- `core/controller/api_clients_controller.php`
- Y más controladores...

---

### 8️⃣ Archivo de Código Fuente

**Ubicación principal:**
```
c:\xampp\htdocs\lamundialcms\core\includes\send_email.php
```

**Configuración SMTP completa:**

```php
// CONFIGURACIÓN PRODUCCIÓN (info@lamundialdeseguros.com)
$correo = new PHPMailer;
$correo->IsSMTP();
$correo->SMTPDebug = 0;
$correo->Host = 'mail.lamundialdeseguros.com';
$correo->Port = 25;
$correo->SMTPSecure = 'tls';
$correo->SMTPAuth = false;
$correo->Username = "info@lamundialdeseguros.com";
$correo->Password = "Zxc2020*";

$correo->SetFrom("info@lamundialdeseguros.com", "La mundial de seguros");
$correo->AddReplyTo("info@lamundialdeseguros.com", "La mundial de seguros");
$correo->AddAddress($email, $name);

$correo->CharSet = 'UTF-8';
$correo->Subject = $asunto;
$correo->MsgHTML($body_html);

$send = $correo->Send();
```

---

### 9️⃣ Variables de Entorno

```
❌ NO SE ENCONTRARON variables de entorno para SMTP
```

**Archivo revisado:** `c:\xampp\htdocs\lamundialcms\env.php`
- Solo contiene URLs de Sys2000 (comentadas)
- No hay configuración de email

**La configuración SMTP está hardcodeada en el código:**
- Host: `mail.lamundialdeseguros.com`
- Port: `25`
- Username: `info@lamundialdeseguros.com`
- Password: `Zxc2020*`

---

### 🔟 Testing

```
⚠️ REQUIERE CONFIGURACIÓN
```

**Opciones de prueba:**

**Opción 1 - Entorno de producción:**
```php
require_once('core/includes/send_email.php');
$email = new emails();
$resultado = $email->send_email(
    'aestrada@exelixitech.com',
    'Andrés Estrada',
    'Prueba de Email - La Mundial',
    '<h1>Email de prueba</h1><p>Este es un correo de prueba desde el CMS</p>'
);
```

**Opción 2 - Entorno localhost (Gmail):**
```php
$resultado = $email->send_email_localhost(
    'aestrada@exelixitech.com',
    'Andrés Estrada',
    'Prueba de Email - La Mundial',
    '<h1>Email de prueba</h1><p>Este es un correo de prueba desde localhost</p>'
);
```

---

## 🔍 Conclusión Principal

### ⚠️ **NO EXISTE una API `/sendmailer/` en este proyecto**

El sistema **lamundialcms** implementa el envío de emails mediante:

1. **Clase PHP `emails`** ubicada en `send_email.php`
2. **PHPMailer** como librería de envío SMTP
3. **Métodos directos** llamados desde controladores PHP
4. **Configuración SMTP** apuntando a `mail.lamundialdeseguros.com`

---

---

# 🚀 GUÍA COMPLETA: Implementar API `/sendmailer/` en Otro Proyecto

## 📋 Requisitos Previos

- PHP 7.4 o superior
- Extensión OpenSSL habilitada
- Acceso a servidor SMTP
- Composer (opcional, para instalar PHPMailer)

---

## 🏗️ PASO 1: Instalar PHPMailer

### Opción A: Con Composer (Recomendado)
```bash
cd /ruta/del/proyecto
composer require phpmailer/phpmailer
```

### Opción B: Manual
1. Descargar PHPMailer desde: https://github.com/PHPMailer/PHPMailer/releases
2. Extraer en: `lib/PHPMailer/` o `vendor/phpmailer/`

---

## 🏗️ PASO 2: Crear la Estructura de Archivos

```
proyecto/
├── api/
│   └── sendmailer/
│       └── index.php          # Endpoint principal
├── lib/
│   ├── PHPMailer/             # Librería PHPMailer
│   └── EmailService.php       # Clase de servicio
└── config/
    └── smtp.php               # Configuración SMTP
```

---

## 📄 PASO 3: Archivo de Configuración SMTP

**Archivo:** `config/smtp.php`

```php
<?php
/**
 * Configuración SMTP para envío de emails
 * IMPORTANTE: NO versionar este archivo en Git (.gitignore)
 */

return [
    'host' => 'mail.lamundialdeseguros.com',
    'port' => 25,
    'encryption' => 'tls', // 'tls' o 'ssl'
    'auth' => false,
    'username' => 'info@lamundialdeseguros.com',
    'password' => 'Zxc2020*',
    'from_email' => 'info@lamundialdeseguros.com',
    'from_name' => 'La Mundial de Seguros',
    'debug' => 0, // 0 = producción, 2 = depuración
    'charset' => 'UTF-8',
    'timeout' => 30
];
```

---

## 📄 PASO 4: Clase de Servicio de Email

**Archivo:** `lib/EmailService.php`

```php
<?php

require_once __DIR__ . '/../vendor/phpmailer/phpmailer/src/Exception.php';
require_once __DIR__ . '/../vendor/phpmailer/phpmailer/src/PHPMailer.php';
require_once __DIR__ . '/../vendor/phpmailer/phpmailer/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class EmailService
{
    private $config;
    private $mailer;

    public function __construct($configPath = null)
    {
        // Cargar configuración
        if ($configPath === null) {
            $configPath = __DIR__ . '/../config/smtp.php';
        }
        
        if (!file_exists($configPath)) {
            throw new Exception('Archivo de configuración SMTP no encontrado');
        }
        
        $this->config = require $configPath;
        $this->mailer = new PHPMailer(true);
        $this->setupMailer();
    }

    private function setupMailer()
    {
        try {
            // Configuración del servidor
            $this->mailer->isSMTP();
            $this->mailer->Host = $this->config['host'];
            $this->mailer->Port = $this->config['port'];
            $this->mailer->SMTPSecure = $this->config['encryption'];
            $this->mailer->SMTPAuth = $this->config['auth'];
            $this->mailer->SMTPDebug = $this->config['debug'];
            $this->mailer->Timeout = $this->config['timeout'];

            if ($this->config['auth']) {
                $this->mailer->Username = $this->config['username'];
                $this->mailer->Password = $this->config['password'];
            }

            // Configuración del remitente
            $this->mailer->setFrom(
                $this->config['from_email'],
                $this->config['from_name']
            );
            
            $this->mailer->CharSet = $this->config['charset'];
        } catch (Exception $e) {
            throw new Exception("Error al configurar mailer: {$e->getMessage()}");
        }
    }

    /**
     * Enviar email
     * 
     * @param string $address Email del destinatario
     * @param string $name Nombre del destinatario
     * @param string $subject Asunto del email
     * @param string $body Cuerpo del email (HTML)
     * @return array Resultado del envío
     */
    public function sendEmail($address, $name, $subject, $body)
    {
        try {
            // Validar email
            if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
                return [
                    'success' => false,
                    'message' => 'Email inválido',
                    'code' => 400
                ];
            }

            // Configurar destinatario
            $this->mailer->clearAddresses();
            $this->mailer->addAddress($address, $name);
            
            // Configurar contenido
            $this->mailer->isHTML(true);
            $this->mailer->Subject = $subject;
            $this->mailer->Body = $body;
            $this->mailer->AltBody = strip_tags($body);

            // Enviar
            $sent = $this->mailer->send();

            if ($sent) {
                return [
                    'success' => true,
                    'message' => 'Email enviado correctamente',
                    'code' => 200,
                    'recipient' => $address
                ];
            } else {
                return [
                    'success' => false,
                    'message' => 'Error al enviar el email',
                    'code' => 500,
                    'error' => $this->mailer->ErrorInfo
                ];
            }
        } catch (Exception $e) {
            return [
                'success' => false,
                'message' => 'Excepción al enviar email',
                'code' => 500,
                'error' => $e->getMessage()
            ];
        }
    }

    /**
     * Validar parámetros de entrada
     */
    public static function validateParams($data)
    {
        $errors = [];

        if (empty($data['address'])) {
            $errors[] = 'El campo "address" es requerido';
        }

        if (empty($data['subject'])) {
            $errors[] = 'El campo "subject" es requerido';
        }

        if (empty($data['body'])) {
            $errors[] = 'El campo "body" es requerido';
        }

        return $errors;
    }
}
```

---

## 📄 PASO 5: Endpoint API REST

**Archivo:** `api/sendmailer/index.php`

```php
<?php
/**
 * API REST para envío de emails
 * Endpoint: POST /api/sendmailer/
 * 
 * Body JSON:
 * {
 *   "address": "destinatario@ejemplo.com",
 *   "name": "Nombre Destinatario",
 *   "subject": "Asunto del correo",
 *   "body": "<html><body>Contenido HTML</body></html>"
 * }
 */

// Headers CORS y Content-Type
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Manejar preflight OPTIONS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

// Solo permitir POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode([
        'success' => false,
        'message' => 'Método no permitido. Use POST',
        'code' => 405
    ]);
    exit();
}

// Importar servicio de email
require_once __DIR__ . '/../../lib/EmailService.php';

try {
    // Leer datos del request
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);

    // Validar JSON
    if (json_last_error() !== JSON_ERROR_NONE) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'message' => 'JSON inválido: ' . json_last_error_msg(),
            'code' => 400
        ]);
        exit();
    }

    // Validar parámetros
    $errors = EmailService::validateParams($data);
    if (!empty($errors)) {
        http_response_code(400);
        echo json_encode([
            'success' => false,
            'message' => 'Parámetros faltantes o inválidos',
            'errors' => $errors,
            'code' => 400
        ]);
        exit();
    }

    // Extraer parámetros
    $address = trim($data['address']);
    $name = trim($data['name'] ?? '');
    $subject = trim($data['subject']);
    $body = $data['body'];

    // Rate limiting básico (opcional)
    // Implementar según necesidades (ej: Redis, memcached, etc)

    // Enviar email
    $emailService = new EmailService();
    $result = $emailService->sendEmail($address, $name, $subject, $body);

    // Responder
    http_response_code($result['code']);
    echo json_encode($result);

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error interno del servidor',
        'code' => 500,
        'error' => $e->getMessage()
    ]);
}
```

---

## 🧪 PASO 6: Testing

### Desde cURL (Bash/PowerShell)

```bash
curl -X POST https://qaapi.lamundialdeseguros.com/api/sendmailer/ \
  -H "Content-Type: application/json" \
  -d '{
    "address": "aestrada@exelixitech.com",
    "name": "Andrés Estrada",
    "subject": "Prueba de API Sendmailer",
    "body": "<html><body><h1>Test Email</h1><p>Este es un correo de prueba.</p></body></html>"
  }'
```

### Desde Node.js (Sistema OTP)

**Con Axios:**
```javascript
const axios = require('axios');

async function sendEmail(address, name, subject, body) {
  try {
    const response = await axios.post(
      'https://qaapi.lamundialdeseguros.com/api/sendmailer/',
      {
        address: address,
        name: name,
        subject: subject,
        body: body
      },
      {
        headers: {
          'Content-Type': 'application/json'
        },
        timeout: 30000 // 30 segundos
      }
    );

    console.log('✅ Email enviado:', response.data);
    return response.data;
  } catch (error) {
    console.error('❌ Error al enviar email:', error.response?.data || error.message);
    throw error;
  }
}

// Uso:
sendEmail(
  'usuario@ejemplo.com',
  'Usuario Test',
  'Tu código OTP',
  '<html><body><h1>Tu código OTP es: 123456</h1></body></html>'
);
```

**Con Fetch (Native):**
```javascript
async function sendEmail(address, name, subject, body) {
  try {
    const response = await fetch('https://qaapi.lamundialdeseguros.com/api/sendmailer/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        address: address,
        name: name,
        subject: subject,
        body: body
      })
    });

    const data = await response.json();
    
    if (response.ok) {
      console.log('✅ Email enviado:', data);
      return data;
    } else {
      console.error('❌ Error:', data);
      throw new Error(data.message);
    }
  } catch (error) {
    console.error('❌ Error al enviar email:', error);
    throw error;
  }
}
```

### Desde Postman

1. **Método:** POST
2. **URL:** `https://qaapi.lamundialdeseguros.com/api/sendmailer/`
3. **Headers:**
   - `Content-Type: application/json`
4. **Body (raw JSON):**
```json
{
  "address": "destinatario@ejemplo.com",
  "name": "Nombre Destinatario",
  "subject": "Asunto del correo",
  "body": "<html><body><h1>Título</h1><p>Contenido del email</p></body></html>"
}
```

---

## 🔒 PASO 7: Seguridad y Mejoras

### 7.1 Proteger archivo de configuración

**Archivo:** `.gitignore`
```
config/smtp.php
.env
```

### 7.2 Usar variables de entorno (Alternativa)

**Archivo:** `.env`
```env
SMTP_HOST=mail.lamundialdeseguros.com
SMTP_PORT=25
SMTP_ENCRYPTION=tls
SMTP_AUTH=false
SMTP_USERNAME=info@lamundialdeseguros.com
SMTP_PASSWORD=Zxc2020*
SMTP_FROM_EMAIL=info@lamundialdeseguros.com
SMTP_FROM_NAME=La Mundial de Seguros
```

**Modificar `config/smtp.php`:**
```php
<?php
return [
    'host' => getenv('SMTP_HOST') ?: 'mail.lamundialdeseguros.com',
    'port' => getenv('SMTP_PORT') ?: 25,
    'encryption' => getenv('SMTP_ENCRYPTION') ?: 'tls',
    'auth' => filter_var(getenv('SMTP_AUTH'), FILTER_VALIDATE_BOOLEAN),
    'username' => getenv('SMTP_USERNAME') ?: 'info@lamundialdeseguros.com',
    'password' => getenv('SMTP_PASSWORD') ?: '',
    'from_email' => getenv('SMTP_FROM_EMAIL') ?: 'info@lamundialdeseguros.com',
    'from_name' => getenv('SMTP_FROM_NAME') ?: 'La Mundial de Seguros',
    'debug' => 0,
    'charset' => 'UTF-8',
    'timeout' => 30
];
```

### 7.3 Rate Limiting (Opcional)

```php
// Agregar al inicio de api/sendmailer/index.php
session_start();

// Limitar a 5 emails por IP cada 10 minutos
$ip = $_SERVER['REMOTE_ADDR'];
$limit = 5;
$window = 600; // 10 minutos

if (!isset($_SESSION['email_count'])) {
    $_SESSION['email_count'] = [];
}

$now = time();
$_SESSION['email_count'] = array_filter(
    $_SESSION['email_count'],
    fn($timestamp) => ($now - $timestamp) < $window
);

if (count($_SESSION['email_count']) >= $limit) {
    http_response_code(429);
    echo json_encode([
        'success' => false,
        'message' => 'Demasiadas solicitudes. Intente más tarde.',
        'code' => 429
    ]);
    exit();
}

$_SESSION['email_count'][] = $now;
```

### 7.4 Autenticación con API Key (Opcional)

```php
// Agregar al inicio de api/sendmailer/index.php
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
$validApiKey = 'tu_api_key_secreta_aqui'; // Mover a config

if ($apiKey !== $validApiKey) {
    http_response_code(401);
    echo json_encode([
        'success' => false,
        'message' => 'API Key inválida',
        'code' => 401
    ]);
    exit();
}
```

**Uso desde Node.js con API Key:**
```javascript
const response = await axios.post(
  'https://qaapi.lamundialdeseguros.com/api/sendmailer/',
  data,
  {
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'tu_api_key_secreta_aqui'
    }
  }
);
```

---

## 📊 Respuestas de la API

### ✅ Success (200)
```json
{
  "success": true,
  "message": "Email enviado correctamente",
  "code": 200,
  "recipient": "destinatario@ejemplo.com"
}
```

### ❌ Error - Parámetros faltantes (400)
```json
{
  "success": false,
  "message": "Parámetros faltantes o inválidos",
  "errors": [
    "El campo \"address\" es requerido",
    "El campo \"subject\" es requerido"
  ],
  "code": 400
}
```

### ❌ Error - Email inválido (400)
```json
{
  "success": false,
  "message": "Email inválido",
  "code": 400
}
```

### ❌ Error - Método no permitido (405)
```json
{
  "success": false,
  "message": "Método no permitido. Use POST",
  "code": 405
}
```

### ❌ Error - Rate limit (429)
```json
{
  "success": false,
  "message": "Demasiadas solicitudes. Intente más tarde.",
  "code": 429
}
```

### ❌ Error - Servidor (500)
```json
{
  "success": false,
  "message": "Error al enviar el email",
  "code": 500,
  "error": "Detalles del error SMTP"
}
```

---

## 🔧 Configuración del Servidor Web

### Apache (.htaccess)

**Archivo:** `api/sendmailer/.htaccess`
```apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /api/sendmailer/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

# Seguridad
<Files "index.php">
    Order allow,deny
    Allow from all
</Files>

# Denegar acceso a archivos de configuración
<FilesMatch "\.(ini|log|conf)$">
    Order allow,deny
    Deny from all
</FilesMatch>
```

### Nginx

```nginx
location /api/sendmailer/ {
    try_files $uri $uri/ /api/sendmailer/index.php?$query_string;
    
    # CORS
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
}
```

---

## ✅ Checklist de Implementación

- [ ] Instalar PHPMailer (Composer o manual)
- [ ] Crear estructura de carpetas
- [ ] Crear archivo `config/smtp.php` con credenciales
- [ ] Agregar `config/smtp.php` a `.gitignore`
- [ ] Crear clase `lib/EmailService.php`
- [ ] Crear endpoint `api/sendmailer/index.php`
- [ ] Configurar servidor web (Apache/Nginx)
- [ ] Probar con cURL o Postman
- [ ] Integrar en aplicación Node.js/OTP
- [ ] Configurar rate limiting (opcional)
- [ ] Configurar autenticación API Key (opcional)
- [ ] Configurar logs de errores
- [ ] Probar en producción

---

## 📞 Troubleshooting

### Problema: Emails no llegan
**Solución:**
1. Verificar configuración SMTP en `config/smtp.php`
2. Activar debug: `'debug' => 2` en config
3. Revisar logs de PHP: `tail -f /var/log/apache2/error.log`
4. Verificar que el puerto 25 esté abierto
5. Confirmar que `mail.lamundialdeseguros.com` permita relay

### Problema: Error "Connection refused"
**Solución:**
1. Verificar firewall del servidor
2. Confirmar que el host SMTP es accesible: `telnet mail.lamundialdeseguros.com 25`
3. Verificar extensión OpenSSL: `php -m | grep openssl`

### Problema: Error CORS
**Solución:**
1. Verificar headers en `api/sendmailer/index.php`
2. Configurar dominio específico en lugar de `*`
3. Manejar preflight OPTIONS correctamente

---

## 🎯 Uso en Sistema OTP

**Ejemplo completo de integración:**

```javascript
// services/emailService.js
const axios = require('axios');

class EmailService {
  constructor() {
    this.apiUrl = process.env.SENDMAILER_API_URL || 
                  'https://qaapi.lamundialdeseguros.com/api/sendmailer/';
    this.apiKey = process.env.SENDMAILER_API_KEY || null;
  }

  async sendOTP(email, name, otpCode) {
    const htmlBody = `
      <!DOCTYPE html>
      <html>
      <head>
        <meta charset="UTF-8">
        <style>
          body { font-family: Arial, sans-serif; }
          .container { max-width: 600px; margin: 0 auto; padding: 20px; }
          .header { background: #0066cc; color: white; padding: 20px; text-align: center; }
          .content { padding: 30px; background: #f5f5f5; }
          .otp-code { font-size: 32px; font-weight: bold; color: #0066cc; 
                      text-align: center; padding: 20px; background: white; 
                      border-radius: 5px; margin: 20px 0; }
          .footer { text-align: center; padding: 20px; color: #666; }
        </style>
      </head>
      <body>
        <div class="container">
          <div class="header">
            <h1>Recuperación de Contraseña</h1>
          </div>
          <div class="content">
            <p>Hola ${name},</p>
            <p>Recibimos una solicitud para restablecer tu contraseña.</p>
            <p>Tu código de verificación es:</p>
            <div class="otp-code">${otpCode}</div>
            <p>Este código expirará en 10 minutos.</p>
            <p>Si no solicitaste este cambio, ignora este mensaje.</p>
          </div>
          <div class="footer">
            <p>La Mundial de Seguros</p>
          </div>
        </div>
      </body>
      </html>
    `;

    return this.send(email, name, 'Tu código de verificación', htmlBody);
  }

  async send(address, name, subject, body) {
    try {
      const headers = {
        'Content-Type': 'application/json'
      };

      if (this.apiKey) {
        headers['X-API-Key'] = this.apiKey;
      }

      const response = await axios.post(
        this.apiUrl,
        { address, name, subject, body },
        { headers, timeout: 30000 }
      );

      return {
        success: true,
        data: response.data
      };
    } catch (error) {
      console.error('Error enviando email:', error.response?.data || error.message);
      return {
        success: false,
        error: error.response?.data || error.message
      };
    }
  }
}

module.exports = EmailService;
```

**Uso en controlador OTP:**
```javascript
const EmailService = require('./services/emailService');

async function sendRecoveryOTP(email, name) {
  // Generar OTP
  const otp = Math.floor(100000 + Math.random() * 900000).toString();
  
  // Guardar OTP en DB (hasheado)
  await saveOTPToDB(email, otp);
  
  // Enviar email
  const emailService = new EmailService();
  const result = await emailService.sendOTP(email, name, otp);
  
  if (result.success) {
    console.log('✅ OTP enviado correctamente');
    return { success: true };
  } else {
    console.error('❌ Error al enviar OTP');
    return { success: false, error: result.error };
  }
}
```

---

## 🛠️ Configuración SMTP Funcional

**Datos confirmados en el código:**

| Parámetro | Valor |
|-----------|-------|
| **Host** | `mail.lamundialdeseguros.com` |
| **Port** | `25` |
| **Encryption** | `tls` |
| **Auth** | `false` |
| **Username** | `info@lamundialdeseguros.com` |
| **Password** | `Zxc2020*` |
| **From** | `info@lamundialdeseguros.com` |
| **FromName** | `La mundial de seguros` |

---

## ⚡ Siguiente Paso Sugerido

**Determinar dónde está la API `/sendmailer/` que mencionas:**
- ¿Es un proyecto diferente?
- ¿Es un microservicio separado?
- ¿Necesitas que se cree en este proyecto?

Una vez aclarado esto, se puede proceder con la implementación o integración correcta.
