68 lines
1.9 KiB
JavaScript
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}`);
|
|
}); |