Skip to content

MSGraphDeltaService

Track incremental changes in Outlook mailboxes using Microsoft Graph delta queries. Establish a delta link on first sync, then use it to fetch only new or changed messages on subsequent calls.

Credentials

Uses the Entra ID app registration (client_id, client_secret, tenant_id). Typical Graph permissions: Mail.Read.

Usage

python
from elsai_cloud.microsoft_delta import MSGraphDeltaService, DeltaConfig, DeltaStrategy
from datetime import datetime, timezone, timedelta
import asyncio

async def sync_emails():
    config = DeltaConfig(
        timeout=45.0,
        max_retries=3,
        page_size=50,
        establishment_strategies=[
            DeltaStrategy.CURRENT_TIME,
            DeltaStrategy.FUTURE_FILTER,
            DeltaStrategy.SKIP_TOKEN,
            DeltaStrategy.STANDARD,
        ],
    )

    service = MSGraphDeltaService(
        config=config,
        client_id="your_client_id",
        client_secret="your_client_secret",
        tenant_id="your_tenant_id",
    )

    user_id = "user@example.com"
    folder = "inbox"

    # Establish a delta link (first sync)
    delta_link = await service.establish_delta_link(user_id, folder)

    # Validate the delta link
    is_valid = await service.validate_delta_link(delta_link)
    print(f"Delta link valid: {is_valid}")

    # Get all messages (initial sync)
    initial_result = await service.get_initial_delta(user_id, folder)
    print(f"Total messages: {initial_result.total_count}")

    # Filter to last 7 days
    start_date = datetime.now(timezone.utc) - timedelta(days=7)
    filtered = await service.get_initial_delta(user_id, folder, start_date)
    print(f"Messages in last 7 days: {filtered.total_count}")

    # Get incremental changes since last sync
    if initial_result.delta_link:
        changes = await service.get_delta_changes(initial_result.delta_link)
        print(f"New changes: {changes.total_count}")

    # Get delta statistics
    if initial_result.delta_link:
        stats = await service.get_delta_statistics(initial_result.delta_link)
        print(f"Stats: {stats}")

    # Update config at runtime
    new_config = DeltaConfig(timeout=60.0, max_retries=5, page_size=100)
    service.update_config(new_config)

asyncio.run(sync_emails())

DeltaConfig parameters:

ParameterDescription
timeoutRequest timeout in seconds
max_retriesMaximum retry attempts on failure
page_sizeNumber of messages per page
establishment_strategiesOrdered list of DeltaStrategy values to try when establishing a delta link

DeltaStrategy options:

StrategyDescription
CURRENT_TIMEStart delta from the current timestamp
FUTURE_FILTERUse a filter for future messages
SKIP_TOKENUse skip token pagination
STANDARDStandard delta query

See also

Copyright © 2026 elsai foundry.