maildev
Version:
SMTP Server and Web Interface for reading and testing emails during development
163 lines (134 loc) • 5.01 kB
JavaScript
/**
* MailDev - routes.js
*/
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,}))$/
module.exports = function (app, mailserver, basePathname) {
const router = express.Router()
// Get all emails
// Optional
// - skip - number of email offset for pagination
// - *any* - query using dot notation for any param, ex. from.address=hello@yes.com
router.get('/email', compression(), function (req, res) {
mailserver.getAllEmail(function (err, emailList) {
if (err) return res.status(404).json([])
const { skip, ...query } = req.query
const skipCount = skip ? parseInt(skip, 10) : 0
if (Object.keys(query).length) {
const filteredEmails = filterEmails(emailList, query)
res.json(filteredEmails.slice(skipCount))
} else {
res.json(emailList.slice(skipCount))
}
})
})
// Get single email
router.get('/email/:id', function (req, res) {
mailserver.getEmail(req.params.id, function (err, email) {
if (err) return res.status(404).json({ error: err.message })
email.read = true // Mark the email as 'read'
res.json(email)
})
})
// 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) {
mailserver.readAllEmail(function (err, count) {
if (err) return res.status(500).json({ error: err.message })
res.json(count)
})
})
// Delete all emails
router.delete('/email/all', function (req, res) {
mailserver.deleteAllEmail(function (err) {
if (err) return res.status(500).json({ error: err.message })
res.json(true)
})
})
// Delete email by id
router.delete('/email/:id', function (req, res) {
mailserver.deleteEmail(req.params.id, function (err) {
if (err) return res.status(500).json({ error: err.message })
res.json(true)
})
})
// 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, function (err, html) {
if (err) return res.status(404).json({ error: err.message })
res.send(html)
})
})
// Serve Attachments
router.get('/email/:id/attachment/:filename', function (req, res) {
mailserver.getEmailAttachment(req.params.id, req.params.filename, function (err, contentType, readStream) {
if (err) return res.status(404).json('File not found')
res.contentType(contentType)
readStream.pipe(res)
})
})
// Serve email.eml
router.get('/email/:id/download', function (req, res) {
mailserver.getEmailEml(req.params.id, function (err, contentType, filename, readStream) {
if (err) return res.status(404).json('File not found')
res.setHeader('Content-disposition', 'attachment; filename=' + filename)
res.contentType(contentType)
readStream.pipe(res)
})
})
// Get email source from .eml file
router.get('/email/:id/source', function (req, res) {
mailserver.getRawEmail(req.params.id, function (err, readStream) {
if (err) return res.status(404).json('File not found')
readStream.pipe(res)
})
})
// Get any config settings for display
router.get('/config', function (req, res) {
res.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, function (err, email) {
if (err) return res.status(404).json({ error: err.message })
if (req.params.relayTo) {
if (emailRegexp.test(req.params.relayTo)) {
email.to = [{ address: req.params.relayTo }]
email.envelope.to = [{ address: req.params.relayTo, args: false }]
} else {
return res.status(400).json({ error: 'Incorrect email address provided :' + req.params.relayTo })
}
}
mailserver.relayMail(email, function (err) {
if (err) return res.status(500).json({ error: err.message })
res.json(true)
})
})
})
// Health check
router.get('/healthz', function (req, res) {
res.json(true)
})
router.get('/reloadMailsFromDirectory', function (req, res) {
mailserver.loadMailsFromDirectory()
res.json(true)
})
app.use(basePathname, router)
}