@contract-kit/provider-mail-resend
Resend-backed mail provider for Contract Kit.
The provider installs the app-facing ctx.ports.mailer port and exposes
ctx.ports.resend.client only as an escape hatch for Resend-specific features.
Install
bun add @contract-kit/provider-mail-resend resend
Setup
import { mailResendProvider } from "@contract-kit/provider-mail-resend";
import { createServer } from "@contract-kit/server";
const server = await createServer({
ports: basePorts,
providers: [mailResendProvider],
createContext: ({ ports }) => ({ ports }),
routes,
});
Required environment variables:
RESEND_API_KEY | Resend API key |
RESEND_FROM | Default sender, e.g. My App <no-reply@example.com> |
Use in application code
await ctx.ports.mailer.send({
to: "user@example.com",
subject: "Welcome",
html: "<h1>Hello</h1>",
});
The same MailerPort works with SMTP, memory fakes, and other adapters:
await ctx.ports.mailer.send({
from: { email: "support@example.com", name: "Support" },
to: ["user@example.com", "admin@example.com"],
replyTo: "support@example.com",
subject: "Account updated",
text: "Your account was updated.",
html: "<p>Your account was updated.</p>",
});
Escape hatch
Use the Resend client only when you need a Resend-specific feature not covered
by MailerPort:
await ctx.ports.resend.client.emails.send({
from: "sender@example.com",
to: "user@example.com",
subject: "Invoice",
html: "<p>Attached.</p>",
attachments: [
{
filename: "invoice.pdf",
content: pdfBuffer,
},
],
});
Devtools
When ctx.ports.devtools is installed, this provider records mail.send,
mail.sent, and mail.failed events under the mail watcher.
Errors
Delivery failures throw MailDeliveryError from @contract-kit/mail.
Startup configuration problems throw during provider setup.
License
MIT