Sends, receives, and tracks email via the Mailgun (Sinch) API. Use when the user wants to send email, manage domains, configure webhooks, query email events/logs, manage templates, handle suppressions (bounces, unsubscribes, complaints), set up inbound routes, manage mailing lists, DKIM keys, or IP warmup using Mailgun.
From sinch-claude-pluginnpx claudepluginhub sinch/sinch-plugins --plugin sinch-claude-pluginThis skill uses the workspace's default tool permissions.
references/infrastructure.mdGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
.env files or environment variables for MAILGUN_API_KEY and MAILGUN_DOMAIN./v1/analytics/*), never the deprecated v3 endpoints./v4/domains (not v3)..md doc pages rather than guessing.Mailgun (by Sinch) provides REST API and SMTP relay for transactional and bulk email — sending, receiving, tracking, and suppression management.
See sinch-authentication for full auth setup.
All requests use HTTP Basic Auth — username: api, password: your Mailgun private API key. Find it at Mailgun Dashboard > Account Settings > API Keys.
Two key types:
POST /messages and /messages.mime for one domainAlways match the base URL to the domain's region. Data never crosses regions.
| Service | US | EU |
|---|---|---|
| REST API | api.mailgun.net | api.eu.mailgun.net |
| Outgoing SMTP | smtp.mailgun.org | smtp.eu.mailgun.org |
| Inbound SMTP | mxa.mailgun.org, mxb.mailgun.org | mxa.eu.mailgun.org, mxb.eu.mailgun.org |
| Open/Click Tracking | mailgun.org | eu.mailgun.org |
curl -s --user 'api:YOUR_API_KEY' \
https://api.mailgun.net/v3/YOUR_DOMAIN/messages \
-F from='Sender <sender@YOUR_DOMAIN>' \
-F to='recipient@example.com' \
-F subject='Hello from Mailgun' \
-F text='This is a test email.' \
-F html='<h1>Hello</h1><p>HTML body.</p>'
Response: {"id": "<message-id@YOUR_DOMAIN>", "message": "Queued. Thank you."}
The Messages API uses multipart/form-data — use -F flags, not -d with JSON.
npm install mailgun.js form-data
const Mailgun = require('mailgun.js');
const formData = require('form-data');
const mg = new Mailgun(formData).client({
username: 'api',
key: 'YOUR_API_KEY',
// For EU: url: 'https://api.eu.mailgun.net'
});
mg.messages.create('YOUR_DOMAIN', {
from: 'Sender <sender@YOUR_DOMAIN>',
to: ['recipient@example.com'],
subject: 'Hello',
text: 'Testing Mailgun!',
});
For other SDKs: SDK Reference
sandboxXXX.mailgun.org). Only pre-authorized recipients can receive mail./v4/domains (not v3). Only DELETE remains on v3. See Domains APIPOST /v3/{domain}/messages with from, to, cc, bcc, subject, text, html, amp-html, attachments, headers, tags, variablessmtp.mailgun.org port 587 TLS, credentials per-domain via /v3/domains/{domain}/credentials. See Credentials APIPOST /v3/{domain}/messages.mimerecipient-variables for personalizationo:testmode=yes to simulate without deliveryo:deliverytime (RFC-2822), o:deliverytime-optimize-period (STO), o:time-zone-localize (TZO)o:tracking, o:tracking-clicks, o:tracking-opens per message; or configure at domain level via /v3/domains/{name}/tracking. See Domain Tracking APISend options (o:, h:, v:, t: params) are limited to 16KB total per request.
For full parameters: Messages API
Two levels:
/v3/{domain}/templates. See Domain Templates API/v4/templates (shared across all domains). See Account Templates APIReference by name when sending: -F template='welcome-template' -F t:variables='{"name":"John"}'. Each template supports up to 40 versions.
Real-time HTTP POST notifications for email events.
/v3/domains/{domain}/webhooks (v3) or /v4/domains/{domain}/webhooks (v4). See Domain Webhooks API/v1/webhooks (fires across all domains). See Account Webhooks APIEvent types: clicked, complained, delivered, failed, opened, permanent_fail, temporary_fail, unsubscribed
POST /v1/analytics/logs for querying event data. The legacy GET /v3/{domain}/events is deprecated. See Logs APIPOST /v1/analytics/metrics for aggregated analytics with dimensions, filters, resolutions. Replaces deprecated /v3/stats. See Metrics APIo:tag when sending; manage via /v1/analytics/tags. Legacy /v3/{domain}/tags is deprecated. See Tags APIData retention: Logs — at least 3 days (legacy). Metrics — hourly 60 days, daily 1 year, monthly indefinite.
Routes API — match incoming messages by recipient pattern or header expression, then forward, store, or webhook. Configure both mxa and mxb MX records.
Per-domain suppression lists that Mailgun auto-populates. Sending to suppressed addresses silently drops.
/v3/{domain}/bounces/v3/{domain}/unsubscribes/v3/{domain}/complaints/v3/{domain}/whitelists — prevents addresses from being added to bounce listsMailing Lists API — /v3/lists to create/manage lists, /v3/lists/{address}/members for members. Bulk upload via .json or .csv endpoints.
Retrieve: GET /v3/domains/{domain}/messages/{storage_key}. Resend: POST to same path. See Messages API
For IPs, IP Pools, IP Warmup, DKIM Keys, and Subaccounts — see references/infrastructure.md.
Add recipient-variables as JSON mapping each recipient address to their variables. Use %recipient.variable_name% in subject/body. Max 1,000 recipients per call. See Batch Sending
POST /v3/domains/{domain}/webhooks with id (event type) and url fields-F o:deliverytime='RFC-2822-date' to send callDELETE /v3/{domain}/envelopes to bulk-delete all scheduled/undelivered mailmxa.mailgun.org and mxb.mailgun.org (priority 10)POST /v3/routes with expression (match pattern) and action (forward/store/webhook). See Routes Guidemultipart/form-data only — the Messages endpoint does not accept JSON. Use -F in curl./v4/domains for CRUD. Only DELETE /v3/domains/{name} remains on v3.POST /v1/analytics/logs (not GET /v3/{domain}/events) and POST /v1/analytics/metrics (not /v3/stats)./v1/analytics/tags (not /v3/{domain}/tags).429 response. Check X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset headers. Use exponential backoff.o:, h:, v:, t: params combined max 16KB per request./v3/ip_warmups to manage programmatically.mxa and mxb for inbound routing.