perf(outlook): respect Microsoft Graph throttling with batching & chunked upload #364

Closed
opened 2026-07-05 22:24:23 +00:00 by JMR-dev · 0 comments
JMR-dev commented 2026-07-05 22:24:23 +00:00 (Migrated from github.com)

Context

LibreMail is an offline-first Android email client. IMAP is currently connect-per-operation (connection reuse, issue #125, is OFF by default); full-history backfill (issue #12) prefetches message bodies + attachments on unmetered networks (default FetchPolicy.WIFI_ONLY). A perf drilldown found this opens roughly 1 + K + attachments separate authenticated connections per backfill page, saturating a provider's connection/bandwidth budget and starving interactive message-opens. These tickets track making LibreMail's connection/request patterns and data usage respect each major provider's documented limits and degrade gracefully under throttling. (Outlook/Hotmail uses the Microsoft Graph REST API; Gmail, Yahoo/AOL, and iCloud use IMAP/SMTP.)

Documented limits

  • 10,000 REST requests per 10-minute window (per App ID + mailbox).
  • Max 4 concurrent requests -> 429 if exceeded.
  • 150 MB uploaded per rolling 5-minute window.
  • Attachments over 4 MB require chunked createUploadSession.
  • SendMail: 300 recipients/day, velocity cap 30 messages/minute.
  • Up to 20 operations per $batch.
  • $top=1000 max OData page size.

Optimization levers

  • Cap Graph concurrency at 4 or fewer.
  • Multiplex reads via $batch (at most 20 ops).
  • Honor Retry-After on 429.
  • Chunked createUploadSession for attachments over 4 MB.
  • Paginate at $top=1000.
  • Respect the 30 msg/min send velocity.

Depends on

Depends on / see the throttling-backoff umbrella issue #360.

## Context LibreMail is an offline-first Android email client. IMAP is currently connect-per-operation (connection reuse, issue #125, is OFF by default); full-history backfill (issue #12) prefetches message bodies + attachments on unmetered networks (default `FetchPolicy.WIFI_ONLY`). A perf drilldown found this opens roughly `1 + K + attachments` separate authenticated connections per backfill page, saturating a provider's connection/bandwidth budget and starving interactive message-opens. These tickets track making LibreMail's connection/request patterns and data usage respect each major provider's documented limits and degrade gracefully under throttling. (Outlook/Hotmail uses the Microsoft Graph REST API; Gmail, Yahoo/AOL, and iCloud use IMAP/SMTP.) ## Documented limits - 10,000 REST requests per 10-minute window (per App ID + mailbox). - Max 4 concurrent requests -> 429 if exceeded. - 150 MB uploaded per rolling 5-minute window. - Attachments over 4 MB require chunked `createUploadSession`. - SendMail: 300 recipients/day, velocity cap 30 messages/minute. - Up to 20 operations per `$batch`. - `$top=1000` max OData page size. ## Optimization levers - Cap Graph concurrency at 4 or fewer. - Multiplex reads via `$batch` (at most 20 ops). - Honor `Retry-After` on 429. - Chunked `createUploadSession` for attachments over 4 MB. - Paginate at `$top=1000`. - Respect the 30 msg/min send velocity. ## Depends on Depends on / see the throttling-backoff umbrella issue #360.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: JMR-dev/LibreMail#364