MailShogun

Guía

API de envío

Envía desde tu servidor con POST /v1/send. Una respuesta 202 confirma que MailShogun ha aceptado el mensaje en cola. Consulta después su estado en el panel.

Antes de empezar

Necesitas un dominio verificado, un plan activo, un método de pago y una clave con permiso send. Ejecuta los ejemplos en tu servidor; nunca expongas la clave en el navegador.

Preparar la cuenta y el dominio

Revisado el 11 de septiembre de 2026

Ejemplo ilustrativo del proceso. La aceptación en cola no garantiza la entrega ni la llegada a la bandeja de entrada.

POST /v1/send

Authorization: Bearer ms_…
{
  "from": "hola@tudominio.com",
  "to": ["destino@ejemplo.com"],
  "subject": "Hola",
  "text": "Mundo"
}

Base y autenticación

Cada clave empieza por ms_…. La creas en la ficha del dominio, en Conexión.

Base
https://api.mailshogun.com
Cabecera
Authorization: Bearer ms_…

La clave necesita el permiso send y debe permitir tu IP, país y dominio de envío. También se usa para autenticar MCP, sujeto a sus permisos.

La clave se muestra una sola vez al crearla. Si la pierdes, revócala y crea otra.

Abrir Dominios

POST /v1/send

Cuerpo JSON. Cabecera Content-Type application/json.

POST https://api.mailshogun.com/v1/send

Campos

Campo Tipo Obligatorio Descripción
from string Remitente. Debe pertenecer a un dominio verificado de la cuenta (y al dominio fijado en la clave, si lo tiene).
to string[] Destinatarios. Obligatorio al menos uno; hay un máximo por petición.
subject string no Asunto del mensaje.
html string no Cuerpo HTML. Puedes enviar html, text o ambos.
text string no Cuerpo en texto plano.

Respuesta correcta: HTTP 202 con {"status":"queued"}. El envío no es inmediato: primero entra en cola.

Ejemplos

Define MAILSHOGUN_API_KEY en el entorno del servidor. Sustituye from y to por un remitente verificado y un buzón que controles. curl usa sintaxis de shell POSIX; JavaScript usa Node.js con fetch en un archivo .mjs y PHP requiere la extensión cURL. Estos ejemplos sí envían al ejecutarlos.

curl

curl -X POST https://api.mailshogun.com/v1/send \
  -H "Authorization: Bearer $MAILSHOGUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "hola@tudominio.com",
    "to": ["destino@ejemplo.com"],
    "subject": "Hola",
    "html": "<p>Hola desde MailShogun</p>",
    "text": "Hola desde MailShogun"
  }'

Node.js (fetch)

const apiKey = process.env.MAILSHOGUN_API_KEY;
if (!apiKey) throw new Error('Missing MAILSHOGUN_API_KEY');
const response = await fetch('https://api.mailshogun.com/v1/send', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer ' + apiKey,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    from: 'hola@tudominio.com',
    to: ['destino@ejemplo.com'],
    subject: 'Hola',
    html: '<p>Hola desde MailShogun</p>',
    text: 'Hola desde MailShogun'
  })
});
const body = await response.json();
if (response.status !== 202) {
  throw new Error('HTTP ' + response.status + ': ' + JSON.stringify(body));
}
console.log(body);

PHP

<?php
$apiKey = getenv('MAILSHOGUN_API_KEY');
if (!$apiKey) { throw new RuntimeException('Missing MAILSHOGUN_API_KEY'); }
$payload = [
  'from' => 'hola@tudominio.com',
  'to' => ['destino@ejemplo.com'],
  'subject' => 'Hola',
  'html' => '<p>Hola desde MailShogun</p>',
  'text' => 'Hola desde MailShogun',
];
$ch = curl_init('https://api.mailshogun.com/v1/send');
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ' . $apiKey,
    'Content-Type: application/json',
  ],
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_RETURNTRANSFER => true,
]);
$body = curl_exec($ch);
if ($body === false) { throw new RuntimeException(curl_error($ch)); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 202 + {"status":"queued"} on success
if ($code !== 202) { throw new RuntimeException('HTTP ' . $code . ': ' . $body); }
echo $body;

Respuestas y errores

El cuerpo de error es JSON {"error":"…"}. Los textos los genera MailShogun al enviar.

HTTP Caso Detalle
202 Aceptado {"status":"queued"}. El mensaje está en cola.
401 Sin clave o clave inválida falta la clave, clave no válida. Revisa el prefijo ms_ y que la clave siga activa.
403 Clave restringida Permiso send ausente, IP o país no autorizados, o remitente fuera del dominio de la clave. Corrige el permiso o usa una clave adecuada.
400 Petición inválida o dominio from y to son obligatorios; JSON inválido; remitente inválido; el dominio del remitente no está dado de alta (verificado) en esta cuenta.
402 Facturación Revisa el plan, el método de pago y posibles pagos vencidos en Facturación.
429 Límites Tope diario, demasiados envíos seguidos u otros límites de la cuenta (por ejemplo rebotes). Espera o revisa Facturación y reputación.
500 Error interno Conserva el código y la hora. Si persiste, contacta con soporte; evita reintentos sin comprobar el estado.
503 Cola no disponible Servicio temporalmente no disponible. Conserva la respuesta y revisa el estado antes de reintentar.

Los límites diarios y de ritmo los impone la cuenta. Un 429 indica que has alcanzado un tope.

MCP

Las mismas claves API (Bearer ms_…). Las herramientas son list_domains y send_email.

Endpoint
POST https://mcp.mailshogun.com/mcp
Cabecera
Authorization: Bearer ms_…
Herramientas
list_domains, send_email

Siguiente paso

Con el dominio verificado, el tramo y la tarjeta, crea la clave en Conexión y lanza el POST.

Abrir Dominios Abrir guía DNS Volver al índice

Comprueba el resultado

  • HTTP 202 y status queued confirman la aceptación. Consulta Estadísticas y el buzón de destino para seguir el resultado.
  • Corrige los errores 400, 401, 402 y 403 antes de repetir. Para 429 revisa el límite o bloqueo indicado; esperar no resuelve todos los casos.
  • Si se corta la conexión y no recibes respuesta, el envío puede haber entrado en cola. Comprueba su estado antes de repetir: esta API no documenta una clave de idempotencia para evitar duplicados.

Abrir Estadísticas

Continúa con

¿Sigue fallando? Indica a soporte el código de error, la hora y el dominio afectado. Oculta contraseñas, claves API y el contenido de los mensajes. Soporte