Auto-reply detection
Tell an auto-reply from a real answer
Every message you receive carries a category: human, out_of_office, auto_reply and six more. Headers settle what they can, a model reads the rest, and a delivery report naming your own mail comes back as email.bounced on it, not as a reply.
Mail Delivery Subsystem
Delivery Status Notification (Failure)
message/delivery-status
email.bouncedpermanent: truePriya Nair
Automatic reply: Spring price list
Auto-Submitted: auto-repliedread: “I'm out of the office until 14 April with limited access to email.”
out of officeMeridian Foods Support
[Case #88213] We've received your email
no automatic headerread: “A member of our team will respond within 48 hours.”
auto-replyTomás Ortega
Re: Spring price list
no automatic headerread: “Out next week. Can you hold the old rate till I'm back?”
human
Four messages back from one send. The bounce is settled by what it carries and the out-of-office's header rules out a person; the other two carry nothing automatic and are told apart by what they say.
How it is decided
Headers narrow it, a reading settles it
RFC 3834 headers, bulk precedence, delivery reports and the receiving side's spam verdict come first. When one category is left, that is the answer. Otherwise a model reads the sender, subject, telling headers, attachment names and what was written, and may only pick from what the headers left open.
How it is decidedspam verdict: FAILspamSettledmessage/delivery-statusmailer-daemon@postmaster@bounceSettledAuto-Submitted: auto-repliedX-AutoreplyX-AutorespondPrecedence: auto_replyout of officeauto-replyReadAuto-Submitted: anything but noPrecedence: bulk, list, junkEight: every category but humanReadnone of the aboveAll nineRead
Bounces
A bounce about your send is not a reply
A delivery report naming a message you sent through us is matched to it by Message-ID and becomes email.bounced on that email. A hard bounce suppresses the address. That holds in a connected Gmail or Outlook inbox too, where reports otherwise sit among the replies.
BouncesLands in the inbox you sent from.
Content-Type: message/delivery-status Final-Recipient: rfc822; n.berg@brightline.coAction: failedStatus: 5.1.1
Lands on the email it is about.
Spring price list
to n.berg@brightline.co
- 09:02sent
- 09:02bounced · 5.1.1
- 09:02suppressed · bounce
Headers that mislead
Not every automatic-looking header is one
X-Auto-Response-Suppress asks the other side not to auto-reply; it does not say this message is one. So it, List-Id and a few others are shown to the model as context and decide nothing. An out-of-office that carries no header at all is left to the reading.
Headers that misleadRule out human on their own
- Auto-Submitted
- X-Autoreply
- X-Autorespond
- Precedence
Context for the reading
- X-Auto-Response-Suppress
- List-Unsubscribe
- List-Id
- Feedback-ID
- Return-Path
- Reply-To
- X-Mailer
- X-Priority
Categories
Nine answers to “who sent this?”
Only one of them is a reply. An out-of-office and an acknowledgement are not the same event, and a sequence, a helpdesk or a CRM should each treat them differently. For what a sequence does with them, see cold outreach; for how an answer finds its conversation, see threading.
- human
- A person wrote it, in their own words. Stop the follow-ups and hand it to whoever answers.
- out_of_office
- An away or vacation autoreply. The person exists and is away. Hold the next step; nobody has answered.
- auto_reply
- Any other automatic response: a ticket acknowledgement, an unmonitored inbox. The address is live and a machine said so. Never answer it with a machine.
- bounce
- A delivery failure that arrived as mail and matched no message you sent. Look before acting: a report about your own send arrives as email.bounced instead.
- verification
- A confirmation code, magic link or password reset. Route it to whatever signed up, or drop it.
- transactional
- Receipts, invoices, account notices. File it; it is not a reply to your campaign.
- notification
- Alerts and system mail. File it.
- marketing
- Bulk or promotional mail, cold pitches included. Keep it out of reply counts.
- spam
- Junk, scams or phishing, or failed the receiving side's spam check. Do not act on the content.
In your handler
Route on the category, not the subject line
if (event.type === "email.received") { switch (event.data.category) { case "human": return inbox.assign(event.data.thread_id) case "out_of_office": return sequences.hold(event.data.from) case "auto_reply": return // a machine acknowledged; nobody has answered yet default: return triage.queue(event.data.email_id) }}if (event.type === "email.bounced" && event.data.permanent) { await contacts.markUndeliverable(event.data.recipients, event.data.reason)}const email = await aiinbx.emails.retrieve(event.data.email_id) const submitted = email.headers.find( (header) => header.name.toLowerCase() === "auto-submitted")Questions
How do I detect an auto-reply email?
Check the headers first: Auto-Submitted with any value but no (RFC 3834), X-Autoreply, X-Autorespond and Precedence: auto_reply all mark an automatic response. Some autoresponders set none of them, which is why subject keyword lists exist, and those misfire on people. AI Inbx applies the header rules, has a model read whatever they leave open, and hands you the result as category on every inbound message.
Does X-Auto-Response-Suppress mean an email is an auto-reply?
No. Microsoft Exchange uses it to ask the receiving side not to send automatic replies back; it says nothing about whether the message carrying it was automatic. Filtering on it files real answers as robots. AI Inbx shows it to the model as context and never decides on it alone.
What is the difference between a bounce and an auto-reply?
A bounce says your message was not delivered: the address does not exist, or the mailbox is full. An auto-reply says it was delivered and the other side answered automatically. A bounce about mail you sent through AI Inbx arrives as email.bounced, with permanent set for a hard bounce; an auto-reply arrives as email.received with the category out_of_office or auto_reply.
Should out-of-office replies count as replies?
Not towards reply rates or lead status: nobody has read your message yet. They do tell you the address is live and that the person is away, so hold the sequence rather than ending it. out_of_office is kept apart from auto_reply, so you can pause for one and ignore the other.
What if someone replies asking to be removed?
That is a real reply, so it arrives as human. When the reading also finds the sender asking not to be written to again, the address is suppressed on the list the answered send named, or on the * list when it named none or nothing was sent in that conversation, and email.unsubscribed arrives with the source reply.
Does it work for mail in a connected Gmail or Outlook inbox?
Yes. Mail synced from a connected mailbox goes through the same rules and the same reading as mail received on a domain, and arrives with the same category. The one step it skips is the spam verdict: mail Gmail or Outlook filed as spam or junk is not synced at all.
Can the category be wrong?
Yes. The header rules are exact, but whatever the model reads is a judgement, and category is null when a message could not be classified at all. Treat human as one input: pair it with sender checks, a reply limit per conversation and a person to hand off to, most of all before an agent answers on its own.
Keep reading
More on building with email
- Email reply parserParse every email reply down to what the sender wrote: quoted text and repeated signatures removed, answers typed inside the quote kept where they were.ThreadingMailboxes
- Inbound email APIReceive email in your app over an API. Point an MX record at AI Inbx or connect Gmail and Outlook, and every message arrives as a signed, parsed JSON webhook.ThreadingAttachmentsMailboxesWildcard domains
- Email open trackingTrack email opens and clicks per domain or per send. Apple privacy prefetches and security scanner clicks arrive flagged as bots, each with its reason.Threading