/* 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}`); });