Add SSR contact form
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 18m1s

This commit is contained in:
2025-08-29 11:36:58 +09:30
parent 1c3b37a70c
commit e46a4a560a
8 changed files with 1881 additions and 17 deletions

46
src/lib/email.ts Normal file
View File

@@ -0,0 +1,46 @@
import { createTransport } from "nodemailer";
import SMTPTransport from "nodemailer/lib/smtp-transport";
import type { Options } from "nodemailer/lib/mailer";
interface Email {
email: string;
message: string;
html?: string;
subject: string;
name: string;
}
export function constructEmailHtml(props: Email) {
return `<div>${props.message}</div>`;
}
export default async function (props: Email) {
const transporter = createTransport({
host: process.env.EMAIL_HOST || import.meta.env.EMAIL_HOST,
port: process.env.EMAIL_PORT || import.meta.env.EMAIL_PORT,
secure:
process.env.EMAIL_SECURE === "true" ||
import.meta.env.EMAIL_SECURE === "true",
auth: {
user: process.env.EMAIL_USER || import.meta.env.EMAIL_USER,
pass: process.env.EMAIL_PASS || import.meta.env.EMAIL_PASS
}
} as SMTPTransport.Options);
if (!props.html) {
props.html = constructEmailHtml(props);
}
const message: Options = {
from: `${props.name} (Website) <${process.env.EMAIL_FROM || import.meta.env.EMAIL_FROM}>`,
to: "nathan@nathancummins.com.au",
replyTo: props.email,
subject: props.subject,
text: props.message,
html: props.html
};
const info = await transporter.sendMail(message);
return info;
}