...

Upyo

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.
github-icon
GitHub
313star-icon
Created 10 days ago, last commit 4 days ago
3 contributors
71 commits
20star-icon added yesterday
npmPackage on NPM
Monthly downloads on NPM
0
0
0
0
0
0
0
0
0
0
0
0
7
8
9
10
11
12
1
2
3
4
5
6
2024
2025
No dependencies
README

Upyo

Caution

This project is in early development and subject to change without notice.

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, 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/mailgun JSR npm Mailgun 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 Upyo (pronounced /oo-pee-oh/) is derived from the Korean word 郵票 (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.