gromox — overview of the Gromox groupware server


Gromox is a groupware server capable of serving as a replacement for Microsoft Exchange. Connectivity options include RPC/HTTP (Outlook Anywhere), IMAP, POP3, an SMTP-speaking LDA, and a PHP module with a Z-MAPI function subset.

Gromox relies on other components to provide a sensibly complete mail system, such as Postfix as a mail transfer agent, and grommunio-admin for user management. A web interface is available with grommunio-web. The grommunio distribution ships these essentials and has a ready-to-run installation of Gromox. system.

Configuration files

Program configuration files reside within /etc/gromox. Most of the programs have a config_file_path directive with which the search path for further config files can be specified. For example, http(8gx) defaults to config_file_path=/etc/gromox/http:/etc/gromox, so the mysql_adaptor(4gx) plugin as loaded by http will first try /etc/gromox/http/mysql_adaptor.cfg, then /etc/gromox/mysql_adaptor.cfg. This allows having one file that is shared between multiple programs as well as being able to override on a per program-basis.


  • User information is held in a MariaDB/MySQL database. This database can be accessed by multiple Gromox servers, and so enables distributed Gromox operation. The MariaDB system itself provides the necessary utilities for distributing or replicating this database.

  • Per-user e-mail messages are stored in a SQLite database (e.g. /var/lib/gromox/user/m1/1/1/exchange.sqlite3), as is a message index (e.g. /var/lib/gromox/user/m1/1/1/midb.sqlite3). These are normally only used by one system, but can be shared through network filesystems provided that file locking is properly implemented in the filesystem driver. Normal file mechanisms can be used to backup or transfer the database to another Gromox host.


  • mapi(7gx) — Definition for “Messaging Application Programming Interface”

Exchange subsystem

  • autodiscover(4gx) — Autodiscover HTTP Service Protocol handler

  • exchange_emsmdb(4gx) — http(8gx) processing plugin for the Wire Format Protocol (Outlook/Exchange RPCs).

  • exchange_nsp(4gx) — http(8gx) processing plugin for the Exchange Server Name Service Provider Interface Protocol.

  • exchange_rfr(4gx) — http(8gx) processing plugin for the Address Book Name Service Provider Interface Referral Protocol.

  • exmdb_provider(4gx) — http(8gx) service plugin for exmdb connections

  • freebusy(8gx) — Helper program for the EWS Freebusy mechanism

  • http(8gx)

  • mod_cache(4gx) — http(8gx) processing plugin for serving objects from a local filesystem

  • mod_fastcgi(4gx) — http(8gx) processing plugin for proxying requests to FastCGI servers

  • mod_rewrite(4gx) — http(8gx) processing plugin for altering HTTP request URIs before processing

  • mh_emsmdb(4gx) — MAPI-HTTP processor for EMSMDB

  • mh_nsp(4gx) — MAPI-HTTP processor for NSPI

  • timer(8gx) — deferred command executor

PHP-MAPI subsystem

  • rtf2html(1gx) — C++ helper program for the mapi(4gx) mapi_decompressrtf function

  • zcore(8gx) — Bridge for PHP-MAPI requests

Mail retrieval agent subsystem

  • imap(8gx) — IMAP server

  • midb_agent(4gx) — Service plugin for conversing with midb(8gx)

  • pop3(8gx) — POP3 server

Local delivery agent

  • alias_translator(4gx) — Alias resolution plugin for delivery(8gx)

  • delivery(8gx) — Backend for local delivery

  • delivery-queue(8gx) — LMTP/SMTP frontend for local delivery

  • domain_list(4gx) — instance of str_table(4gx)

  • message_enqueue(4gx) — Message enqueueing flusher plugin for delivery-queue(8gx)

  • str_table(4gx) — string table match plugin

  • user_filter(4gx) — Service plugin for application of user login limits

Auxiliary services

  • pam_gromox(8gx) — a PAM plugin to authenticate with Gromox

  • rtf2html(1gx) — C++ helper for php_mapi’s mapi_decompressrtf function

  • adaptor(8gx) — SQL data cache generator

  • event(8gx) — Folder change notification daemon

  • midb(8gx) — Message Index database daemon

System administration

  • gromox-abktconv(8gx) — Utility for converting between ABKT and JSON

  • gromox-abktpull(8gx) — Utility to extract ABKT templates from LDIF

  • gromox-dbop(8gx) — Database maintenance utility

  • gromox-kdb2mt(8gx) — Utility for analysis of Kopano databases

  • gromox-mailq(8gx) — SMTP queue lister

  • gromox-mt2exm(8gx) — Utility for bulk-importing mail items into a Gromox store

  • gromox-pff2mt(8gx) — Utility for analysis of PFF/PST/OST files

  • mkmidb(8gx) — Tool for creating a blank message index database

  • mkprivate(8gx) — Tool for creating a blank private store

  • mkpublic(8gx) — Tool for creating a blank public store

  • rebuild(8gx) — Tool for rebuilding a message store

  • sa.cfg(5gx) — configuration file for system administration CGI programs

