UNPKG

@timshel_npm/maildev

Version:

SMTP Server with async API and Web Interface for viewing and testing emails during development

140 lines (139 loc) 5.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.routes = routes; /** * MailDev - routes */ const express = require("express"); const compression = require("compression"); const pkg = require("../../package.json"); const { filterEmails } = require("./utils"); const emailRegexp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; function routes(app, mailserver, basePathname) { const router = express.Router(); // Get all emails Enveloppe router.get("/envelope", compression(), function (req, res) { res.status(200).json(mailserver.getAllEnvelope()); }); // Get all emails router.get("/email", compression(), function (req, res) { mailserver .getAllEmail() .then((mails) => res.status(200).json(req.query ? filterEmails(mails, req.query) : mails)) .catch((err) => res.status(500).json({ error: err.message })); }); // Get single email router.get("/email/:id", function (req, res) { mailserver .getEmail(req.params.id) .then((mail) => { mail.envelope.isRead = true; // Mark the email as 'read' res.status(200).json(mail); }) .catch((err) => res.status(404).json({ error: err.message })); }); // Read email // router.patch('/email/:id/read', function (req, res) { // mailserver.readEmail(req.params.id, function (err, email) { // if (err) return res.status(500).json({ error: err.message }) // res.json(true) // }) // }) // Read all emails router.patch("/email/read-all", function (req, res) { const count = mailserver.readAllEmail(); res.status(200).json(count); }); // Delete all emails router.delete("/email/all", function (req, res) { mailserver .deleteAllEmail() .then((count) => res.status(200).json(count)) .catch((err) => res.status(500).json({ error: err.message })); }); // Delete email by id router.delete("/email/:id", function (req, res) { mailserver .deleteEmail(req.params.id) .then((deleted) => res.status(200).json(deleted)) .catch((err) => res.status(500).json({ error: err.message })); }); // Get Email HTML router.get("/email/:id/html", function (req, res) { // Use the headers over hostname to include any port const baseUrl = req.headers.host + (req.baseUrl || ""); mailserver .getEmailHTML(req.params.id, baseUrl) .then((html) => res.status(200).send(html)) .catch((err) => res.status(404).json({ error: err.message })); }); // Serve Attachments router.get("/email/:id/attachment/:filename", function (req, res) { mailserver .getEmailAttachment(req.params.id, req.params.filename) .then((attachement) => { res.contentType(attachement.contentType); res.status(200).send(attachement.content); }) .catch((err) => res.status(404).json({ error: err.message })); }); // Serve email.eml router.get("/email/:id/download", function (req, res) { mailserver .getEmailEml(req.params.id) .then(([contentType, filename, stream]) => { res.setHeader("Content-disposition", "attachment; filename=" + filename); res.contentType(contentType); stream.pipe(res); }) .catch((err) => res.status(404).json({ error: err.message })); }); // Get email source from .eml file router.get("/email/:id/source", function (req, res) { mailserver .getRawEmail(req.params.id) .then((stream) => stream.pipe(res)) .catch((err) => res.status(404).json({ error: err.message })); }); // Get any config settings for display router.get("/config", function (req, res) { res.status(200).json({ version: pkg.version, smtpPort: mailserver.port, isOutgoingEnabled: mailserver.isOutgoingEnabled(), outgoingHost: mailserver.getOutgoingHost(), }); }); // Relay the email router.post("/email/:id/relay{/:relayTo}", function (req, res) { mailserver .getEmail(req.params.id) .then((mail) => { if (req.params.relayTo) { if (emailRegexp.test(req.params.relayTo)) { mail.to = [{ address: req.params.relayTo, name: "" }]; mail.envelope.to = [{ address: req.params.relayTo, name: "" }]; } else { return res.status(400).json({ error: "Incorrect email address provided :" + req.params.relayTo, }); } } return mailserver .relayMail(mail, false) .then(() => res.status(200).json(true)) .catch((err) => res.status(500).json({ error: err.message })); }) .catch((err) => res.status(404).json({ error: err.message })); }); // Health check router.get("/healthz", function (req, res) { res.status(200).json(true); }); router.get("/reloadMailsFromDirectory", function (req, res) { mailserver.loadMailsFromDirectory(); res.status(200).json(true); }); app.use(basePathname, router); }