45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import nodemailer from "nodemailer";
|
|
import { render } from "@react-email/components";
|
|
import { ReactElement } from "react";
|
|
import { getServerAppServices } from "@/lib/services/create-services.server";
|
|
|
|
const transporter = nodemailer.createTransport({
|
|
host: process.env.MAIL_HOST,
|
|
port: Number(process.env.MAIL_PORT),
|
|
secure: Number(process.env.MAIL_PORT) === 465,
|
|
auth: {
|
|
user: process.env.MAIL_USERNAME,
|
|
pass: process.env.MAIL_PASSWORD,
|
|
},
|
|
});
|
|
|
|
interface SendEmailOptions {
|
|
to?: string | string[];
|
|
subject: string;
|
|
template: ReactElement;
|
|
}
|
|
|
|
export async function sendEmail({ to, subject, template }: SendEmailOptions) {
|
|
const html = await render(template);
|
|
|
|
const recipients = to || process.env.MAIL_RECIPIENTS?.split(",") || [];
|
|
|
|
const mailOptions = {
|
|
from: process.env.MAIL_FROM,
|
|
to: recipients,
|
|
subject,
|
|
html,
|
|
};
|
|
|
|
const logger = getServerAppServices().logger.child({ component: 'mailer' });
|
|
|
|
try {
|
|
const info = await transporter.sendMail(mailOptions);
|
|
logger.info("Email sent successfully", { messageId: info.messageId, subject, recipients });
|
|
return { success: true, messageId: info.messageId };
|
|
} catch (error) {
|
|
logger.error("Error sending email", { error, subject, recipients });
|
|
return { success: false, error };
|
|
}
|
|
}
|