Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@ description: "New features, improvements, and fixes across the Sendmux platform.
rss: true
---

<Update label="6 July 2026" tags={["Improvements"]} rss={{ title: "Domain bounce handling is clearer" }}>
## Domain verification

Custom domains now show the extra bounce-handling DNS records needed for Amazon SES MAIL FROM, including the `bounce.` subdomain MX and TXT records.

Domain verification now checks those bounce records separately and keeps already verified domains active while the extra DNS records are pending.

The Management API now returns MAIL FROM status and DNS check results for domains, and zone file exports include the same records so teams can copy the full DNS set at once.

</Update>

<Update label="3 July 2026" tags={["New features", "Improvements"]} rss={{ title: "Outbound attachments are more efficient for agents" }}>
## Mailbox API

Expand Down
26 changes: 16 additions & 10 deletions guides/domain-management.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "Domains"
description: "Add, verify, and manage custom domains for sending and receiving."
keywords:
["domains", "DNS", "SPF", "DKIM", "DMARC", "verification", "custom domain"]
["domains", "DNS", "SPF", "DKIM", "DMARC", "MAIL FROM", "verification"]
---

Use a custom domain when you want branded sending, hosted mailboxes, or both. Choose the domain mode when you add it: sending only avoids MX changes, while sending & receiving lets you create mailboxes after verification.
Expand Down Expand Up @@ -42,20 +42,21 @@ Use a custom domain when you want branded sending, hosted mailboxes, or both. Ch
</Step>
<Step title="Verify">
Select **Verify** after the records have propagated. Sending-only domains
check ownership, sending policy, message policy, and email signing. Sending
& receiving domains also check inbound routing.
check ownership, sending policy, message policy, email signing, and bounce
handling. Sending & receiving domains also check inbound routing.
</Step>
</Steps>

## DNS records

| Purpose | Record | Required for | What it does |
| -------------- | ------ | ----------------------------- | ---------------------------------------------- |
| Ownership | TXT | Both modes | Confirms you control the domain. |
| Email signing | CNAME | Both modes | Enables DKIM signing through Amazon SES. |
| Sending policy | TXT | Both modes | Authorises Sendmux to send for the domain. |
| Message policy | TXT | Both modes | Defines DMARC handling for suspicious mail. |
| Receive mail | MX | Sending & receiving | Routes inbound mail for the domain to Sendmux. |
| Purpose | Record | Required for | What it does |
| --------------- | ---------- | ------------------- | ---------------------------------------------- |
| Ownership | TXT | Both modes | Confirms you control the domain. |
| Email signing | CNAME | Both modes | Enables DKIM signing through Amazon SES. |
| Sending policy | TXT | Both modes | Authorises Sendmux to send for the domain. |
| Message policy | TXT | Both modes | Defines DMARC handling for suspicious mail. |
| Bounce handling | MX and TXT | Both modes | Routes bounce handling through a subdomain. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clarify the sending-only MX guidance

With this new row, sending-only domains now require an MX record on bounce.{domain}, but the earlier copy-DNS step still says sending-only domains “do not show or check an MX record.” That contradiction can lead sending-only users to skip the required bounce MX or think the table is wrong; please qualify the earlier sentence as the inbound/domain MX, or call out that the bounce subdomain MX is still required.

Useful? React with 👍 / 👎.

| Receive mail | MX | Sending & receiving | Routes inbound mail for the domain to Sendmux. |

You can download the records as a zone file from the domain detail page.

