Files

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,
});
}