Authentication
Compose credentials, magic links, sessions, passkeys, MFA, and connected-provider access without handing application identity to a framework.
Magic links
Deliver rendered messages or stored Mailgun templates through an explicit regional provider client.
Visit Mailgun ↗Compose credentials, magic links, sessions, passkeys, MFA, and connected-provider access without handing application identity to a framework.
Magic links
Model organizations, memberships, invitations, ownership, active-account switching, and fail-closed data scope.
Invitations · Ownership transfer
Render typed application email and deliver it through explicit SES, Mailgun, Postmark, Resend, SendGrid, SMTP, or capture-test providers.
Rendered application email · Provider templates
Define typed notifications, resolve recipient preferences, deliver across explicit channels, and retain one provider-independent history of every send.
Multi-channel delivery
Build waitlists, newsletters, release lists, and preference centers with explicit consent, segmentation, confirmation, and delivery boundaries.
Broadcast delivery
@playstack/mail/mailgun supports rendered messages, attachments, custom headers, and stored templates with exact JSON variables. Its fetch-based client accepts an explicit API base URL for Mailgun's US or EU infrastructure.
import { createMail } from '@playstack/mail'
import { createMailgunMailProvider } from '@playstack/mail/mailgun'
const mail = createMail({
driver: createMailgunMailProvider(
process.env.MAILGUN_API_KEY!,
'mg.example.com',
{ url: 'https://api.eu.mailgun.net' },
),
from: 'hello@example.com',
})The portable boundary validates envelopes before provider I/O. Mailgun's native client remains accessible for provider-specific behavior.