Skip to content

Archive old messages — move messages older than N days into an "Archive" folder.

A typical retention workflow: find inbox messages past a cutoff and move them to a dedicated folder (created on first run). Dry-run by default.

Permissions

Requires delegated permission Mail.ReadWrite.

Reference

View source

from __future__ import annotations

import argparse
from datetime import datetime, timedelta, timezone

from office365.graph_client import GraphClient
from tests.settings import client_id, password, tenant, username


def main() -> None:
    parser = argparse.ArgumentParser(description="Archive messages older than N days")
    parser.add_argument("--days", type=int, default=365, help="age threshold in days (default: 365)")
    parser.add_argument("--folder", default="inbox", help="source folder (default: inbox)")
    parser.add_argument("--apply", action="store_true", help="actually move the messages")
    args = parser.parse_args()

    client = GraphClient(tenant=tenant).with_username_and_password(client_id, username, password)
    folder = client.me.mail_folders[args.folder]

    cutoff = datetime.now(timezone.utc) - timedelta(days=args.days)
    cutoff_literal = cutoff.strftime("%Y-%m-%dT%H:%M:%SZ")
    messages = folder.messages.filter(f"receivedDateTime lt {cutoff_literal}").get().execute_query()
    print(f"Found {len(messages)} message(s) older than {args.days} days")

    if not args.apply:
        for message in list(messages)[:5]:
            print(f"  would archive: {message.subject}")
        print("Dry run — re-run with --apply to archive.")
        return

    archive = folder.child_folders.ensure("Archive").execute_query()

    for message in messages:
        message.move(archive.id).execute_query()
    print(f"Moved {len(messages)} message(s) to Archive")


if __name__ == "__main__":
    main()

← Back to Outlook messages