Email Reply Classifier for Bounce, Out of Office, Auto Reply avatar

Email Reply Classifier for Bounce, Out of Office, Auto Reply

Pricing

from $0.70 / 1,000 email classifieds

Go to Apify Store
Email Reply Classifier for Bounce, Out of Office, Auto Reply

Email Reply Classifier for Bounce, Out of Office, Auto Reply

Classify incoming emails as bounce, out of office, auto reply, receipt confirmation, newsletter, transactional or human reply. Reads delivery status reports, hard and soft bounces, provider blocks and return dates. Rule based, no AI cost, works offline.

Pricing

from $0.70 / 1,000 email classifieds

Rating

0.0

(0)

Developer

Infinityware

Infinityware

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

Send your incoming emails to this Actor and get back one row per email that says what it is. Bounce, out of office, auto reply, receipt confirmation, newsletter, transactional mail, service notification or a real human reply. Each row explains why and gives you the details you need next.

  • Bounces come with the failed address, whether the failure is permanent (5.x.x) or temporary (4.x.x), a reason class and whether the receiving server only rejected your sending server. In that case the address is usually fine and should not be suppressed.
  • Out of office replies come with the return date when the text names one.
  • Human replies are flagged when they contain an unsubscribe request.

It works with rules only. No AI service, no external calls, no cost per token. Fast, cheap, explainable and privacy friendly.

Who it is for

  • Sales and CRM automations in n8n, Make or Zapier that must not stop a sequence because of an auto reply
  • People who run their own sending tools and need clean bounce handling
  • Helpdesks and AI agents that work through a mailbox, for example over the Apify MCP server

Categories

CategoryMeaning
bounceDelivery failure or delay report from a mail server
out-of-officeAbsence notice, with return date if found
auto-replyOther automatic answer without a ticket or absence
receipt-confirmationAutomatic confirmation from a ticket or support system
newsletterMailing list or bulk mail (List-Id, List-Unsubscribe, Precedence bulk)
transactionalInvoice, order, shipping, payment or login code
serviceNotification from a known platform or a no-reply sender
ownSent from one of your own addresses (copies, loops)
humanEverything else. A real person wrote it

The order matters. The first matching category wins. When in doubt the Actor says human, because treating a real reply as automatic costs more than one extra click.

How bounces are read

The Actor reads machine readable delivery status reports (multipart/report) and the plain text formats of Postfix, Exim, Exchange and Gmail.

bounce.reasonWhen
mailbox-unknown5.1.1, 5.1.10, user unknown, no such user, recipient not found
domain-unknown5.1.2, unrouteable address, host not found
mailbox-full4.2.2 or 5.2.2, quota exceeded, mailbox full
provider-blockThe receiver rejected your sending server (reputation, block lists, policy)
spam-rejected5.7.1 with spam or content in the reason
temporaryOther 4.x.x codes, greylisting, delays
otherAnything else

permanent is only true for 5.x.x status codes or Action: failed. Greylisting and other 4.x.x answers are temporary, so you do not lose valid contacts because a server hesitated once.

addressInvalid is true only for permanent mailbox-unknown or domain-unknown. Example of a provider block that keeps addressInvalid false.

SMTP error from remote mail server after initial connection:
554 IP=203.0.113.9 - None/bad reputation (...) (NOWL)

Input

Each email is either the raw source or a set of fields. An optional id is copied to the output.

{
"emails": [
{ "id": "1", "raw": "From: Mail Delivery System <MAILER-DAEMON@mx.example.net>\nSubject: Mail delivery failed\n\n..." },
{ "id": "2", "from": "Petra Muster <petra@example.de>", "subject": "Abwesenheitsnotiz", "text": "Ich bin bis zum 12.10. nicht im Büro." },
{ "id": "3", "rawBase64": "RnJvbTogLi4u" }
],
"ownAddresses": ["sales@yourcompany.example"]
}

Fields are from, to, subject, date, headers (object), text and html. For large batches put a JSON array or NDJSON file somewhere reachable over HTTPS and pass it as emailsUrl.

Other options are detectReturnDate, detectUnsubscribe, extraAutoReplyPhrases (sentences from auto reply templates you know) and includeBodyPreview.

Output example

{
"id": "1",
"category": "bounce",
"isHuman": false,
"confidence": "high",
"reasons": ["sender mailer-daemon@mx.example.net", "status 5.1.1"],
"bounce": {
"failedRecipient": "info@nobody.example",
"permanent": true,
"status": "5.1.1",
"reason": "mailbox-unknown",
"providerBlock": false,
"addressInvalid": true,
"diagnostic": "550 5.1.1 User unknown",
"remoteMta": "mx.nobody.example"
},
"outOfOffice": null,
"unsubscribeRequest": false,
"looksLikeInquiry": false,
"language": "en",
"from": "mailer-daemon@mx.example.net",
"fromFreemail": false,
"subject": "Mail delivery failed",
"inReplyTo": [],
"bodyPreview": null,
"failedRecipient": "info@nobody.example",
"bouncePermanent": true,
"bounceReason": "mailbox-unknown",
"returnDate": null
}

An absence looks like "outOfOffice": {"returnDate": "2026-10-12", "returnDateText": "bis zum 12.10."}. confidence is high when a header or a delivery report decided, otherwise medium. A mail without any match is human with medium confidence and an empty reasons list. The last four fields are flat copies for spreadsheets.

Emails that cannot be read are not written to the dataset and are not charged. They are listed with their index and error in the key-value record ERRORS. The record OUTPUT holds a summary of the run.

Use it from n8n, Make or Zapier

Call the synchronous endpoint and get the rows back in the same request.

curl -X POST "https://api.apify.com/v2/acts/infinit_bubulus~email-reply-classifier/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"emails":[{"id":"42","from":"anna@example.de","subject":"Out of Office","text":"I am away until October 14."}]}'

In n8n use an HTTP Request node with this URL. In Make and Zapier use the Apify app and the action that runs an Actor and returns the dataset items.

Pricing

You pay per classified email. 1,000 emails cost about 1 USD, with lower prices on higher Apify plans. Unreadable emails cost nothing. The run stops cleanly when your spending limit is reached.

Privacy

This Actor reads the emails you send to it and nothing else. It makes no network requests except loading your own file from emailsUrl, uses no AI service and stores nothing outside the default dataset and key-value store of your run. You are the controller of the personal data in your emails. Bounce results help you stop sending to dead addresses. Unsubscribe requests are flagged so you can honour them, which the GDPR and, in Germany, § 7 UWG expect.

No field contains mail text unless you switch on includeBodyPreview.

Limits

  • Rule based. Unusual templates end up as human with medium confidence.
  • Patterns for German, English, French, Spanish, Italian, Dutch and Polish. Return dates in other languages than German and English are only read in numeric form, for example 15/10/2026.
  • Quoted parts of a reply are cut off before the check, so a quoted automatic sentence of your own mail does not turn a real answer into an auto reply.
  • Domains in the subject are ignored. "Re: Ein Punkt auf urlaub-am-see.de" is not a vacation notice.

FAQ

Does it connect to my mailbox? No. You pass the emails in. That keeps your credentials away from the Actor.

Can I teach it my own auto reply templates? Yes, add sentences from them to extraAutoReplyPhrases.

Why is a bounce with 554 and "bad reputation" not marked as invalid? Because the receiver rejected your sending server, not the address. Fix your sender reputation or relay and send again later.