Skip to content

Receiving and inboxes (0.9.0) - #9

Open
heliocosta-dev wants to merge 3 commits into
mainfrom
feat/inboxes
Open

heliocosta-dev wants to merge 3 commits into
mainfrom
feat/inboxes

Conversation

@heliocosta-dev

Copy link
Copy Markdown
Member

Adds receiving and inboxes to the SDK, matching the API from MillionSend/millionsend v0.8.0 (receiving) and MillionSend/millionsend#112 (inboxes). The SDK version becomes 0.9.0.

  • Received mail: list (with the wait long-poll and the inbox, recipient, sender, subject, unread and quarantine filters), get, reply, forward, delete and attachments.
  • Inboxes: create, list, get, update and delete, plus safety settings, the latest verification code, quarantine and release, labels, threads with their emails, and drafts with send and reject.
  • Send results: replies, forwards and draft sends return the sent email, or on 202 the draft waiting for approval, kept apart from a sent result.
  • Related resources:
    • webhooks take inbox_ids, and the event list has email.received and the 14 inbox.* events;
    • API keys take inbox_id;
    • domains take receiving_catch_all.
  • Ids: empty, . and .. ids are refused before any request is made.

The SDK was checked against the API's OpenAPI document and route code on the product branch: paths, query and body field names, nullability, and the 202 branch. This SDK's tests and linters pass locally.

Merge and release once the product release with inboxes is deployed.

🤖 Generated with Claude Code

heliocosta-dev and others added 3 commits October 12, 2026 03:37
…s, safety, quarantine and codes (0.9.0)

MillionSend.Receiving lists (with the long-poll wait: and the held ids),
reads, replies to, forwards and removes received mail, and
MillionSend.Receiving.Attachments reads its attachments. MillionSend.Inboxes
covers inbox CRUD plus Safety, Codes, Quarantine, Labels, Threads,
ThreadEmails and Drafts.

Reply, forward and draft send return {:ok, {:sent, struct}}, or
{:ok, {:draft, %Draft{}}} when the inbox's send rules held the message
(the API answers 202). A wait: raises the HTTP receive timeout past Req's
15 s default. Domains gain receiving_catch_all, API keys inbox_id and
webhooks inbox_ids.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
URL normalization resolves an empty, "." or ".." path segment away, so an
id such as ".." turned DELETE /inboxes/{id}/labels/.. into
DELETE /inboxes/{id}/. Request.run now checks every path once, and such
a call returns {:error, %MillionSend.Error{name: "validation_error",
status_code: nil}} without sending anything.

EmailList documents the long-poll's held keys as the API sends them,
quarantine_reason included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Receiving.list takes quarantined: true (held mail only), which the API
  accepts and the option list silently dropped.
- Inboxes.ThreadEmails.list and get take include_quarantined: true, so an
  owner can read the held messages of a thread that Threads.list shows.
- Webhooks docs and README: only the inbox.* events are opt-in;
  email.received still reaches an endpoint subscribed to all events.
- Receiving docs: since: needs an offset; reply/forward thread_id and
  inbox_id are nil for mail no inbox took.
- The long-poll test's held item now has the API's shape (reason
  pending|quarantined, plus quarantine_reason).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant