Upyo
Upyo is a simple and cross-runtime library for sending email messages using SMTP and various email providers. It works on Node.js, Deno, Bun, and edge functions.
Install / Use
/learn @dahlia/UpyoREADME
Upyo
Upyo is a cross-runtime email library that provides a unified, type-safe API for sending emails across Node.js, Deno, Bun, and edge functions. Switch between SMTP and HTTP-based providers (Mailgun, Resend, SendGrid, Amazon SES) without changing your application code, while enjoying full TypeScript support, consistent error handling, and built-in testing capabilities with mock transports across all runtimes.
Here's a quick demo of sending an email using the Mailgun transport:
import { createMessage } from "@upyo/core";
import { MailgunTransport } from "@upyo/mailgun";
import fs from "node:fs/promises";
import process from "node:process";
const message = createMessage({
from: "sender@example.com",
to: "recipient@example.net",
subject: "Hello from Upyo!",
content: { text: "This is a test email." },
attachments: [
new File(
[await fs.readFile("image.jpg"), "image.jpg", { type: "image/jpeg" }]
)
],
});
const transport = new MailgunTransport({
apiKey: process.env.MAILGUN_KEY!,
domain: process.env.MAILGUN_DOMAIN!,
region: process.env.MAILGUN_REGION as "us" | "eu",
});
const receipt = await transport.send(message);
if (receipt.successful) {
console.log("Message sent with ID:", receipt.messageId);
} else {
console.error("Send failed:", receipt.errorMessages.join(", "));
}
Docs
Upyo provides comprehensive documentation to help you get started quickly: https://upyo.org/.
API reference documentation for each package is available on JSR (see below).
Packages
Upyo is a monorepo which contains several packages. The main package is @upyo/core, which provides the shared types and common interfaces for sending email messages. Other packages implement specific transports for sending messages. The following is a list of the available packages:
| Package | JSR | npm | Description | | ----------------------------------------------- | ------------------------------ | ------------------------------ | -------------------------------------------------- | | @upyo/core | JSR | npm | Shared types and interfaces for email messages | | @upyo/smtp | JSR | npm | SMTP transport | | @upyo/jmap | JSR | npm | JMAP transport (RFC 8620/8621) | | @upyo/mailgun | JSR | npm | Mailgun transport | | @upyo/plunk | JSR | npm | Plunk transport | | @upyo/resend | JSR | npm | Resend transport | | @upyo/sendgrid | JSR | npm | SendGrid transport | | @upyo/ses | JSR | npm | Amazon SES transport | | @upyo/opentelemetry | JSR | npm | OpenTelemetry observability for Upyo transports | | @upyo/mock | JSR | npm | Mock transport for testing |
Etymology
The name <q>Upyo</q> (pronounced /oo-pee-oh/) is derived from the Korean word <q>郵票</q> (upyo), which means postage stamp. It reflects the library's purpose of sending email messages, similar to how a postage stamp is used to send physical mail.