Expand Down Expand Up @@ -90,6 +91,11 @@ Sendmux rechecks domains every six hours. A short DNS issue does not immediately
Keep only one SPF record for the same domain name. Merge all `include:`
values into the same TXT record.
</Accordion>
<Accordion title="Bounce handling is failing">
Check the MX and TXT records on the `bounce.{your-domain}` subdomain. The MX
record must use the target Sendmux shows, and the TXT record must match the
generated SPF value.
</Accordion>
<Accordion title="DMARC is failing">
Check that the TXT record is published at `_dmarc.{your - domain}` and still
includes the policy value Sendmux generated.
Expand Down
83 changes: 79 additions & 4 deletions openapi-app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2057,6 +2057,13 @@
"null"
]
},
"ses_mail_from_status": {
"description": "Amazon SES MAIL FROM status (pending/success/failed/temporary_failure/not_started)",
"type": [
"string",
"null"
]
},
"verification_status": {
"description": "Current verification state",
"enum": [
Expand All @@ -2080,6 +2087,7 @@
"mode",
"verification_status",
"ses_dkim_status",
"ses_mail_from_status",
"verified_at",
"created_at",
"mailbox_count",
Expand Down Expand Up @@ -2107,6 +2115,9 @@
}
]
},
"mail_from": {
"$ref": "#/components/schemas/MailboxDomainMailFromRecords"
},
"mx": {
"description": "MX records the customer must place. All point at Sendmux's inbound mail servers.",
"items": {
Expand All @@ -2115,7 +2126,14 @@
"type": "array"
},
"spf": {
"$ref": "#/components/schemas/MailboxDomainNameValueRecord"
"allOf": [
{
"$ref": "#/components/schemas/MailboxDomainNameValueRecord"
},
{
"description": "SPF TXT record covering Amazon SES sending"
}
]
},
"verification": {
"allOf": [
Expand All @@ -2130,13 +2148,31 @@
},
"required": [
"mx",
"mail_from",
"spf",
"dmarc",
"dkim",
"verification"
],
"type": "object"
},
"MailboxDomainMailFromRecords": {
"additionalProperties": false,
"description": "Custom MAIL FROM records for Amazon SES bounce handling",
"properties": {
"mx": {
"$ref": "#/components/schemas/MailboxDomainNamedMxRecord"
},
"spf": {
"$ref": "#/components/schemas/MailboxDomainNameValueRecord"
}
},
"required": [
"mx",
"spf"
],
"type": "object"
},
"MailboxDomainMxRecord": {
"additionalProperties": false,
"properties": {
Expand All @@ -2155,9 +2191,33 @@
],
"type": "object"
},
"MailboxDomainNamedMxRecord": {
"additionalProperties": false,
"description": "MX record for Amazon SES bounce handling",
"properties": {
"name": {
"example": "bounce.acme.com",
"type": "string"
},
"priority": {
"example": 10,
"type": "integer"
},
"target": {
"example": "feedback-smtp.eu-central-1.amazonses.com",
"type": "string"
}
},
"required": [
"name",
"priority",
"target"
],
"type": "object"
},
"MailboxDomainNameValueRecord": {
"additionalProperties": false,
"description": "SPF TXT record covering Amazon SES sending",
"description": "SPF TXT record for the custom MAIL FROM subdomain",
"properties": {
"name": {
"example": "_sendmux.acme.com",
Expand All @@ -2181,6 +2241,14 @@
"description": "DMARC TXT record matches expected value",
"type": "boolean"
},
"mail_from_mx": {
"description": "Custom MAIL FROM MX record matches expected value",
"type": "boolean"
},
"mail_from_spf": {
"description": "Custom MAIL FROM SPF TXT record matches expected value",
"type": "boolean"
},
"mx": {
"description": "MX record present when the domain is configured for receiving. Always true for send-only domains.",
"type": "boolean"
Expand All @@ -2198,7 +2266,9 @@
"mx",
"verification_txt",
"spf",
"dmarc"
"dmarc",
"mail_from_mx",
"mail_from_spf"
],
"type": "object"
},
Expand All @@ -2212,6 +2282,10 @@
"description": "Latest Amazon SES DKIM status",
"type": "string"
},
"ses_mail_from_status": {
"description": "Latest Amazon SES MAIL FROM status",
"type": "string"
},
"status": {
"description": "Post-check verification status",
"enum": [
Expand All @@ -2224,6 +2298,7 @@
"required": [
"status",
"ses_dkim_status",
"ses_mail_from_status",
"checks"
],
"type": "object"
Expand Down Expand Up @@ -8512,7 +8587,7 @@
},
"/domains/{public_id}/verify": {
"post": {
"description": "Runs an immediate DNS-over-HTTPS check of the domain's required DNS records, then asks Amazon SES for the latest DKIM status. If every required check passes the domain is marked verified. Domains automatically re-verify every 6 hours — this endpoint is only needed to trigger a check on demand.",
"description": "Runs an immediate DNS-over-HTTPS check of the domain's required DNS records, enables Amazon SES MAIL FROM after its DNS records are present, then asks Amazon SES for the latest DKIM and MAIL FROM statuses. If every required check passes the domain is marked verified. Domains automatically re-verify every 6 hours — this endpoint is only needed to trigger a check on demand.",
"operationId": "managementVerifyDomain",
"parameters": [
{
Expand Down
2 changes: 1 addition & 1 deletion postman/sendmux-management.postman_collection.json
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,7 @@
},
"request": {
"description": {
"content": "Runs an immediate DNS-over-HTTPS check of the domain's required DNS records, then asks Amazon SES for the latest DKIM status. If every required check passes the domain is marked verified. Domains automatically re-verify every 6 hours — this endpoint is only needed to trigger a check on demand.",
"content": "Runs an immediate DNS-over-HTTPS check of the domain's required DNS records, enables Amazon SES MAIL FROM after its DNS records are present, then asks Amazon SES for the latest DKIM and MAIL FROM statuses. If every required check passes the domain is marked verified. Domains automatically re-verify every 6 hours — this endpoint is only needed to trigger a check on demand.",
"type": "text/plain"
},
"header": [
Expand Down