105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
import nodemailer from "nodemailer";
|
|
|
|
//
|
|
// Create reusable transporter object
|
|
//
|
|
export const mailer = nodemailer.createTransport({
|
|
host: "mail.crawlerx.co", // your Hestia mail host
|
|
port: 587, // STARTTLS
|
|
secure: false, // must be false for 587
|
|
auth: {
|
|
user: "info@crawlerx.co", // e.g. info@crawlerx.co
|
|
pass: "CrawlerX@2025", // mailbox password
|
|
},
|
|
name: "mail.crawlerx.co", // explicitly set hostname
|
|
tls: {
|
|
rejectUnauthorized: false, // allow self-signed certs
|
|
},
|
|
logger: true, // optional: logs connection steps
|
|
debug: true, // optional: debug SMTP connection
|
|
});
|
|
|
|
|
|
//
|
|
// Send welcome / signup email
|
|
//
|
|
export async function sendSignupMail(toEmail) {
|
|
try {
|
|
await mailer.sendMail({
|
|
from: `"CrawlerX" <${process.env.SMTP_USER}>`,
|
|
to: toEmail,
|
|
subject: "Welcome to CrawlerX",
|
|
html: `
|
|
<h2>Welcome!</h2>
|
|
<p>Your signup was successful. You can now log in and start using the app.</p>
|
|
`,
|
|
});
|
|
console.log(`✅ Signup email sent to ${toEmail}`);
|
|
} catch (err) {
|
|
console.error("❌ Error sending signup email:", err);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Send reset-password email with 4-digit code or token link
|
|
//
|
|
export async function sendResetPasswordMail(email, token) {
|
|
try {
|
|
const resetURL = `${process.env.FRONTEND_URL}/reset-password?email=${email}&token=${token}`;
|
|
await mailer.sendMail({
|
|
from: `"CrawlerX" <${process.env.SMTP_USER}>`,
|
|
to: email,
|
|
subject: "Reset your password",
|
|
html: `
|
|
<p>You requested a password reset.</p>
|
|
<p>Click here to reset: <a href="${resetURL}">${resetURL}</a></p>
|
|
<p>This link is valid for 1 hour.</p>
|
|
`,
|
|
});
|
|
console.log(`✅ Reset password email sent to ${email}`);
|
|
} catch (err) {
|
|
console.error("❌ Error sending reset password email:", err);
|
|
}
|
|
}
|
|
|
|
|
|
export const sendCakeOrderMail = async (toEmail, orderData) => {
|
|
try {
|
|
const transporter = nodemailer.createTransport({
|
|
host: "mail.crawlerx.co",
|
|
port: 587,
|
|
secure: false, // use TLS? false for port 587
|
|
auth: {
|
|
user: "info@crawlerx.co",
|
|
pass: "CrawlerX@2025",
|
|
},
|
|
tls: {
|
|
rejectUnauthorized: false, // <--- allow self-signed certificate
|
|
},
|
|
});
|
|
|
|
const orderItems = Object.entries(orderData)
|
|
.map(([category, flavours]) => {
|
|
const items = Object.entries(flavours)
|
|
.map(([flavour, qty]) => `• ${flavour}: ${qty}`)
|
|
.join("\n");
|
|
return `${category}:\n${items}`;
|
|
})
|
|
.join("\n\n");
|
|
|
|
const mailOptions = {
|
|
from: `"Maison de Treats" <info@crawlerx.co>`,
|
|
to: toEmail,
|
|
subject: "🎉 Your Cake Order Confirmation",
|
|
text: `Thank you for your order! Here are the details:\n\n${orderItems}`,
|
|
html: `<h2>Thank you for your order!</h2>
|
|
<p>Here are your cake order details:</p>
|
|
<pre>${orderItems}</pre>`,
|
|
};
|
|
|
|
await transporter.sendMail(mailOptions);
|
|
console.log("Cake order email sent to", toEmail);
|
|
} catch (err) {
|
|
console.error("Failed to send cake order email:", err);
|
|
}
|
|
}; |