diff options
| author | Joe Carstairs <me@joeac.net> | 2026-06-18 19:21:59 +0100 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2026-06-18 19:21:59 +0100 |
| commit | ca8e6824eaa711105f4092365792720c9dde026b (patch) | |
| tree | 2b6493941352d11b799ee63d3f1311c13de649b8 /website/src/actions/sendmail.ts | |
| parent | a0f25057283a397f006127b6f582d190d2c4294e (diff) | |
remove Astro website
Diffstat (limited to 'website/src/actions/sendmail.ts')
| -rw-r--r-- | website/src/actions/sendmail.ts | 97 |
1 files changed, 0 insertions, 97 deletions
diff --git a/website/src/actions/sendmail.ts b/website/src/actions/sendmail.ts deleted file mode 100644 index bc3a2fa..0000000 --- a/website/src/actions/sendmail.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { z } from "astro/zod"; -import { defineAction } from "astro:actions"; -import nodemailer from "nodemailer"; -import { - MAX_DAILY_EMAILS, - LOCAL_SMTP_HOST, - LOCAL_SMTP_PASSWORD, - LOCAL_SMTP_PORT, - LOCAL_SMTP_USER, - CONTACT_MAILBOX, - LOCAL_SMTP_ENVELOPE_FROM, -} from "astro:env/server"; -import { and, db, eq, gte, SendmailToken, SentEmails } from "astro:db"; - -export default defineAction({ - input: z.object({ - email: z.string().email(), - message: z.string().nonempty(), - name: z.string().nonempty(), - userId: z.string().nonempty(), - token: z.string().nonempty(), - }), - handler: sendmail, -}); - -type SendEmailParams = { - email: string; - message: string; - name: string; - token: string; - userId: string; -}; - -async function sendmail({ - name, - email, - message, - token, - userId, -}: SendEmailParams) { - const isTokenCorrect = - (await db.$count( - SendmailToken, - and( - eq(SendmailToken.userId, userId), - eq(SendmailToken.value, token), - gte(SendmailToken.validUntil, Date.now()), - ), - )) > 0; - if (!isTokenCorrect) { - return false; - } - await db - .delete(SendmailToken) - .where( - and(eq(SendmailToken.userId, userId), eq(SendmailToken.value, token)), - ); - - const emailsSentLast24Hours = await db.$count( - SentEmails, - gte(SentEmails.sentAt, Date.now() - 1000 * 60 * 60 * 24), - ); - if (emailsSentLast24Hours > MAX_DAILY_EMAILS) { - console.warn( - `${name} <${email}> tried to send an email, but ${emailsSentLast24Hours} have already been sent, whereas the max daily load is ${MAX_DAILY_EMAILS}.`, - ); - throw new Error( - `${emailsSentLast24Hours} emails have been sent in the last 24 hours, but the max daily load is ${MAX_DAILY_EMAILS}.`, - ); - } - - const info = await transporter.sendMail({ - from: LOCAL_SMTP_ENVELOPE_FROM, - to: CONTACT_MAILBOX, - subject: `joeac.net: ${name} left a message`, - text: `${name} <${email}> sent you a message:\n\n\n${message}`, - }); - - await db - .insert(SentEmails) - .values({ messageId: info.messageId, sentAt: Date.now() }); - - console.log("Sent an email to Joe. Message ID: ", info.messageId); -} - -export const transporter = nodemailer.createTransport({ - host: LOCAL_SMTP_HOST, - from: LOCAL_SMTP_ENVELOPE_FROM, - port: LOCAL_SMTP_PORT, - secure: false, - authMethod: "PLAIN", - auth: { - type: "login", - user: LOCAL_SMTP_USER, - pass: LOCAL_SMTP_PASSWORD, - }, -}); |
