Email Reply Classifier for Bounce, Out of Office, Auto Reply
Pricing
from $0.70 / 1,000 email classifieds
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
Maintained by CommunityActor 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
| Category | Meaning |
|---|---|
bounce | Delivery failure or delay report from a mail server |
out-of-office | Absence notice, with return date if found |
auto-reply | Other automatic answer without a ticket or absence |
receipt-confirmation | Automatic confirmation from a ticket or support system |
newsletter | Mailing list or bulk mail (List-Id, List-Unsubscribe, Precedence bulk) |
transactional | Invoice, order, shipping, payment or login code |
service | Notification from a known platform or a no-reply sender |
own | Sent from one of your own addresses (copies, loops) |
human | Everything 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.reason | When |
|---|---|
mailbox-unknown | 5.1.1, 5.1.10, user unknown, no such user, recipient not found |
domain-unknown | 5.1.2, unrouteable address, host not found |
mailbox-full | 4.2.2 or 5.2.2, quota exceeded, mailbox full |
provider-block | The receiver rejected your sending server (reputation, block lists, policy) |
spam-rejected | 5.7.1 with spam or content in the reason |
temporary | Other 4.x.x codes, greylisting, delays |
other | Anything 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
humanwithmediumconfidence. - 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.