Skip to content

电子邮件功能

简介

Payload 有几个可以导入的电子邮件适配器,用于启用电子邮件功能。大多数人会想要安装 @payloadcms/email-nodemailer 包。这个包提供了一种简单的方式来使用 Nodemailer 发送电子邮件,对于已经熟悉 Nodemailer 的人来说不会造成困扰。

电子邮件适配器应该传递给 Payload 配置中的 email 属性。这样 Payload 就可以发送与身份验证相关的电子邮件,比如密码重置、新用户验证,以及满足你可能有的任何其他电子邮件发送需求。

配置

默认配置

当不需要或不想使用电子邮件功能时,Payload 在启动时会记录一条警告信息,提示电子邮件功能未配置。而且,每次尝试发送电子邮件时,也会记录一条警告信息。

电子邮件适配器

一个电子邮件适配器至少需要以下字段:

选项描述
defaultFromName *邮件发送时 “发件人” 字段中显示的名称部分
defaultFromAddress *邮件发送时 “发件人” 字段中使用的电子邮件地址部分

注:带星号(*)表示该字段为必需项。

官方电子邮件适配器

名称包名描述
Nodemailer@payloadcms/email - nodemailer可使用任何 Nodemailer 传输方式,包括 SMTP、Resend、SendGrid 等。在 Payload 2.x 中此为默认提供的适配器,是最简单的迁移途径。
Resend@payloadcms/email - resend通过 Resend 的 REST API 发送电子邮件。对于像 Vercel 这样的无服务器平台,此适配器是首选,因为它比 Nodemailer 适配器轻量得多。

Nodemailer 配置

选项描述
transport当你想自行配置时使用的 Nodemailer 传输对象。若设置了 transportOptions,则不需要此选项。
transportOptions用于配置 Payload 将创建的传输器的对象。有关所有可用选项,请参阅 Nodemailer 文档或查看以下示例。

使用 SMTP

可以通过在电子邮件选项中的 transportOptions 对象来传递简单邮件传输协议(SMTP)的相关选项。有关更多信息,包括何时应将 secure 设置为 truefalse 的详细信息,请参阅 Nodemailer 的 SMTP 文档。

以下是使用 SMTP 的电子邮件选项示例:

typescript
import { buildConfig } from 'payload'
import { nodemailerAdapter } from '@payloadcms/email-nodemailer'

export default buildConfig({
  email: nodemailerAdapter({
    defaultFromAddress: '[email protected]',
    defaultFromName: 'Payload',
    // Nodemailer 传输选项
    transportOptions: {
      host: process.env.SMTP_HOST,
      port: 587,
      auth: {
        user: process.env.SMTP_USER,
        pass: process.env.SMTP_PASS,
      },
    },
  }),
})

使用 nodemailer.createTransport 的电子邮件选项示例:

typescript
import { buildConfig } from 'payload'
import { nodemailerAdapter } from '@payloadcms/email-nodemailer'
import nodemailer from 'nodemailer'

export default buildConfig({
  email: nodemailerAdapter({
    defaultFromAddress: '[email protected]',
    defaultFromName: 'Payload',
    // 可以使用任何 Nodemailer 传输方式
    transport: nodemailer.createTransport({
      host: process.env.SMTP_HOST,
      port: 587,
      auth: {
        user: process.env.SMTP_USER,
        pass: process.env.SMTP_PASS,
      },
    }),
  }),
})

自定义传输:

你也可以使用自己的 Nodemailer 传输方式。以下是使用 SendGrid 的 Nodemailer 传输方式的示例:

typescript
import { buildConfig } from 'payload'
import { nodemailerAdapter } from '@payloadcms/email-nodemailer'
import nodemailerSendgrid from 'nodemailer-sendgrid'

export default buildConfig({
  email: nodemailerAdapter({
    defaultFromAddress: '[email protected]',
    defaultFromName: 'Payload',
    transportOptions: nodemailerSendgrid({
      apiKey: process.env.SENDGRID_API_KEY,
    }),
  }),
})

在开发过程中,如果不向 nodemailerAdapter 传递任何参数,它将使用 ethereal.email 服务。

在启动时,这会将 ethereal.email 的详细信息记录到控制台。

typescript
import { nodemailerAdapter } from '@payloadcms/email-nodemailer'

export default buildConfig({
  email: nodemailerAdapter(),
})

Resend 配置

Resend 适配器要求在选项中传入 API 密钥,该密钥可在 Resend 仪表板中找到。如果你在 Vercel 上部署应用,推荐使用这个包,因为它比 Nodemailer 适配器轻量得多。

选项描述
apiKeyResend 服务的 API 密钥。
typescript
import { buildConfig } from 'payload'
import { resendAdapter } from '@payloadcms/email-resend'

export default buildConfig({
  email: resendAdapter({
    defaultFromAddress: '[email protected]',
    defaultFromName: 'Payload CMS',
    apiKey: process.env.RESEND_API_KEY || '',
  }),
})

发送邮件

当配置好有效的传输方式后,在任何可以访问 Payload 的地方,你都能通过调用 payload.sendEmail(message) 来发送邮件。message 对象需包含收件人 to、邮件主题 subject 以及邮件内容(可以是 HTML 格式的 html 或者纯文本格式的 text)。此外,还有其他可选配置项,具体可查看 sendEmail 方法的参数说明。不过,对这些可选配置的支持情况取决于所使用的适配器。

typescript
// 发送邮件示例
const email = await payload.sendEmail({
  to: '[email protected]',
  subject: '这是一封测试邮件',
  text: '这是我的邮件正文内容',
});

使用多个邮件提供商

Payload 支持使用单个电子邮件传输器,但这并不妨碍你使用多个传输器。设想这样一个应用场景:批量发送电子邮件的处理方式与事务性电子邮件的处理方式不同,并且可以通过钩子函数来实现这种不同的处理。