feat: implement stdout email adapter, use if no adapter configured

This commit is contained in:
Elliot DeNolf
2024-04-18 11:59:03 -04:00
parent 8d52f1b279
commit f0198b62f3
4 changed files with 57 additions and 19 deletions

View File

@@ -0,0 +1,23 @@
import type { SendMailOptions } from 'nodemailer'
export const getStringifiedToAddress = (message: SendMailOptions): string | undefined => {
let stringifiedTo: string | undefined
if (typeof message.to === 'string') {
stringifiedTo = message.to
} else if (Array.isArray(message.to)) {
stringifiedTo = message.to
.map((to) => {
if (typeof to === 'string') {
return to
} else if (to.address) {
return to.address
}
return ''
})
.join(', ')
} else if (message.to.address) {
stringifiedTo = message.to.address
}
return stringifiedTo
}

View File

@@ -2,30 +2,15 @@ import type { SendMailOptions } from 'nodemailer'
import type { Payload } from '../types/index.js'
import { getStringifiedToAddress } from './getStringifiedToAddress.js'
export async function sendEmail(this: Payload, message: SendMailOptions): Promise<unknown> {
let result
try {
result = await this.email.sendEmail(message)
} catch (err: unknown) {
let stringifiedTo: string | undefined
if (typeof message.to === 'string') {
stringifiedTo = message.to
} else if (Array.isArray(message.to)) {
stringifiedTo = message.to
.map((to) => {
if (typeof to === 'string') {
return to
} else if (to.address) {
return to.address
}
return ''
})
.join(', ')
} else if (message.to.address) {
stringifiedTo = message.to.address
}
const stringifiedTo = getStringifiedToAddress(message)
this.logger.error({
err,

View File

@@ -0,0 +1,23 @@
import type { SendMailOptions } from 'nodemailer'
import type { Payload } from '../index.js'
import type { EmailAdapter } from './types.js'
import { emailDefaults } from './defaults.js'
import { getStringifiedToAddress } from './getStringifiedToAddress.js'
export type StdoutAdapter = EmailAdapter<SendMailOptions, void>
export const createStdoutAdapter = (payload: Payload) => {
const stdoutAdapter: StdoutAdapter = {
defaultFromAddress: emailDefaults.defaultFromAddress,
defaultFromName: emailDefaults.defaultFromName,
sendEmail: async (message) => {
const stringifiedTo = getStringifiedToAddress(message)
const res = `EMAIL NON-DELIVERY. To: '${stringifiedTo}', Subject: '${message.subject}'`
payload.logger.info({ msg: res })
return Promise.resolve()
},
}
return stdoutAdapter
}

View File

@@ -49,6 +49,7 @@ import { APIKeyAuthentication } from './auth/strategies/apiKey.js'
import { JWTAuthentication } from './auth/strategies/jwt.js'
import localOperations from './collections/operations/local/index.js'
import { validateSchema } from './config/validate.js'
import { createStdoutAdapter } from './email/stdoutAdapter.js'
import { fieldAffectsData } from './exports/types.js'
import localGlobalOperations from './globals/operations/local/index.js'
import flattenFields from './utilities/flattenTopLevelFields.js'
@@ -366,8 +367,14 @@ export class BasePayload<TGeneratedTypes extends GeneratedTypes> {
// Load email adapter
if (this.config.email instanceof Promise) {
this.email = await this.config.email
} else {
} else if (this.config.email) {
this.email = this.config.email
} else {
this.logger.warn(
`No email adapter provided. Email will be written to stdout. More info at https://payloadcms.com/docs/email/overview.`,
)
this.email = createStdoutAdapter(this)
}
this.sendEmail = this.email.sendEmail