Saltearse al contenido

Configurar el SMTP Mailer del proyecto

Cada proyecto Jambo puede tener su propio servidor SMTP. El mailer se usa para enviar correos (formularios de contacto, restablecimiento de contraseña, etc.). La contraseña se cifra del lado del servidor con XSalsa20-Poly1305.

GET /api/projects/{projectUuid}/settings/mailer
PUT /api/projects/{projectUuid}/settings/mailer
POST /api/projects/{projectUuid}/settings/mailer/test

Autenticación

Requiere:

  • Una sesión de administrador válida (cookie, para la UI de administración)
  • Un token API con la habilidad create
Ventana de terminal
Authorization: Bearer TU_TOKEN_API

GET — Leer la configuración SMTP

Ventana de terminal
curl https://tu-dominio.com/api/projects/{projectUuid}/settings/mailer \
-H "Authorization: Bearer TU_TOKEN_API"

Respuesta (configurado)

{
"data": {
"host": "smtp.resend.com",
"port": 587,
"username": "resend",
"encryption": "tls",
"from_email": "noreply@ejemplo.com",
"from_name": "Mi Proyecto",
"enabled": true
}
}

Respuesta (no configurado)

{ "data": null }

PUT — Crear o modificar la configuración SMTP

Ventana de terminal
curl -X PUT https://tu-dominio.com/api/projects/{projectUuid}/settings/mailer \
-H "Authorization: Bearer TU_TOKEN_API" \
-H "Content-Type: application/json" \
-d '{
"host": "smtp.gmail.com",
"port": 587,
"username": "apikey",
"password": "tu-contraseña-app",
"encryption": "tls",
"from_email": "noreply@ejemplo.com",
"from_name": "Mi Proyecto",
"enabled": true
}'

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
hoststringNoHost SMTP (validado: sin IPs privadas)
portintegerNoPuerto SMTP. Permitidos: 25, 465, 587, 2525
usernamestringNoNombre de usuario SMTP
passwordstringNoContraseña SMTP (cifrada en reposo)
encryptionstringNotls, ssl, o none
from_emailstringNoEmail del remitente
from_namestringNoNombre del remitente
enabledbooleanNoActivar o desactivar el mailer

POST — Enviar email de prueba

Ventana de terminal
curl -X POST https://tu-dominio.com/api/projects/{projectUuid}/settings/mailer/test \
-H "Authorization: Bearer TU_TOKEN_API"

Respuesta (éxito)

{ "sent": true }

Respuesta (fallo)

{ "error": "Error al enviar. Verifique su configuración SMTP." }

Códigos de estado

EstadoDescripción
200Configuración leída o modificada exitosamente
400Host inválido (IP privada) o puerto inválido
403Acceso denegado
404Proyecto no encontrado
422Mailer no configurado o desactivado

Envío programático

use App\Service\ProjectMailerService;
use App\Message\Attachment;
$mailerService->send(
project: $project,
to: 'cliente@ejemplo.com',
subject: '¡Bienvenido!',
body: 'Texto plano de respaldo',
htmlBody: '<h1>¡Bienvenido!</h1><p>Gracias por registrarte.</p>',
replyTo: 'soporte@ejemplo.com',
cc: ['gerente@ejemplo.com'],
bcc: ['archivo@ejemplo.com'],
attachments: [
new Attachment(
content: file_get_contents('/ruta/informe.pdf'),
filename: 'informe_mensual.pdf',
mimeType: 'application/pdf',
),
],
);

Los correos se envían de forma asíncrona vía Symfony Messenger y se registran en la tabla email_log.