Files
smtp-proxy/index.js
Alex Rennie-Lis 299aacd2a4 Initial commit
2026-05-01 10:09:51 +01:00

68 lines
1.9 KiB
JavaScript

/*
SMTP Proxy
Author: Alex Rennie-Lis
Description: Presents an unauthenticated SMTP server for local legacy devices, and
proxies traffic to a defined relay host
Version: 1.0.0
*/
const SMTPServer = require("smtp-server").SMTPServer;
const nodemailer = require("nodemailer");
if (
!process.env.RELAY_HOST ||
!process.env.RELAY_PORT
) {
console.log ("Missing configuration.");
process.exit (1);
}
const transporter = nodemailer.createTransport({
host: process.env.RELAY_HOST,
port: parseInt(process.env.RELAY_PORT) || 465,
secure: process.env.RELAY_PORT === "465",
auth: {
user: process.env.RELAY_USER,
pass: process.env.RELAY_PASS
},
// VERBOSE DEBUGGING
logger: false,
debug: false
});
// Verify the connection on startup
transporter.verify((error, success) => {
if (error) {
console.error("Transporter Config Error:", error);
}
else {
console.log("Upstream relay is ready.");
}
});
const server = new SMTPServer({
authOptional: true,
onData(stream, session, callback) {
console.log ("Relaying message...");
const envelope = {
from: session.envelope.mailFrom.address,
to: session.envelope.rcptTo.map(r => r.address)
};
transporter.sendMail ({envelope: envelope, raw: stream}, (err, info) => {
if (err) {
console.error ("Relay Error:", err.message);
return callback (new Error ("Relay failed!"));
}
console.log("Relay success:", info.messageId);
callback();
});
}
});
const listenPort = process.env.SMTP_PORT || 2525; // Default to port 2525
server.listen (listenPort, '0.0.0.0', () => {
console.log (`Relay active: Port ${listenPort} -> ${process.env.RELAY_HOST}:${process.env.RELAY_PORT}`);
});