Files
Compass/backend/email/emails/functions/send-email.ts

61 lines
1.5 KiB
TypeScript

import {IS_LOCAL} from 'common/hosting/constants'
import {debug} from 'common/logger'
import {sleep} from 'common/util/time'
import {type CreateEmailOptions, CreateEmailRequestOptions, Resend} from 'resend'
import {log} from 'shared/utils'
/*
* typically: { subject: string, to: string | string[] } & ({ text: string } | { react: ReactNode })
*/
export const sendEmail = async (
payload: CreateEmailOptions,
options?: CreateEmailRequestOptions,
) => {
const resend = getResend()
debug(resend, payload, options)
const skip = IS_LOCAL && process.env.SEND_EMAIL_LOCALLY !== 'true'
if (skip) {
console.warn('Skipping email send')
return null
}
if (!resend) return null
const {data, error} = await resend.emails.send(
{
replyTo: 'Compass <hello@compassmeet.com>',
...payload,
},
options,
)
debug('resend.emails.send', data, error)
if (error) {
log.error(`Failed to send email to ${payload.to} with subject ${payload.subject}`)
log.error(error)
return null
}
log(`Sent email to ${payload.to} with subject ${payload.subject}`)
await sleep(1000) // to avoid rate limits (2 / second in resend free plan)
return data
}
let resend: Resend | null = null
const getResend = () => {
if (resend) return resend
if (!process.env.RESEND_KEY) {
debug('No RESEND_KEY, skipping email send')
return
}
const apiKey = process.env.RESEND_KEY as string
// console.debug(`RESEND_KEY: ${apiKey}`)
resend = new Resend(apiKey)
return resend
}