horde / activesync
ActiveSync server library
Requires
- php: ^7.4 || ^8
- ext-ctype: *
- horde/compress: ^3 || dev-FRAMEWORK_6_0
- horde/date: ^3 || dev-FRAMEWORK_6_0
- horde/exception: ^3 || dev-FRAMEWORK_6_0
- horde/horde-installer-plugin: dev-FRAMEWORK_6_0 || ^3 || ^2
- horde/icalendar: ^3 || dev-FRAMEWORK_6_0
- horde/log: ^3 || dev-FRAMEWORK_6_0
- horde/mapi: ^2 || dev-FRAMEWORK_6_0
- horde/mime: ^3 || dev-FRAMEWORK_6_0
- horde/stream: ^2 || dev-FRAMEWORK_6_0
- horde/support: ^3 || dev-FRAMEWORK_6_0
- horde/translation: ^3 || dev-FRAMEWORK_6_0
- horde/util: ^3 || dev-FRAMEWORK_6_0
Requires (Dev)
- horde/controller: ^3 || dev-FRAMEWORK_6_0
- horde/db: ^3 || dev-FRAMEWORK_6_0
- horde/imap_client: ^3 || dev-FRAMEWORK_6_0
Suggests
- horde/db: ^3 || dev-FRAMEWORK_6_0
- horde/imap_client: ^3 || dev-FRAMEWORK_6_0
- horde/mail: ^3 || dev-FRAMEWORK_6_0
- horde/mongo: ^2 || dev-FRAMEWORK_6_0
- horde/text_filter: ^3 || dev-FRAMEWORK_6_0
Provides
None
Conflicts
None
Replaces
None
- dev-FRAMEWORK_6_0 / 3.x-dev
- v3.2.0
- v3.1.0
- v3.0.2
- v3.0.1
- v3.0.0
- v3.0.0RC5
- v3.0.0RC4
- v3.0.0RC3
- v3.0.0RC2
- v3.0.0RC1
- v3.0.0beta3
- v3.0.0beta2
- v3.0.0beta1
- v3.0.0alpha10
- v3.0.0alpha9
- v3.0.0alpha8
- v3.0.0alpha7
- v3.0.0alpha6
- v3.0.0alpha4
- 3.0.0alpha2
- 3.0.0alpha1
- 2.41.9
- 2.41.8
- 2.41.7
- 2.41.6
- 2.41.5
- 2.41.4
- 2.41.3
- 2.41.2
- 2.41.1
- 2.41.0
- 2.40.2
- 2.40.1
- 2.40.0
- 2.39.9
- 2.39.8
- 2.39.7
- 2.39.6
- 2.39.5
- 2.39.4
- 2.39.3
- 2.39.2
- 2.39.1
- 2.39.0
- 2.38.8
- 2.38.7
- 2.38.6
- 2.38.5
- 2.38.4
- 2.38.3
- 2.38.2
- 2.38.1
- 2.38.0
- 2.37.4
- 2.37.3
- 2.37.2
- 2.37.1
- 2.37.0
- 2.36.0
- 2.35.0
- 2.34.10
- 2.34.9
- 2.34.8
- 2.34.7
- 2.34.6
- 2.34.5
- 2.34.4
- 2.34.3
- 2.34.2
- 2.34.1
- 2.34.0
- 2.33.3
- 2.33.2
- 2.33.1
- 2.33.0
- 2.32.0
- 2.31.10
- 2.31.9
- 2.31.8
- 2.31.7
- 2.31.6
- 2.31.5
- 2.31.4
- 2.31.3
- 2.31.2
- 2.31.1
- 2.31.0
- 2.30.6
- 2.30.5
- 2.30.4
- 2.30.3
- 2.30.2
- 2.30.1
- 2.30.0
- 2.29.2
- 2.29.1
- 2.29.0
- 2.28.6
- 2.28.5
- 2.28.4
- 2.28.3
- 2.28.2
- 2.28.1
- 2.28.0
- 2.27.1
- 2.27.0
- 2.26.1
- 2.26.0
- 2.25.0
- 2.24.1
- 2.24.0
- 2.23.1
- 2.23.0
- 2.22.0
- 2.21.0
- 2.20.5
- 2.20.4
- 2.20.3
- 2.20.2
- 2.20.1
- 2.20.0
- 2.19.4
- 2.19.3
- 2.19.2
- 2.19.1
- 2.19.0
- 2.18.1
- 2.18.0
- 2.17.0
- 2.16.11
- 2.16.10
- 2.16.9
- 2.16.8
- 2.16.7
- 2.16.6
- 2.16.5
- 2.16.4
- 2.16.3
- 2.16.2
- 2.16.1
- 2.16.0
- 2.15.1
- 2.15.0
- 2.13.1
- 2.12.4
- 2.12.3
- 2.12.2
- 2.9.3
- 2.9.2
- 2.8.5
- dev-feat/maximum-truncation-size
- dev-feat/search-streaming
- dev-fix/bogus-binary-size-and-clients
- dev-fix/deleted-flag-native-exchange
- dev-fix/draft-uid-alias-wire-identity
- dev-fix/instanceid-occurrence-deletes
- dev-fix/ping-stale-response-backlog-recovery
- dev-feat/ghost-item-eviction
- dev-feat/persistent-folder-uid-map
- dev-feat/sync-idempotent-import
- dev-feat/sync-performance
- dev-refactor/centralize-client-quirks
- dev-feat/sync-response-streaming
- dev-fix/settings-oof-empty-msgs
- dev-ci/horde-components
- dev-refactor/eas16-find-psr4-classes
- dev-refactor/followup-to-pr-40
- dev-feat/adopt-compress-psr4
- dev-feat/issue-core-67-modern-serialization
- dev-fix/php84-implicit-nullable-deprecation
- dev-fix/bulletproof-error-handler
- dev-FRAMEWORK_5_2
- dev-master
- dev-opaque_test
This package is auto-updated.
Last update: 2026-09-14 08:36:51 UTC
README
PHP library implementing the Microsoft Exchange ActiveSync (EAS) protocol,
versions 2.5 through 16.1. It decodes WBXML requests from mobile clients,
drives synchronization through a pluggable backend driver, and encodes WBXML
responses — including streamed Sync response delivery for clients with hard
read timeouts.
In a typical Horde deployment, this package is the protocol engine. The
data backend lives in horde/core as Horde_Core_ActiveSync_Driver, which
talks to IMAP (mail), Kronolith (calendar), Turba (contacts), Nag (tasks), and
Mnemo (notes). The library itself has no Horde application dependencies at
runtime and can be embedded with a custom driver.
Documentation
The documentation is split by audience:
| You are… | You want to… | Read |
|---|---|---|
| Administrator / end user | Enable ActiveSync, configure protocol versions, streaming, logging, the web server endpoint, and per-user policy | doc/configuration.md |
| Library user / integrator | Embed the library in your own product: server object, driver API, state backends, custom backends | doc/integration.md |
| ActiveSync developer | Understand the internals: components, request lifecycle, Sync anatomy, state machine, tests | doc/architecture.md |
Cross-cutting references, useful to all three:
| Topic | Read |
|---|---|
| Supported EAS protocol versions, negotiation, and what each version adds | doc/protocol-versions.md |
Streamed Sync response delivery — design, error model, tuning |
doc/sync-streaming.md |
| Heartbeat polling and export performance — batched STATUS, read-only state loads, bulk export | doc/sync-performance.md |
| Open work and the Horde 6 roadmap | doc/todo.md |
At a glance
Mobile client (Outlook, iOS Mail, Gmail, …)
│ HTTPS POST, WBXML body
▼
Web server → /Microsoft-Server-ActiveSync (rewritten to Horde rpc.php)
│
▼
Horde_Rpc_ActiveSync (horde/rpc)
│
▼
Horde_ActiveSync ← this library
├── Request handlers (Sync, FolderSync, Ping, …)
├── Message classes (Appointment, Mail, Contact, …)
├── WBXML encoder/decoder
└── Horde_ActiveSync_Driver_Base (abstract backend API)
│
▼
Horde_Core_ActiveSync_Driver (horde/core, in a Horde deployment)
└── Horde_Core_ActiveSync_Connector → Horde apps / IMAP
Protocol versions
All EAS versions from 2.5 to 16.1 are implemented and production-supported.
Clients negotiate down to the server's advertised ceiling; the ceiling is
configurable globally, per user, and per device. Details, the version
negotiation mechanics, and a per-version feature delta are in
doc/protocol-versions.md.
| Version | Notes |
|---|---|
| 2.5 | Baseline; reduced command set (no Settings, ItemOperations, Find) |
| 12.0 / 12.1 | AirSyncBase bodies, provisioning 2, empty/hanging Sync, SyncCache |
| 14.0 / 14.1 | Conversations, reply/forward state, rights management, body parts |
| 16.0 | Calendar instance model, drafts sync, Find, AirSyncBase:Location |
| 16.1 | Meeting time proposals, account-only remote wipe |
Feature highlights
- Mail: folder & message sync, flags, drafts (incl. EAS 16 draft
editing/sending), send/reply/forward, attachments, meeting requests,
mailbox
Findwith KQL parsing, GAL search - Calendar: full recurrence + exceptions, attendees, meeting responses, EAS 16 instance model, meeting time proposals (16.1)
- Contacts / Tasks / Notes: full CRUD sync incl. task recurrence
- Device management: provisioning & policies, remote wipe (full and account-only), per-device protocol ceilings, per-device logging
- State: SQL (default) or MongoDB backends, sync-key/modseq change
tracking,
Pinglong-poll,SyncCache - Delivery: optional streamed
Syncresponses (chunked HTTP) with deferred up-sync import and WBXML keep-alives, so clients with ~30 s read timeouts survive large batches — seedoc/sync-streaming.md - Efficiency: heartbeat polling batches all mailbox status checks into
one IMAP round trip and reuses memoized, lock-free state reads; message
export prefetches email items in batches — see
doc/sync-performance.md
Package layout
lib/Horde/ActiveSync.php Server class and protocol constants
lib/Horde/ActiveSync/
Request/ EAS command handlers
Message/ Item type WBXML mappings
State/ Sync state persistence (SQL, Mongo)
Wbxml/ Encoder, decoder, code pages
Imap/ IMAP-to-EAS message building
Find/ EAS 16.0 Find command helpers
Driver/ Base, Mock backends
migration/ SQL schema for state tables
doc/ Documentation (see index above)
test/unit/ PHPUnit tests
License
GPL-2.0-only. See LICENSE.