58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import type { EmailTransport } from 'payload/config'
|
|
|
|
import nodemailer from 'nodemailer'
|
|
|
|
import type { PayloadCloudEmailOptions } from './types'
|
|
|
|
export const payloadCloudEmail = (args: PayloadCloudEmailOptions): EmailTransport | undefined => {
|
|
if (process.env.PAYLOAD_CLOUD !== 'true' || !args) {
|
|
return undefined
|
|
}
|
|
|
|
if (!args.apiKey) throw new Error('apiKey must be provided to use Payload Cloud Email ')
|
|
if (!args.defaultDomain)
|
|
throw new Error('defaultDomain must be provided to use Payload Cloud Email')
|
|
|
|
const { apiKey, config, defaultDomain } = args
|
|
|
|
const customDomainEnvs = Object.keys(process.env).filter(
|
|
(e) => e.startsWith('PAYLOAD_CLOUD_EMAIL_DOMAIN_') && !e.endsWith('API_KEY'),
|
|
)
|
|
|
|
const customDomains = customDomainEnvs.map((e) => process.env[e]).filter(Boolean)
|
|
|
|
if (customDomains.length) {
|
|
console.log(
|
|
`Configuring Payload Cloud Email for ${[defaultDomain, ...(customDomains || [])].join(', ')}`,
|
|
)
|
|
}
|
|
|
|
const fromName = config.email?.fromName || 'Payload CMS'
|
|
const fromAddress =
|
|
config.email?.fromAddress || `cms@${customDomains.length ? customDomains[0] : defaultDomain}`
|
|
|
|
const existingTransport = config.email && 'transport' in config.email && config.email?.transport
|
|
|
|
if (existingTransport) {
|
|
return {
|
|
fromAddress,
|
|
fromName,
|
|
transport: existingTransport,
|
|
}
|
|
}
|
|
|
|
return {
|
|
fromAddress,
|
|
fromName,
|
|
transport: nodemailer.createTransport({
|
|
auth: {
|
|
pass: apiKey,
|
|
user: 'resend',
|
|
},
|
|
host: 'smtp.resend.com',
|
|
port: 465,
|
|
secure: true,
|
|
}),
|
|
}
|
|
}
|