Install
Usage
threading: 'thread'(default, one chat per thread) or'sender'(one chat per address); persist threads withthreadStore: cursorThreadStore(store). That store also keeps the mailbox UID cursor, so after a restart the bot resumes after the last message it processed and never redelivers mail (even withmarkSeen: false).- Loop protection against auto-replies and mailing lists, bounce handling
(
status: 'failed'events, suppression of hard-bounced addresses). Fromis not authenticated by email itself: userequireAuthentication: { authservId }to accept only mail your MTA authenticated. Hostile headers are contained: addresses with control characters are dropped, oversized Message-IDs ignored andReferenceschains capped.securemeans implicit TLS (default except IMAP port 143, and only SMTP port 465); against a plain-text or STARTTLS portstart()/send()reject with aTLS handshake failedmessage that says which option to set.- Without IMAP,
ingest(rawMime)accepts raw MIME from an inbound-mail webhook and resolves{ status, accepted, reason? }. - A transport built from
smtpis closed onstop()and rebuilt on the next send (pooled ones too); an injectedsmtpTransportis yours andstop()never closes it.
Next steps
- Channels: choosing a channel, the capability matrix and the cross-channel contract.
- Persistent store: keep threads and the mailbox cursor across restarts.
- Package README