Rocky_Mountain_Vending/lib/email.ts

97 lines
2.2 KiB
TypeScript

import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2"
import { UseSend } from "usesend-js"
const apiKey = process.env.USESEND_API_KEY
const baseUrl = process.env.USESEND_BASE_URL
const awsAccessKey = process.env.AWS_ACCESS_KEY
const awsSecretKey = process.env.AWS_SECRET_KEY
const awsRegion = process.env.AWS_DEFAULT_REGION
export const usesend = apiKey ? new UseSend(apiKey, baseUrl) : null
const sesClient =
awsAccessKey && awsSecretKey && awsRegion
? new SESv2Client({
region: awsRegion,
credentials: {
accessKeyId: awsAccessKey,
secretAccessKey: awsSecretKey,
},
})
: null
export const FROM_EMAIL =
process.env.USESEND_FROM_EMAIL || "info@rockymountainvending.com"
export const TO_EMAIL =
process.env.CONTACT_FORM_TO_EMAIL || "info@rockymountainvending.com"
function htmlToText(html: string) {
return html
.replace(/<style[\s\S]*?<\/style>/gi, " ")
.replace(/<script[\s\S]*?<\/script>/gi, " ")
.replace(/<[^>]+>/g, " ")
.replace(/&nbsp;/g, " ")
.replace(/&amp;/g, "&")
.replace(/&lt;/g, "<")
.replace(/&gt;/g, ">")
.replace(/\s+/g, " ")
.trim()
}
export function isEmailConfigured() {
return Boolean(usesend || sesClient)
}
export async function sendTransactionalEmail({
to,
subject,
html,
replyTo,
from,
}: {
to: string
subject: string
html: string
replyTo?: string
from?: string
}) {
const sender = from || FROM_EMAIL
if (usesend) {
return usesend.emails.send({
from: sender,
to,
subject,
html,
...(replyTo ? { replyTo } : {}),
})
}
if (sesClient) {
return sesClient.send(
new SendEmailCommand({
FromEmailAddress: sender,
Destination: {
ToAddresses: [to],
},
ReplyToAddresses: replyTo ? [replyTo] : undefined,
Content: {
Simple: {
Subject: {
Data: subject,
},
Body: {
Html: {
Data: html,
},
Text: {
Data: htmlToText(html),
},
},
},
},
})
)
}
throw new Error("No email transport is configured")
}