Skip to content

feat(email-resend): add Custom headers for the Resend adapter #15645

Merged
paulpopus merged 3 commits into
payloadcms:mainfrom
fdurackbrooks:main
Apr 13, 2026
Merged

feat(email-resend): add Custom headers for the Resend adapter #15645
paulpopus merged 3 commits into
payloadcms:mainfrom
fdurackbrooks:main

Conversation

@fdurackbrooks

Copy link
Copy Markdown
Contributor

After some trying (and failing) to enable unsubscribe headers, I found that the Resend adapter does not pass custom headers from the Payload sendEmail options to the Resend API. When attempting to send an email with custom headers, they are ignored because the mapPayloadEmailToResendEmail function creates a new object that excludes the headers property.

await payload.sendEmail({
  from: "Test <test@domain.com>",
  to: "jimmybillbob@example.com",
  subject: "Resend adapter does not allow custom headers :(",
  html: html,
  headers: {
    "List-Unsubscribe": "<https://domain.com/unsubscribe>",
    "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
  },
});

I have recitified this by adding headers: message.headers, to the mapPayloadEmailToResendEmail in packages/email-resend/src/index.ts, as below.

function mapPayloadEmailToResendEmail(
  message: SendEmailOptions,
  defaultFromAddress: string,
  defaultFromName: string,
): ResendSendEmailOptions {
  return {
    // Required
    from: mapFromAddress(message.from, defaultFromName, defaultFromAddress),
    subject: message.subject ?? '',
    to: mapAddresses(message.to),

    // Other To fields
    bcc: mapAddresses(message.bcc),
    cc: mapAddresses(message.cc),
    reply_to: mapAddresses(message.replyTo),

    // Optional
    attachments: mapAttachments(message.attachments),
    html: message.html?.toString() || '',
    text: message.text?.toString() || '',
    headers: message.headers, // Added this line.
  } as ResendSendEmailOptions
}

@paulpopus paulpopus merged commit a7dd17c into payloadcms:main Apr 13, 2026
321 of 324 checks passed
Raghvendra2420 pushed a commit to Raghvendra2420/payload that referenced this pull request Apr 13, 2026
…dcms#15645)

After some trying (and failing) to enable unsubscribe headers, I found
that the Resend adapter does not pass custom headers from the Payload
sendEmail options to the Resend API. When attempting to send an email
with custom headers, they are ignored because the
`mapPayloadEmailToResendEmail` function creates a new object that
excludes the headers property.

```
await payload.sendEmail({
  from: "Test <test@domain.com>",
  to: "jimmybillbob@example.com",
  subject: "Resend adapter does not allow custom headers :(",
  html: html,
  headers: {
    "List-Unsubscribe": "<https://domain.com/unsubscribe>",
    "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
  },
});
```

I have recitified this by adding `headers: message.headers,` to the
`mapPayloadEmailToResendEmail` in `packages/email-resend/src/index.ts`,
as below.

```
function mapPayloadEmailToResendEmail(
  message: SendEmailOptions,
  defaultFromAddress: string,
  defaultFromName: string,
): ResendSendEmailOptions {
  return {
    // Required
    from: mapFromAddress(message.from, defaultFromName, defaultFromAddress),
    subject: message.subject ?? '',
    to: mapAddresses(message.to),

    // Other To fields
    bcc: mapAddresses(message.bcc),
    cc: mapAddresses(message.cc),
    reply_to: mapAddresses(message.replyTo),

    // Optional
    attachments: mapAttachments(message.attachments),
    html: message.html?.toString() || '',
    text: message.text?.toString() || '',
    headers: message.headers, // Added this line.
  } as ResendSendEmailOptions
}
```

---------

Co-authored-by: Paul Popus <paul@payloadcms.com>
@github-actions

Copy link
Copy Markdown
Contributor

🚀 This is included in version v3.83.0

milamer pushed a commit to milamer/payload that referenced this pull request Apr 20, 2026
…dcms#15645)

After some trying (and failing) to enable unsubscribe headers, I found
that the Resend adapter does not pass custom headers from the Payload
sendEmail options to the Resend API. When attempting to send an email
with custom headers, they are ignored because the
`mapPayloadEmailToResendEmail` function creates a new object that
excludes the headers property.

```
await payload.sendEmail({
  from: "Test <test@domain.com>",
  to: "jimmybillbob@example.com",
  subject: "Resend adapter does not allow custom headers :(",
  html: html,
  headers: {
    "List-Unsubscribe": "<https://domain.com/unsubscribe>",
    "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
  },
});
```

I have recitified this by adding `headers: message.headers,` to the
`mapPayloadEmailToResendEmail` in `packages/email-resend/src/index.ts`,
as below.

```
function mapPayloadEmailToResendEmail(
  message: SendEmailOptions,
  defaultFromAddress: string,
  defaultFromName: string,
): ResendSendEmailOptions {
  return {
    // Required
    from: mapFromAddress(message.from, defaultFromName, defaultFromAddress),
    subject: message.subject ?? '',
    to: mapAddresses(message.to),

    // Other To fields
    bcc: mapAddresses(message.bcc),
    cc: mapAddresses(message.cc),
    reply_to: mapAddresses(message.replyTo),

    // Optional
    attachments: mapAttachments(message.attachments),
    html: message.html?.toString() || '',
    text: message.text?.toString() || '',
    headers: message.headers, // Added this line.
  } as ResendSendEmailOptions
}
```

---------

Co-authored-by: Paul Popus <paul@payloadcms.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants