What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
For a Node.js app, reliable email delivery depends on two connected jobs: authenticate the sending domain with the DNS records your provider requires, and stop sending to addresses the provider has suppressed. Keep your application’s contact data and the provider’s suppression list in sync, but treat complaints, hard bounces, soft bounces, and unsubscribes as different states. DNS records, suppression rules, and SDK methods vary by provider.
What to set up before sending
Use your email provider’s current domain onboarding screen and DNS instructions as the source of truth. SPF, DKIM, and DMARC help receiving providers authenticate mail; bounce handling gives the sending service a way to process delivery failures. A correct setup for one provider is not a template to copy to another.
As an Amazon Associate I earn from qualifying purchases.
Cloudflare Email Sending: a provider-specific DNS example
Cloudflare’s Email Sending guide describes MX records on cf-bounce.yourdomain.com for bounce routing, an SPF TXT record on cf-bounce, a DKIM TXT record on cf-bounce._domainkey, and a DMARC TXT record at _dmarc.yourdomain.com. These are Cloudflare-specific hostnames; use the exact values shown for your own domain in Cloudflare’s onboarding instructions.
Free tools Windows power users keep installed
One-click scans. No signup required.
Cloudflare treats Email Sending records and Email Routing records separately. Its sending records use the cf-bounce subdomain, while its routing records are on the root domain and use a separate DKIM selector. If you already publish an SPF record, Cloudflare says to add the required mechanisms to that record rather than publish a second SPF record; its documentation also notes SPF’s 10-lookup limit.
#1 Best Overall
Cloudflare says DNS changes can take up to 24 hours to propagate globally, and usually complete in 5–15 minutes for domains using Cloudflare DNS. Those are Cloudflare’s estimates for its DNS environment, not a guaranteed deadline for every DNS host or resolver. Cloudflare’s Email Service domain configuration documentation was last updated September 16, 2026.
Verify each sending function independently
- Open the sending provider’s domain setup page and add the records it specifies at your DNS host.
- Check each required record in the provider dashboard, including bounce-routing records as well as SPF, DKIM, and DMARC where required.
- Use the DNS checking tools recommended by the provider to investigate records that are missing or not yet visible.
- Send controlled test messages and inspect the provider’s message or delivery logs to confirm the sending path and authentication results.
Do not assume that verifying inbound routing also verifies outbound sending. Cloudflare documents separate verification for its Email Sending and Email Routing records.
How suppression lists protect delivery
A suppression list is a provider-maintained block on sending to an address the service considers unsuitable, commonly after a delivery failure or a validated spam complaint. Preventing repeated sends to such addresses helps protect domain reputation. Cloudflare warns that high bounce rates or spam complaints can lead inbox providers to flag a domain, route mail to spam, or block it. It recommends SPF, DKIM, and DMARC, list hygiene, and separating marketing and transactional traffic across domains or subdomains so that reputations can be managed separately.
Rank #2
Cloudflare’s 2026 Email deliverability documentation gives the following key-metric recommendations for its product. They are Cloudflare guidance, not universal standards or a promise of inbox placement.
| Metric | Cloudflare’s stated recommendation |
|---|---|
| Delivery rate | >95% |
| Hard bounce rate | <2% |
| Complaint rate | <0.1% |
Why suppression scope and expiry matter
Before syncing provider records into your application, establish what a suppression applies to and how long it remains active. Scope may be account-wide, tenant-wide, or limited to one domain; an address blocked for one sender may not automatically be blocked for another.
Cloudflare scope and matching
Cloudflare distinguishes account scope, which applies to all sending domains and subdomains in the account, from sending_domain scope, which applies only to the exact sending domain. A suppression for a root domain does not automatically match its subdomain. If your app sends from more than one domain or subdomain, preserve the provider’s scope when applying a suppression rather than treating every record as a global block.
Cloudflare suppression lifecycle
Cloudflare’s documented timing applies to its service only. Complaint suppressions do not expire. Eligible soft-bounce suppressions default to 24 hours. Some eligible hard-bounce suppressions expire after seven days; others remain indefinitely when a mailbox or domain does not exist or a recipient-side issue persists through repeated delivery attempts. Not every temporary delivery failure becomes a recipient suppression: Cloudflare gives sender-side authentication or reputation problems as examples that should not be classified that way.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Cloudflare recommends changing or deleting a complaint suppression only after the recipient opts in again through your application. A complaint is not just another transient bounce, so do not remove one as an ordinary support fix. Mailgun likewise says an address on its complaint or unsubscribe suppression lists will not receive mail even if it is allowlisted.
Cloudflare’s suppressed-recipient send behavior
Cloudflare’s “Drop suppressed recipients” setting changes what happens when a send includes a suppressed address. With the setting off, the REST API returns HTTP 400, the Workers binding throws E_RECIPIENT_SUPPRESSED, and SMTP rejects the message. With it on, suppressed recipients are removed and the remaining recipients are processed. A Node.js sender should handle the selected provider’s documented response rather than assume every send either succeeds for all recipients or fails as a whole.
Use a provider-specific Node.js API to inspect suppressions
Mailgun’s Node.js package documents suppression-list methods under mg.suppressions. Its list method is mg.suppressions.list(domain, suppressionType, query?), with examples for bounces, unsubscribes, and complaints. The package also documents get, create, upload, and destroy operations. This is a Mailgun SDK example, not a standard Node.js email API; check the current package documentation and service contract for the version you install.
const result = await mg.suppressions.list(domain, "complaints", query);
The example shows the documented method shape, not a complete runnable integration: the package setup, credential handling, query format, returned data, pagination, and API permissions must be taken from the current Mailgun documentation for your installed version. Do not assume a list call returns every record in one response.
Recommended Free Tools
Reconcile provider records with application contacts
Provider suppression records and your application’s contact records serve different purposes. The provider decides whether it will send to an address; your app decides how that address is represented in product data and which workflows may contact it. Preserve both records where appropriate rather than trying to make one system a substitute for the other.
Best Value
Build an idempotent sync
- Read provider state. Retrieve suppression records using the provider’s documented API or SDK. Confirm API permissions and the current rules for query parameters, pagination, rate limits, and available timestamps or cursors.
- Preserve record context. Store the provider record identity and timestamps where available, along with suppression type and scope. Normalize the address for matching to an application contact, but retain the original provider value for traceability.
- Apply the appropriate contact state. Keep complaint, hard-bounce, soft-bounce, and unsubscribe states distinct. Avoid collapsing them into a single “bad email” flag, because their meaning and provider lifecycle differ.
- Make repeated observations safe. Design the sync so seeing the same provider record again does not repeatedly or destructively mutate application state. This is an application design practice, not a guarantee supplied by the provider API.
- Keep provider suppression intact. Mailgun advises senders to remove suppressed addresses from contact lists they maintain while retaining the address in Mailgun’s suppression list.
- Check mutability before changes. For Cloudflare suppression records, inspect the
read_onlyfield before attempting an update or deletion. Cloudflare cautions that mutability should not be inferred from the record’s reason field.
Whether a suppressed address should disable a password reset, account notification, or other product workflow is an application policy decision. Provider suppression documentation does not prescribe account behavior; involve the product owner before changing those workflows.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Choose a polling strategy without assuming guarantees
The cited Mailgun SDK documentation establishes that suppression-list operations exist; it does not establish a universal polling interval, delivery latency, pagination completeness, retry schedule, or record-ordering guarantee. Do not treat a guessed cadence as a provider commitment.
Before setting a production schedule, check the current API contract for pagination or cursors, rate limits, timestamp semantics, retry behavior, and whether the provider offers webhooks or another event mechanism. If the contract does not specify a property, treat it as unknown. Any polling frequency you choose is an application design decision that should account for how quickly your app needs to reflect changes and the provider’s documented limits.
Compare provider behavior before committing
Suppression and integration details are service-specific. Compare the behaviors that affect your sending design rather than assuming one provider’s policy or SDK transfers to another.
| Provider example | Documented point | What to verify for your integration |
|---|---|---|
| Cloudflare Email Service | Distinguishes account and exact sending-domain suppression scope; documents complaint, soft-bounce, and hard-bounce lifecycles. | Required DNS values, scope for each sending domain, suppressed-recipient behavior, record mutability, and current API permissions. |
| Mailgun | Its Node.js package documents list, get, create, upload, and destroy suppression operations; its guidance says to remove suppressed addresses from sender-maintained contact lists while retaining provider suppression. | Current SDK version, query and response shape, pagination, rate limits, and the behavior of each suppression type. |
| Amazon SES | The SuppressionOptions API reference names COMPLAINT and hard-bounce BOUNCE as automatic suppression reasons and allows account or tenant scope. |
Current API and SDK operations for your use case; that API reference does not itself provide a Node.js polling tutorial. |
For a multi-domain setup, also check whether suppressions are scoped to an account, tenant, domain, or exact subdomain, and whether marketing and transactional mail should use separate domains or subdomains. The right design depends on the provider’s scope rules and your application’s sending patterns.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




