SkillAgentSearch skills...

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/Upyo
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

<!-- deno-fmt-ignore-file --> <img src="docs/public/logo.svg" width="128" height="128" align="right">

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.

View on GitHub
GitHub Stars524
CategoryDevelopment
Updated16h ago
Forks13

Languages

TypeScript

Security Score

100/100

Audited on Apr 5, 2026

No findings