Skip to main content
Home

Built and signed on GitHub Actions

A SMTP server for testing e-mail delivery in Deno.

This package works with DenoIt is unknown whether this package works with Cloudflare Workers, Node.js, Bun, Browsers
It is unknown whether this package works with Cloudflare Workers
It is unknown whether this package works with Node.js
This package works with Deno
It is unknown whether this package works with Bun
It is unknown whether this package works with Browsers
JSR Score
100%
Published
3 weeks ago (0.2.0)

smtpsaurus 💌 🦕

Introduction

smtpsaurus is a local SMTP server built for Deno 2 for testing purposes. It implements basic functionality for receiving and storing e-mails, and provides an API for fetching stored e-mails.

⚠️ Warning: This library is meant to be used in tests only and should absolutely not be used in production systems. It currently lacks features such as TLS, authentication, and has minimal validation and error handling.

Installation

To add smtpsaurus to your Deno project:

deno add jsr:@smtpsaurus/smtpsaurus

smtpsaurus uses Deno KV as for storing e-mails in memory for retrieval, you will need to add the --unstable-kv CLI flag when running code that uses smtpsaurus.

Usage

Starting an SMTP server with default settings (port: 2525, domain: smtpsaurus.email) and retrieving sent e-mails:

import { SmtpServer } from "jsr:@smtpsaurus/smtpsaurus";

// Creating a new instance and starting the server.
const server = new SmtpServer();

// Start the server.
server.start();

// Retrieving e-mails.
const messageId = "<b3e84b8d-0128-422e-ba89-af074e87d28e@smtpsaurus.email>";
const senderEmail = "rawr@smtpsaurus.email";
const recipientEmails = ["deno@smtpsaurus.email", "node@smtpsaurus.email"];

server.mailbox.get(messageId);
server.mailbox.getBySender(senderEmail);
server.mailbox.getByRecipient(recipientEmails[0]);

// Stopping the server.
await server.stop();

Starting a server with custom settings:

const server = new SmtpServer({
	domain: "happy-smtpsaurus.email",
	port: 65535,
});

server.start();

API documentation

Please see the automatically generated API documentation on JSR: https://jsr.io/@smtpsaurus/smtpsaurus/doc.

Examples

Using smtpsaurus in tests

import { SmtpServer } from "jsr:@smtpsaurus/smtpsaurus";
import { expect } from "jsr:@std/expect";
import { afterEach, beforeEach, describe, it } from "jsr:@std/testing/bdd";
// @ts-types="npm:@types/nodemailer"
import nodemailer from "nodemailer";

describe("SmtpServer", () => {
	let server: SmtpServer;

	beforeEach(() => {
		// Setting `findPortOnConflict` to `true` may be useful when running
		// tests in parallel, as it allows `smtpsaurus` to find an open
		// automatically if the one specified is in use.
		server = new SmtpServer({
			port: 42024,
			findPortOnConflict: true
			quiet: true
		});

		server.start();
	});

	afterEach(async () => {
		await server.stop();
	});

	it("process a well-formed sequence of commands", async () => {
		const transporter = nodemailer.createTransport({
			host: server.hostname,
			port: server.port,
			secure: false,
		});

		// Send an e-mail with nodemailer.
		const info = await transporter.sendMail({
			from: `"smtpsaurus" <test@smtpsaurus.email>`,
			to: "user@smtpsaurus.com",
			subject: "Test Email",
			text: "Hello, world!",
		});

		expect(info.response).toBe("250 OK");

		// Retrieve the sent e-mail from smtpsaurus.
		const data = await server.mailbox.get(info.messageId);

		assertExists(data);

		expect(data.messageId).toBe(info.messageId);
		expect(data.senderEmail).toBe(info.envelope.from);
		expect(data.recipientEmails).toEqual(
			expect.arrayContaining(info.envelope.to),
		);

		transporter.close();
	});
});
Built and signed on
GitHub Actions

New Ticket: Report package

Please provide a reason for reporting this package. We will review your report and take appropriate action.

Please review the JSR usage policy before submitting a report.

Add Package

deno add jsr:@smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";
or

Import directly with a jsr specifier

import * as smtpsaurus from "jsr:@smtpsaurus/smtpsaurus";

Add Package

pnpm i jsr:@smtpsaurus/smtpsaurus
or (using pnpm 10.8 or older)
pnpm dlx jsr add @smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";

Add Package

yarn add jsr:@smtpsaurus/smtpsaurus
or (using Yarn 4.8 or older)
yarn dlx jsr add @smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";

Add Package

vlt install jsr:@smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";

Add Package

npx jsr add @smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";

Add Package

bunx jsr add @smtpsaurus/smtpsaurus

Import symbol

import * as smtpsaurus from "@smtpsaurus/smtpsaurus";