Service plugins

  • at_client(4gx) — Service plugin for deferred command execution with at(1)

  • authmgr(4gx) — Demultiplexer for authentication requests

  • ip6_container(4gx) — trivial source connection counter

  • ldap_adaptor(4gx) — LDAP connector for authentication

  • logthru(4gx) — service plugin for a stdout/file logger

  • mysql_adaptor(4gx) — MySQL/MariaDB connector for user metadata and authentication

  • textmaps(4gx) — Service plugin for various data maps

  • timer_agent(4gx) — Service plugin for deferred command execution with timer(8gx)

Past commands that have been removed

The following is a list of programs that no longer exist. It is inteded solely to capture keyword searches within the documentation for said obsolete/removed commands.

  • gromox-pffimport — replaced by gromox-pff2mt and gromox-mt2exm.

Language bindings

  • mapi(4gx) — PHP module providing MAPI functions

Listening sockets

  • /run/gromox/zcore.sock — zcore(8gx)

  • *:24 — delivery-queue(8gx) LMTP/SMTP service (when Postfix is on 25)

  • :*25 — Normally, your own MTA (postfix(1), exim(8), whatever the case may be). delivery-queue(8gx) will only be on 25 in developer setups that wish to cut and skip Postfix/etc. to get a simpler test setup.

  • *:80 — http(8gx) HTTP service

  • *:110 — pop3(8gx) POP3 service

  • *:143 — imap(8gx) IMAP service

  • *:443 — http(8gx) HTTP over implicit TLS

  • *:993 — imap(8gx) IMAP over implicit TLS

  • *:995 — pop3(8gx) POP3 over implicit TLS

  • [::1]:3344 — zcore(8gx) management console

  • [::1]:4455 — imap(8gx) management console

  • [::1]:5000 — exmdb_provider(4gx) plugin inside http(8gx)

  • [::1]:5555 — midb(8gx) service

  • [::1]:5566 — delivery-queue(8gx) management console

  • [::1]:6666 — timer(8gx) service

  • [::1]:7788 — pop3(8gx) management console

  • [::1]:8899 — http(8gx) management console

  • [::1]:9900 — midb(8gx) management console

  • [::1]:22222 — pad(8gx) service

  • [::1]:33333 — event(8gx) service


The exact paths depend on the options used when Gromox’s build was configured. Especially the path for libraries, represented in this documentation as /usr/lib/gromox, may for example actually be /usr/lib64/gromox or /usr/lib/riscv64-linux-gnu, depending on the platform.

  • /usr/lib/gromox/libgxf_*.so: flusher plugins for delivery-queue(8gx)

  • /usr/lib/gromox/libgxh_*.so: HTTP processing plugins for http(8gx)

  • /usr/lib/gromox/libgxm_*.so: hook plugins for delivery(8gx)

  • /usr/lib/gromox/libgxp_*.so: PDU processing plugins for http(8gx)

  • /usr/lib/gromox/libgxs_*.so: service plugins

  • /var/lib/gromox/user: directory hierarchy for private mailboxes

  • /var/lib/gromox/domain: directory hierarchy for public mailboxes (public folders)
    It is presently not possible to use a single directory for both mailbox types, since exmdb_list.txt uses the infix to determine the mode of access.
  • …/user/account@domain: individual mailbox container
    The directory name has no required form. It is entirely dependent upon the users.maildir column in MySQL. Some implementations of user management use a 2-level hierarchy, e.g. /user/1/0.
  • …/a@d/exmdb/exchange.sqlite3: mail store with almost everything (no mail bodies)

  • …/a@d/cid/: attachments and message bodies (PR_BODY, PR_HTML, PR_RTF_COMPRESSED).

  • …/a@d/eml/mid_string: RFC 5322 representation for a message.
    mid_string has no required form. Typically, there is timestamp.seqid.hostname which represents EMLs captured by delivery(8gx) on ingestion, and timestamp.seqid.midb for EMLs generated by midb(8gx) out of MAPI messages.
  • …/a@d/ext/mid_string: Digest for the RFC 5322 file.
    This JSON-encoded file contains e.g. indexing information for individual MIME parts of the RFC 5322 representation. Generated by midb(8gx).