56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
import nodemailer from "nodemailer";
|
|
import { render } from "@react-email/render";
|
|
import ContactMessageEmail, { ContactConfirmationEmail } from "@/components/emails/contact-message";
|
|
|
|
type ContactEmailData = { name: string; email: string; message: string };
|
|
|
|
function getTransporter() {
|
|
const port = Number(process.env.SMTP_PORT || 587);
|
|
return nodemailer.createTransport({
|
|
host: process.env.SMTP_HOST,
|
|
port,
|
|
secure: process.env.SMTP_SECURE === "true" || port === 465,
|
|
auth: process.env.SMTP_USER && process.env.SMTP_PASSWORD
|
|
? { user: process.env.SMTP_USER, pass: process.env.SMTP_PASSWORD }
|
|
: undefined,
|
|
});
|
|
}
|
|
|
|
function getEmailConfig() {
|
|
const from = process.env.SMTP_FROM;
|
|
const to = process.env.SMTP_TO || process.env.NEXT_PUBLIC_CONTACT_EMAIL;
|
|
if (!process.env.SMTP_HOST || !from || !to) throw new Error("SMTP email configuration is incomplete.");
|
|
return { from, to };
|
|
}
|
|
|
|
function getPlainText({ name, email, message }: ContactEmailData) {
|
|
return [`New contact message`, ``, `Name: ${name}`, `Email: ${email}`, ``, message].join("\n");
|
|
}
|
|
|
|
function getConfirmationText(name: string, siteUrl: string) {
|
|
return [`Hi ${name},`, ``, `Your message was received. I will get back to you as soon as possible.`, ``, siteUrl].join("\n");
|
|
}
|
|
|
|
export async function sendContactMessageEmail(data: ContactEmailData) {
|
|
const { from, to } = getEmailConfig();
|
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000";
|
|
const html = await render(ContactMessageEmail({ ...data, siteUrl }));
|
|
const transporter = getTransporter();
|
|
await transporter.sendMail({
|
|
from,
|
|
to,
|
|
replyTo: data.email,
|
|
subject: `New contact message from ${data.name}`,
|
|
text: getPlainText(data),
|
|
html,
|
|
});
|
|
const confirmationHtml = await render(ContactConfirmationEmail({ name: data.name, siteUrl }));
|
|
await transporter.sendMail({
|
|
from,
|
|
to: data.email,
|
|
subject: "Thanks for contacting Diyaa",
|
|
text: getConfirmationText(data.name, siteUrl),
|
|
html: confirmationHtml,
|
|
});
|
|
}
|