← Back to docs

Dead Letter Queue

Inspect, retry, and clear emails that exhausted delivery retries, and diagnose why they failed.

What the dead letter queue is

When an email cannot be delivered, EuroMail retries it on a backoff schedule. If every retry is exhausted, or the failure is permanent, the email moves to the dead letter queue (DLQ) instead of being silently dropped. The DLQ is your safety net: nothing fails invisibly, and you get a chance to fix the cause and resend.

For the API surface, see the Dead Letters API reference.

Listing dead letters

curl "https://api.euromail.dev/v1/dead-letters" \
  -H "X-EuroMail-Api-Key: em_live_your_key_here"

Each entry includes the original message, the recipient, and the failure reason and timestamp. Common reasons:

ReasonMeaningFix
Hard bounceThe mailbox does not exist.The address is now suppressed; correct your data.
Repeated soft bounceMailbox full / temporarily unavailable through every retry.Often resolves later. Retry.
Domain not verifiedSent from an unverified from domain.Verify the domain, then retry.
Content rejectedThe message tripped a content/spam gate.Fix the content, then resend.

Retrying

After fixing the underlying cause, requeue a dead letter for delivery from the Dead Letters page in the dashboard, which exposes a retry action per message (/dead-letters/{id}/retry). Retry is the right move for transient failures (a mailbox that was full, a domain you have since verified). It is the wrong move for hard bounces. The address is invalid and is already suppressed.

Clearing

Dead letters you do not intend to retry can be deleted (/dead-letters/{id}/delete) once you have recorded what you needed. Keeping the DLQ tidy makes the genuinely actionable failures easy to see.

Monitoring the queue

The DLQ depth is exported as a Prometheus metric, so you can alert when failures accumulate rather than discovering them by chance. A sudden rise in DLQ volume is an early warning of a broken integration, an expired DKIM key, or a deliverability problem. Investigate it the same way you would a spike in bounces.

Designing for failure

  • Treat a send as "accepted", not "delivered." The 202 response means queued; final state arrives via webhooks.
  • Make sends idempotent with an idempotency_key (see Sending Emails) so a retry after your own outage never double-sends.
  • Alert on DLQ depth so a class of failures surfaces immediately.

Send your first email in about 90 seconds

The free tier includes 1,000 emails a month. All data stays in Finland | GDPR compliance without the paperwork.

Create free account See live delivery data