svrjs-nextjs-website/app/api/newsletter/send/route.ts

64 lines
1.8 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import nodemailer from "nodemailer";
import clientPromise from "@/lib/db";
const transporter = nodemailer.createTransport({
host: process.env.EMAIL_SERVER,
port: parseInt(process.env.EMAIL_PORT ? process.env.EMAIL_PORT : "25"),
secure: Boolean(process.env.EMAIL_SECURE ? process.env.EMAIL_SECURE : false),
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS
}
});
const sendEmail = async (
to: { email: string; unsubscribeId: string }[],
subject: string,
html: string
) => {
for (let i = 0; i < to.length; i++) {
try {
await transporter.sendMail({
from: process.env.EMAIL_NEWSLETTER_ADDRESS,
to: to[i].email,
subject: subject,
html: html.replace(
/\{unsubscribeId\}/g,
encodeURIComponent(to[i].unsubscribeId)
)
});
} catch (error) {
console.error("Error sending email:", error);
throw new Error("Failed to send email");
}
}
};
export async function POST(req: NextRequest) {
try {
const { subject, html } = await req.json();
const client = await clientPromise;
const db = client.db(process.env.MONGODB_DB);
const collection = db.collection("subscribers");
const subscribers = await collection
.find({}, { projection: { email: 1, unsubscribeId: 1 } })
.toArray();
if (subscribers.length === 0) {
console.error("No subscribers found in the database.");
return NextResponse.json(
{ message: "No subscribers found." },
{ status: 404 }
);
}
await sendEmail(subscribers as any[], subject, html ?? "No HTML specified");
return NextResponse.json({ message: "Emails sent successfully" });
} catch (error) {
console.error("Error handling POST request:", error);
return NextResponse.error();
}
}