server/lib/mailer.js Repository wynajem_motorowek Original path server/lib/mailer.jsRole SOURCE Size 1930 bytes Lines 65 SHA-256 4aab38e73052ccef089e88341d13ba7c06987f953e3996e97c67f93931da64efDisplayed range 1–65 Previous file/page · Project index · Next file/page
const nodemailer = require("nodemailer");
function buildTransportConfig() {
const host = String(process.env.SMTP_HOST || "").trim();
const port = Number(process.env.SMTP_PORT || 587);
const user = String(process.env.SMTP_USER || "").trim();
const pass = String(process.env.SMTP_PASS || "").trim();
const secure = String(process.env.SMTP_SECURE || "false").toLowerCase() === "true";
if (!host || !user || !pass) return null;
return { host, port, secure, auth: { user, pass } };
}
function getFromAddress() {
const mailFrom = String(process.env.MAIL_FROM || "").trim();
const smtpUser = String(process.env.SMTP_USER || "").trim();
if (!mailFrom) return smtpUser;
if (mailFrom.includes("@")) return mailFrom;
if (!smtpUser) return "";
return `${mailFrom} <${smtpUser}>`;
}
async function sendMail({ to, subject, text, html }) {
const config = buildTransportConfig();
if (!config) {
console.log("[mailer] SMTP not configured, skipped", { to, subject });
return { skipped: true };
}
const from = getFromAddress();
if (!from) {
console.log("[mailer] MAIL_FROM missing, skipped", { to, subject });
return { skipped: true };
}
const transporter = nodemailer.createTransport(config);
try {
await transporter.verify();
} catch (error) {
console.error("[mailer] SMTP verify failed", {
host: config.host,
port: config.port,
secure: config.secure,
error: String(error && error.message ? error.message : error),
});
throw error;
}
try {
const info = await transporter.sendMail({ from, to, subject, text, html });
console.log("[mailer] Sent", { to, subject, messageId: info && info.messageId });
return info;
} catch (error) {
console.error("[mailer] Send failed", {
to,
subject,
error: String(error && error.message ? error.message : error),
});
throw error;
}
}
module.exports = {
sendMail,
};