IMAPD.CONF(5)
π IMAPD.CONF(5) π
okay bestie, welcome to the Cyrus IMAP manual page for imapd.conf β like, the actual config file that runs the whole vibe. it's long, it's iconic, and we're gonna get through it together. grab a snack π
β¨ NAME β¨
imapd.conf β Cyrus IMAP documentation. it's the IMAP configuration file, no cap.
πΈ DESCRIPTION πΈ
/etc/imapd.conf is the configuration file for the Cyrus IMAP server. it defines all the local parameters for IMAP. literally the control room.
every single line in /etc/imapd.conf looks like this:
option: value
where option is the name of the configuration option you're setting, and value is what you're setting it to. simple. clean. slay.
so there's no limit to how long a line can be, but if you want, you can slap a \ (backslash) character as the very last character on a line to force it to continue onto the next one. and no extra whitespace gets inserted before or after that \. heads up though: a line that's been split with \ is still considered a single line. the illusion is fake, it's still one line fr fr.
for example:
option:\
value1 value2 \
value3
is equivalent to:
option: value1 value2 value3
blank lines? ignored. lines starting with #? also ignored. they're just there for the aesthetic π
now, for boolean and enumerated options β these values turn the option on: yes, on, t, true, 1. and these turn it off: no, off, f, false, 0.
Duration options take the form of a number followed by a unit, like 32m (that's 32 minutes). the units are d (days), h (hours), m (minutes), and s (seconds). you can combine multiple units and they get summed together β so 1h30m is the same as 90m. if you don't specify a unit at all, an option-specific backward-compatible default unit is assumed (and that's documented on an option-by-option basis). and just so we're clear, these are simple time units: 1d=24h, 1h=60m, 1m=60s. daylight savings, timezones, leap adjustments, all that chaos? not considered. not even a little.
Byte size options take the form of a number followed by a unit, like 1KiB (one kibibyte, bestie). the units are B (bytes), KiB (kibibytes), MiB (mebibytes), and GiB (gibibytes) β which you can also spell KB, MB, and GB. units get parsed without regard to case, so go wild. but here's the thing: regardless of how you spell it, these units are always powers of 2, never metric. that means 1GiB = 1024MiB, 1MiB = 1024KiB, 1KiB = 1024B. if no unit is specified, an option-specific backward-compatible default unit is assumed (documented per-option, as always).
π¦ FIELD DESCRIPTIONS π¦
the sections below detail every option you can drop into /etc/imapd.conf, and they show each option's default value. some options have no default value β those show up as <no default>. and some options default to the empty string β those are listed as <none>. iykyk.
acl_admin_implies_write: 0β if this is enabled, anybody with the admin ACL on a mailbox implicitly gets the ability to write to that mailbox too. two-for-one, no extra charge.addressbookprefix: #addressbooksβ the prefix for the addressbook mailbox hierarchies. the hierarchy delimiter gets appended automatically, bestie, don't worry about it. the public addressbook hierarchy lives at the toplevel of the shared namespace. a user's personal addressbook hierarchy is a child of their Inbox.admins: <empty string>β the list of userids with administrative rights. separate each userid with a space. sites using Kerberos authentication can use separate"admin"instances. π
note that accounts used by actual users should not be administrators. administrative accounts should not receive mail. like, if user"jbRo"is a user reading mail, he should not also be in theadminsline. some problems may occur otherwise β most notably the ability of administrators to create top-level mailboxes visible to users but not writable by users. messy. don't do it.
afspts_localrealms: <none>β the list of realms that get treated as local, and are therefore stripped during identifier canonicalization (this is for the AFSPTS ptloader module). this is different fromloginrealmsbecause it happens later in the authorization process β the user id gets canonified for PTS lookup at that point.afspts_mycell: <none>β the cell to use for AFS PTS lookups. defaults to the local cell. home sweet home πallowallsubscribe: 0β allow subscription to mailboxes that don't exist. this is typically used on backend servers in a Murder, so users can subscribe to mailboxes that don't live on their"home"server. it can also be a workaround for IMAP clients that just don't play well with nonexistent or unselectable mailboxes (looking at you, Microsoft Outlook π).allowanonymouslogin: 0β permit logins by the user"anonymous"using any password. this also allows use of the SASLANONYMOUSmechanism. wild but okay.allowapop: 1β allow use of the POP3APOPauthentication command.
note that this command requires that SASL is compiled with APOP support, that the plaintext passwords are available in a SASL auxprop backend (likesasldb), and that the system can provide enough entropy (say, from/dev/urandom) to create a challenge in the banner. three requirements, all of them, no skipping.
allowdeleted: 0β allow access to deleted and expunged data viavendor.cmu-*access. spooky πallownewnews: 0β allow use of the NNTPNEWNEWScommand.
note that this is a very expensive command and should only be enabled when absolutely necessary. like, emergency-level necessary.
allowplaintext: 0β if enabled, it allows the use of cleartext passwords on the wire. π
by default, using cleartext passwords requires a TLS/SSL encryption layer to be negotiated before any cleartext authentication mechanisms get advertised or allowed. if you want to require a TLS/SSL encryption layer before ANY authentication, go look at the tls_required option.
allowsetacl: 1β defaults to enabled. if you disable it, it disallows the use of theSETACLcommand at all via IMAP. nope, not even once.allowspecialusesubfolder: 0β if enabled, it allows special-use folders to be moved into subfolders.
by default, cyrus does not allow a special-use folder to be moved or renamed if the new folder isn't a direct folder of the user's INBOX. why? because this was implemented to prevent clients renaming Sent to Trash/Sent, which would confuse other clients. protecting the other clients, one restriction at a time π«Ά
allowstarttls: 0β if enabled, it allows upgrading a plaintext connection to use TLS (a.k.a. opportunistic TLS) via a protocol-specific command/mechanism. IMAP, LMTP, NNTP, and ManageSieve use theSTARTTLScommand. POP3 uses theSTLScommand. HTTP uses theUpgradeheader field. everyone's got their own way of doing it, and honestly? respect.allowusermoves: 0β allow moving user accounts (with all their associated meta-data) viaRENAMEorXFER.
note that measures should be taken to make sure the user being moved is not logged in, and cannot login during the move. if you fail to do that, the user's meta-data (seen state, subscriptions, etc) may get corrupted or end up out of date. do not skip this step bestie.
altnamespace: 1β use the alternate IMAP namespace, where personal folders live at the same level in the hierarchy as INBOX. β¨
this option ONLY applies where interaction takes place with the client/user. currently that's limited to the IMAP protocol (imapd) and Sieve scripts (lmtpd). this option does NOT apply to admin tools like cyradm (admins ONLY), reconstruct, quota, etc. and it does NOR affect LMTP delivery of messages directly to mailboxes via plus-addressing. also, the default changed in 3.0 from off to on. glow-up, honestly.
altprefix: Alt Foldersβ alternative INBOX spellings that can't be accessed inaltnamespaceotherwise go under here.annotation_db: twoskipβ the cyrusdb backend to use for mailbox annotations.
allowed values: skiplist, twoskip, zeroskip
annotation_db_path: <none>β the absolute path to the annotations db file. if you don't specify it, it'll beconfigdirectory/annotations.db.anyoneuseracl: 1β should non-admin users be allowed to set ACLs for the'anyone'user on their mailboxes? in a large organization this can cause support problems, but it's enabled by default. chaos but make it convenient πannotation_allow_undefined: 0β allow clients to store values for entries that aren't defined either by Cyrus or in theannotations_definitionsfile.annotation_definitions: <none>β file containing external (third-party) annotation definitions.
each line of the file specifies the properties of an annotation and has this form:
name, scope, attrib-type, proxy-type, attrib-names, acl
- name β is the hierarchical name as in RFC 5257 or RFC 5464 (in the latter case, without the leading
/sharedor/private). for example,/vendor/acme/blurdybloop. - scope β specifies whether the annotation is for the server, a mailbox, or a message.
- attrib-type β specifies the attribute data type, which is used only to check the string value passed by clients when setting annotations. the attrib-type is one of:
stringβ any value is accepted.content-typeβ this obsolete data type, which was useful for early drafts of the standard, is accepted but silently translated tostring.booleanβ only the strings"true"or"false"are accepted. checking is case-insensitive but the value is forced to lowercase.intβ integers are accepted.uintβ non-negative integers are accepted.
- proxy-type β specifies whether this attribute is for the backend or proxy servers or both (
proxy_and_backend). - attrib-names β is the space-separated list of available attributes for the annotation. possible attribute names are
value.shared,value.priv, andvalue(which permits bothvalue.privandvalue.shared). the attribute namessize,size.shared, andsize.privare accepted but ignored β these attributes are automatically provided by the server if the corresponding value attribute is specified. some obsolete attributes, which were defined in early drafts of the standard, are accepted and ignored with a warning. π«
and that's where part 1 wraps β more is coming, so don't go anywhere π
extra-permissions is the extra ACL permission bits required for setting this annotation, in standard IMAP ACL permission bit string format. Note that this is in addition to the permission bits specified in RFC 5257 and RFC 5464, so leaving this field empty is harmless. Note also that there is no way to specify that an annotation can only be set by an admin user; in particular the a permission bit does <em>not</em> achieve this.
Blank lines and lines beginning with # are ignored. π
π annotation_callout: <none>
The pathname of a callout to be used to automatically add annotations or flags to a message when it is appended to a mailbox. The path can be either an executable (including a script), or a UNIX domain socket. π¦
π annotation_callout_disable_append: 0
Disables annotations on append with xrunannotator. π
π annotation_enable_legacy_commands: 0
Whether to enable the legacy GETANNOTATION/SETANNOTATION commands. These commands are deprecated and will be removed in the future, but might be useful in the meantime for supporting old clients that do not implement the RFC 5464 IMAP METADATA extension. π
π aps_topic: <none>
Topic for Apple Push Service registration. π
π aps_topic_caldav: <none>
Topic for Apple Push Service registration for CalDAV. π
π aps_topic_carddav: <none>
Topic for Apple Push Service registration for CardDAV. π
π aps_expiry: 1d
Time after which a CalDAV/CardDAV push subscription will expire. A client will have to refresh the subscription in order to continue to receive push notifications. β°
π archive_enabled: 0
Is archiving enabled for this server. You also need to have an archivepartition for the mailbox. Archiving allows older email to be stored on slower, cheaper disks β even within the same mailbox, as distinct from partitions. π
π archive_days: <none>
Deprecated in favour of archive_after.
π archive_after: 7d
The duration after which to move messages to the archive partition if archiving is enabled.
For backward compatibility, if no unit is specified, days is assumed.
π archive_maxsize: 1024 K
The size of the largest message that won't be archived immediately.
For backward compatibility, if no unit is specified, kibibytes is assumed.
π archive_keepflagged: 0
If set, messages with the \Flagged system flag won't be archived, provided they are smaller than archive_maxsize. π©
π archivepartition-name: <none>
The pathname of the archive partition name, corresponding to spool partition partition-name. For any mailbox residing in a directory on partition-name, the archived messages will be stored in a corresponding directory on archivepartition-name. Note that not every partition-name option is strictly required to have a corresponding archivepartition-name option, but that without one there's no benefit to enabling archiving. π
π auditlog: 0
Should cyrus output log entries for every action taken on a message file or mailboxes list entry? It's noisy so disabled by default, but can be very useful for tracking down what happened if things look strange. π
π auth_mech: unix
The authorization mechanism to use.
Allowed values: unix, pts, krb5, mboxgroups
π autocreateinboxfolders: <none>
Deprecated in favor of autocreate_inbox_folders.
π autocreatequota: <none>
Deprecated in favor of autocreate_quota.
π autocreatequotamsg: -1
Deprecated in favor of autocreate_quota_messages.
π autosievefolders: <none>
Deprecated in favor of autocreate_sieve_folders.
π generate_compiled_sieve_script: 0
Deprecated in favor of autocreate_sieve_script_compile.
π autocreate_sieve_compiled_script: <none>
Deprecated in favor of autocreate_sieve_script_compiled.
π autosubscribeinboxfolders: <none>
Deprecated in favor of autocreate_subscribe_folders.
π autosubscribesharedfolders: <none>
Deprecated in favor of autocreate_subscribe_sharedfolders.
π autosubscribe_all_sharedfolders: 0
Deprecated in favor of autocreate_subscribe_sharedfolders_all.
π autocreate_acl: <none>
If folders are to be created by autocreate_inbox_folders, this setting can be used to apply additional ACLs to the autocreated folders. The syntax is "autocreate_acl folder identifier rights", where folder must match one of the autocreate_inbox_folders folders, identifier must be a valid cyrus identifier, and rights must be a valid cyrus rights string. Multiple identifier|rights pairs can be assigned to a single folder by providing this setting multiple times.
For example, "autocreate_acl Plus anyone p" would allow lmtp delivery to a folder named "Plus". β¨
π autocreate_inbox_folders: <none>
If a user does not have an INBOX already, and the INBOX is to be created, create the list of folders in this setting as well. autocreate_inbox_folders is a list of INBOX's subfolders separated by a "|", that are automatically created by the server under the following two scenarios. Leading and trailing whitespace is stripped, so "Junk | Trash" results in two folders: "Junk" and "Trash". See also the xlist-flag option, for setting special-use flags on autocreated folders.
INBOX folders are created under both the following conditions:
- The user logins via the IMAP or the POP3 protocol.
autocreate_quotaoption must have a value of zero or greater. - A message arrives for the user through the
lmtpd(8).autocreate_postoption must be enabled.
π autocreate_post: 0
If enabled, when lmtpd(8) receives an incoming mail for an INBOX that does not exist, then the INBOX is automatically created by lmtpd(8) and delivery of the message continues. π
π autocreate_quota: -1
If set to a value of zero or higher, users have their INBOX folders created upon a successful login event or upon lmtpd(8) message delivery if autocreate_post is enabled, provided their INBOX did not yet already exist.
The user's quota is set to the value if it is greater than zero, otherwise the user has unlimited quota.
Note that quota has kibibyte granularity. Values specified here will be truncated to the nearest whole kibibyte.
For backward compatibility, if no unit is specified, kibibytes is assumed.
π autocreate_quota_messages: -1
If set to a value of zero or higher, users who have their INBOX folders created upon a successful login event (see autocreate_quota), or upon lmtpd(8) message delivery if autocreate_post is enabled, receive the message quota configured in this option.
The default of -1 disables assigning message quota.
For consistency with autocreate_quota, a value of zero is treated as unlimited message quota, rather than a message quota of zero. π€―
π autocreate_sieve_folders: <none>
A "|" separated list of subfolders of INBOX that will be automatically created, if requested by a sieve filter, through the "fileinto" action. The default is to create no folders automatically.
Leading and trailing whitespace is stripped from each folder, so a setting of "Junk | Trash" will create two folders: "Junk" and "Trash". πΈ
π autocreate_sieve_script: <none>
The full path of a file that contains a sieve script. This script automatically becomes a user's initial default sieve filter script.
When this option is not defined, no default sieve filter is created. The file must be readable by the Cyrus daemon.
π autocreate_sieve_script_compile: 0
If set to yes and no compiled sieve script file exists, the sieve script which is compiled on the fly will be saved in the file name that autocreate_sieve_compiledscript option points to. In order a compiled script to be generated, autocreate_sieve_script and autocreate_sieve_compiledscript must have valid values. βοΈ
π autocreate_sieve_script_compiled: <none>
The full path of a file that contains a compiled in bytecode sieve script. This script automatically becomes a user's initial default sieve filter script. If this option is not specified, or the filename doesn't exist then the script defined by autocreate_sieve_script is compiled on the fly and installed as the user's default sieve script.
π autocreate_subscribe_folders: <none>
A list of folder names, separated by "|", that the users get automatically subscribed to, when their INBOX is created. These folder names must have been included in the autocreateinboxfolders option of the imapd.conf. π
π autocreate_subscribe_sharedfolders: <none>
A list of shared folders (bulletin boards), separated by "|", that the users get automatically subscribed to, after their INBOX is created. The shared folder must have been created and the user must have the required permissions to get subscribed to it. Otherwise, subscribing to the shared folder fails. π
π autocreate_subscribe_sharedfolders_all: 0
If set to yes, the user is automatically subscribed to all shared folders, one has permission to subscribe to. π
π autocreate_users: anyone
A space separated list of users and/or groups that are allowed their INBOX to be automatically created. π
π autoexpunge: 0
If set to yes, then all Deleted messages will be automatically expunged whenever an index is closed, whether CLOSE, UNSELECT, SELECT or on disconnect. π
π backuppartition-name: <none>
Deprecated. No longer used.
π backup_compact_minsize: 0
Deprecated. No longer used.
π backup_compact_maxsize: 0
Deprecated. No longer used.
π backup_compact_work_threshold: 1
Deprecated. No longer used.
π backup_staging_path: <none>
Deprecated. No longer used.
π backup_retention_days: <none>
Deprecated. No longer used.
π backup_retention: 7d
Deprecated. No longer used.
backup_db: twoskip
Deprecated. Not used anymore, bestie. It's giving retirement era, no cap π
backup_db_path: <none>
Also deprecated, also no longer used. Bye π
backup_keep_previous: 0
Deprecated. No longer used. That's the whole vibe, nothing else to report π
boundary_limit: 1000
Okay so listen. Messages get parsed recursively, and if the MIME structure is deep enough it can literally cause a stack overflow π so do NOT parse deeper than this many layers of MIME structure. The default of 1000 is already way higher than any sane message should ever have. She's generous, but she has limits.
caldav_accept_invalid_rrules: 0
If you turn this on, the server will accept invalid RRULEs (like FREQ=WEEKLY;BYMONTHDAY=15) instead of rejecting them as errors. Living dangerously, I respect it π«Ά
caldav_alarm_db_path: <none>
Path to the caldav_alarm database file. If you don't set it, it defaults to $confdir/caldav_alarm.sqlite3 β¨
caldav_alarm_support_components: VEVENT VTODO
Space-separated list of iCalendar component types that calalarmd generates alarms for. Allowed values: VEVENT, VTODO. Pick your faves π
caldav_alarm_suppress_file: <none>
If this file exists, calalarmd will not process events. It's the "do not disturb" of alarm configs π
caldav_allowattach: 1
Enables managed attachments support on the CalDAV server. Slay.
caldav_allowcalendaradmin: 0
Enables the per-user calendar administration web UI on the CalDAV server. Off by default, but the glow-up is there when you want it π
caldav_allowscheduling: on
Enables calendar scheduling operations. And if you set it to "apple", the server will emulate Apple CalendarServer behavior as closely as possible. Allowed values: off, on, apple. Pick your fighter π
caldav_create_attach: 1
Creates the 'Attachments' collection if it doesn't already exist. It'll just spawn it for you, iconic behavior.
caldav_create_default: 1
Creates the 'Default' calendar if it doesn't already exist. Same energy, different collection π
caldav_create_sched: 1
Creates the 'Inbox' and 'Outbox' calendars if they don't already exist. The scheduling trio is complete β¨
caldav_historical_age: 7d
How long after an occurrence of an event or task has concluded that it's considered 'historical'. And bestie, listen carefully: changes to historical occurrences of events or tasks WILL NOT have invite or reply messages sent for them. A negative value means events and tasks are NEVER considered historical.
For backward compatibility, if no unit is specified, days is assumed. Lowkey a classic.
caldav_maxdatetime: 20380119T031407Z
The latest date and time accepted by the server (ISO format). This value is also used for expanding non-terminating recurrence rules.
Heads up: increasing this value will require the DAV databases for calendars to be reconstructed with the dav_reconstruct utility in order to see its effect on server-side time-based queries. So like, plan for that fr fr.
caldav_mindatetime: 19011213T204552Z
The earliest date and time accepted by the server (ISO format). The other end of the timeline πΈ
caldav_realm: <none>
The realm to present for HTTP authentication of CalDAV resources. If it's not set (which is the default), the value of the "servername" option gets used instead. It borrows, respectfully π
calendarprefix: #calendars
The prefix for the calendar mailboxes hierarchies. The hierarchy delimiter gets automatically appended. The public calendar hierarchy lives at the toplevel of the shared namespace, and a user's personal calendar hierarchy is a child of their Inbox. Family tree behavior π
calendar_default_displayname: personal
The displayname used when creating a user's 'Default' calendar. Cute name, honestly.
calendar_user_address_set: <none>
Space-separated list of domains corresponding to calendar user addresses that the server is responsible for. If it's not set (the default), the value of the "defaultdomain" option gets used. Bestie behavior: it just borrows the default π«Ά
calendar_component_set: VEVENT VTODO VJOURNAL VFREEBUSY VAVAILABILITY VPOLL
Space-separated list of iCalendar component types that calendar object resources may contain in a calendar collection. Important detail: this restriction is only set at calendar creation time, and only if the CalDAV client hasn't specified a restriction in the creation request. Allowed values: VEVENT, VTODO, VJOURNAL, VFREEBUSY, VAVAILABILITY, VPOLL. Whole squad present π
calendar_minimum_alarm_interval: 5m
The minimum allowed interval between alarms for a recurring event. It's primarily used to suppress alarms for MINUTELY and SECONDLY recurrences, because wow those get loud. The minimum value is 0, which allows all alarms. Chaotic, but valid π₯
calendar_suppress_duplicate_alarms: 1
Suppresses duplicate calendar alarms in calalarmd. If this is set, then at most one alarm notification is sent for any given alarm action, point in time and calendar event. No spam in the group chat, we love to see it β¨
carddav_allowaddmember: 0
Enables support for POST add-member on the CardDAV server. Off by default, but she's there when you need her.
carddav_allowaddressbookadmin: 0
Enables the per-user addressbook administration web UI on the CardDAV server. Admin era π
carddav_realm: <none>
The realm to present for HTTP authentication of CardDAV resources. If it's not set (the default), the value of the "servername" option will be used. Same borrowing situation as CalDAV, they're sisters fr π
carddav_repair_vcard: 0
If enabled, VCARDs with invalid content are attempted to be repaired during creation. Glow-up surgery for your contact cards π
chatty: 0
If yes, you get syslog tags and commands for every IMAP command, mailboxes for every LMTP connection, every POP3 command, etc. Basically she will NOT stop talking. Main character energy, but in the logs π
client_bind: 0
If enabled, a specific IP will be bound when performing a client connection. client_bind_name is used if it's set, otherwise servername is used. This is useful on multi-homed servers where Cyrus should not use other services' interfaces.
If it's not enabled (the default), no bind will be performed, and client connections will use an IP chosen by the operating system. Let the OS cook π
client_bind_name: <none>
IPv4, IPv6 address or hostname to bind for client connections when client_bind is enabled. If it's not set (the default), servername will be used. Again with the borrowing, it's a whole theme π
client_timeout: 10s
Time to wait before returning a timeout failure when performing a client connection (e.g. in a murder environment). For backward compatibility, if no unit is specified, seconds is assumed.
commandmintimer: <none>
Time in floating point seconds. Any imap command that takes longer than this time is logged. Snitch mode activated π₯
configdirectory: <none>
The pathname of the IMAP configuration directory. This field is required. No skipping, bestie, she's mandatory π«Ά
createonpost: 0
Deprecated in favor of autocreate_post. Old news, use the new one π
conversations: 0
Enables the XCONVERSATIONS extensions. It extracts conversation tracking information from incoming messages and tracks them in per-user databases. Very "I know what you said three messages ago" of her β¨
conversations_counted_flags: <none>
Space-separated list of flags for which per-conversation counts will be kept.
Not me reminding you: you need to reconstruct the conversations database with ctl_conversationsdb if you change this option on a running server, or the counts will be wrong. Wrong counts are a crime, don't do it π
conversations_db: skiplist
The cyrusdb backend to use for the per-user conversations database. Allowed values: skiplist, sql, twoskip, zeroskip. Choose wisely, she's committed π
conversations_expire_days: <none>
Deprecated in favor of conversations_expire_after. Retired icon π
conversations_expire_after: 90d
How long the conversations database keeps the message tracking information needed for receiving new messages in existing conversations. For backward compatibility, if no unit is specified, days is assumed. Classic move.
conversations_keep_existing: 1
During conversations cleanup, don't clean up if there are still existing emails with one of the mentioned CIDs. She's a keeper, literally π«Ά
conversations_max_thread: 100
Maximum size for a single thread. Threads will split if they have this many messages in them and another message arrives. Sometimes you just gotta split the group chat π
conversations_max_guidrecords: 5000
Maximum records with the same guid. This is just a sanity check to stop the same email being added and removed over and over. Anti-chaos guardrails, we stan π
conversations_max_guidexists: 100
Maximum records with the same guid. This maps to "labels", so with the default of 100, you can only have 100 labels on an email in JMAP. Budget your labels bestie π
conversations_max_guidinfolder: 10
Maximum records with the same guid in the same folder. You can't do this via JMAP, but you could via IMAP. The default of 10 should be heaps normally! She said heaps, she's so real for that π
crossdomains: 0
Enables cross domain sharing. This works best with alt namespace and unix hierarchy separators on, so you get Other Users/foo@example.com/.... Crossing the streams, respectfully π
crossdomains_onlyother: 0
Only show the domain for users in other domains than your own (for backwards compatibility if you're already sharing. Keep the parentheses energy, it's part of the lore.
cyrus_group: <none>
The name of the group Cyrus services will run as. If it's not configured, the primary group of cyrus_user will be used. Can be further overridden by setting the $CYRUS_GROUP environment variable. Layers on layers π
cyrus_user: <none>
The username to use as the 'cyrus' user. If it's not configured, the compile time default will be used. Can be further overridden by setting the $CYRUS_USER environment variable. Same stacking situation π
davdriveprefix: #drive
The prefix for the DAV storage mailboxes hierarchies. The hierarchy delimiter will be automatically appended. The public storage hierarchy will be at the toplevel of the shared namespace, and a user's personal storage hierarchy will be a child of their Inbox. Again with the family tree, it's consistent, we respect it πΈ
davnotificationsprefix: #notifications
The prefix for the DAV notifications hierarchy. The hierarchy delimiter will be automatically appended. The public notifications hierarchy will be at the toplevel of the shared namespace, and a user's personal notifications hierarchy will be a child of their Inbox. Same layout, different prefix, keep up bestie β¨
dav_realm: <none>
The realm to present for HTTP authentication of generic DAV resources (principals). If it's not set (the default), the value of the "servername" option will be used. The borrowing continues, it's a saga π
dav_lock_timeout: 20s
The maximum time to wait for a write lock on the per-user DAV database before timeout. For HTTP requests, the HTTP status code 503 is returned if the lock can not be obtained within this time. For backward compatibility, if no unit is specified, seconds is assumed.
debug: 0
If enabled, allow syslog() to pass LOG_DEBUG messages. Turn it on and get the whole tea, turn it off and stay peaceful π
This can be toggled for a running process by sending it SIGUSR1. π₯
debug_command β default: <none>
okay so this is the debug command that processes started with the -D option are gonna use. the string is a C format string that gets 3 options: the first one is the name of the executable (as specified in the cmd parameter in cyrus.conf), the second one is the pid (an integer), and the third one is the service ID. example: /usr/local/bin/gdb /usr/cyrus/bin/%s %d
debug_log_sync_partition_choice β default: 0
turn this on and replication will log which partition it chose for staging. this is mainly useful for regression testing the sync_client -a switch. π
debug_slowio β default: 0
if enabled, I/O operations will be artificially slowed down. ngl this option has no effect unless Cyrus was compiled with the --enable-debug-slowio configure argument. this is mainly useful for testing certain edge case handling.
debug_writefail_guid β default: <none>
if you set this, any arriving message with this guid will fail as if the underlying disk write had failed β pretending to be a disk full condition. π this is mainly useful for regression testing certain edge case handling. currently only implemented for replication uploads.
defaultacl β default: anyone lrs
the Access Control List (ACL) that gets placed on a newly-created (non-user) mailbox that does not have a parent mailbox.
defaultdomain β default: internal
the default domain for virtual domain support.
defaultpartition β default: <none>
the partition name used by default for new mailboxes. if you don't specify it, the partition with the most free space will be used for new mailboxes.
bestie note: the partition you specify here must also be specified aspartition-name, where you substitute 'name' for the alphanumeric string you setdefaultpartitionto.
defaultsearchtier β default: <empty string>
name of the default tier that messages will be indexed to. search indexes can be organized in tiers to allow index storage in different directories and physical media. see the man page of squatter for details. the default search tier also requires the definition of an according searchtierpartition-name entry.
this option MUST be specified for xapian search. no exceptions, periodt.
defaultserver β default: <none>
the backend server name used by default for new mailboxes. if not specified, the server with the most free space will be used for new mailboxes.
deletedprefix β default: DELETED
with delete_mode set to delayed, the deletedprefix setting defines the prefix for the hierarchy of deleted mailboxes.
the hierarchy delimiter will be automatically appended. β¨
delete_mode β default: delayed
the manner in which mailboxes are deleted. in the default delayed mode, mailboxes that are being deleted are renamed to a special mailbox hierarchy under the deletedprefix, to be removed later by cyr_expire(8).
in immediate mode, the mailbox is removed from the filesystem immediately.
allowed values: immediate, delayed
delete_unsubscribe β default: 0
whether to also unsubscribe from mailboxes when they are deleted. heads up: this behaviour contravenes RFC 3501 section 6.3.9, but it may be useful for avoiding user/client software confusion. π«Ά
deleteright β default: c
Deprecated β only used for backwards compatibility with existing installations. lists the old RFC 2086 right which was used to grant the user the ability to delete a mailbox. if a user has this right, they will automatically be given the new x right.
disable_user_namespace β default: 0
preclude list command on user namespace. if set to yes, the LIST response will never include any other user's mailbox. admin users will always see all mailboxes.
disable_shared_namespace β default: 0
preclude list command on shared namespace. if set to yes, the LIST response will never include any non-user mailboxes. admin users will always see all mailboxes.
disconnect_on_vanished_mailbox β default: 0
if enabled, IMAP/POP3/NNTP clients will be disconnected by the server if the currently selected mailbox is (re)moved by another session. otherwise, the missing mailbox is treated as empty while in use by the client. π
ischedule_dkim_domain β default: <none>
the domain to be reported as doing iSchedule DKIM signing.
ischedule_dkim_key_file β default: <none>
file containing the private key for iSchedule DKIM signing.
ischedule_dkim_required β default: 1
a DKIM signature is required on received iSchedule requests.
ischedule_dkim_selector β default: <none>
name of the selector subdividing the domain namespace. this specifies the actual key used for iSchedule DKIM signing within the domain.
duplicate_db β default: twoskip
the cyrusdb backend to use for the duplicate delivery suppression and sieve. allowed values: skiplist, sql, twoskip, zeroskip
duplicate_db_path β default: <none>
the absolute path to the duplicate db file. if not specified, it will be configdirectory/deliver.db
duplicatesuppression β default: 1
if enabled, lmtpd will suppress delivery of a message to a mailbox if a message with the same message-id (or resent-message-id) is recorded as having already been delivered to the mailbox. records the mailbox and message-id/resent-message-id of all successful deliveries. π
event_content_inclusion_mode β default: standard
the mode in which message content may be included with MessageAppend and MessageNew. standard mode is the default behavior in which the message is included up to a size with the notification. in message mode, the message is included and may be truncated to a size. in header mode, it includes headers truncated to a size. in body mode, it includes body truncated to a size. in headerbody mode, it includes full headers and body truncated to a size. allowed values: standard, message, header, body, headerbody
event_content_size β default: 0
truncate the message content that may be included with MessageAppend and MessageNew. set 0 to include the entire message itself.
if no unit is specified, bytes is assumed.
event_exclude_flags β default: <none>
don't send event notification for given IMAP flag(s).
event_exclude_specialuse β default: \Junk
don't send event notification for folder with given special-use attributes. set ALL for any folder.
event_extra_params β default: timestamp
space-separated list of extra parameters to add to any appropriated event.
allowed values: bodyStructure, clientAddress, diskUsed, flagNames, messageContent, messageSize, messages, modseq, service, timestamp, uidnext, vnd.cmu.midset, vnd.cmu.unseenMessages, vnd.cmu.envelope, vnd.cmu.sessionId, vnd.cmu.mailboxACL, vnd.cmu.mbtype, vnd.cmu.davFilename, vnd.cmu.davUid, vnd.fastmail.clientId, vnd.fastmail.sessionId, vnd.fastmail.convExists, vnd.fastmail.convUnseen, vnd.fastmail.cid, vnd.fastmail.counters, vnd.fastmail.jmapEmail, vnd.fastmail.jmapStates, vnd.cmu.emailid, vnd.cmu.threadid, vnd.cmu.visibleUsers
event_groups β default: message mailbox
space-separated list of groups of related events to turn on notification.
allowed values: message, quota, flags, access, mailbox, subscription, calendar, applepushservice, jmap
event_notifier β default: <none>
Notifyd(8) method to use for "EVENT" notifications which are based on the RFC 5423. if not set, "EVENT" notifications are disabled.
expunge_mode β default: delayed
the mode in which messages (and their corresponding cache entries) are expunged. semidelayed mode is the old behavior in which the message files are purged at the time of the EXPUNGE, but index and cache records are retained to facilitate QRESYNC. in delayed mode, which is the default since Cyrus 2.5.0, the message files are also retained, allowing unexpunge to rescue them. π¦ in immediate mode, both the message files and the index records are removed as soon as possible. in all cases, nothing will be finally purged until all other processes have closed the mailbox to ensure they never see data disappear under them. in semidelayed or delayed mode, a later run of cyr_expire will clean out the retained records (and possibly message files). this reduces the amount of I/O that takes place at the time of EXPUNGE and should result in greater responsiveness for the client, especially when expunging a large number of messages. allowed values: immediate, semidelayed, delayed
failedloginpause β default: 3s
time to pause after a failed login.
for backward compatibility, if no unit is specified, seconds is assumed.
fatals_abort β default: 0
if enabled, when fatal errors are detected, Cyrus will call abort() to produce a core dump, unless the error was due to a misbehaving client. this is useful if you have the ability to debug a core dump.
if not enabled (the default), the process will exit normally with an error code.
flushseenstate β default: 1
Deprecated. no longer used. that's it, that's the whole vibe. π
foolstupidclients β default: 0
if enabled, only list the personal namespace when a LIST "*" is performed (it changes the request to a LIST "INBOX*"). π
force_sasl_client_mech β default: <none>
force preference of a given SASL mechanism for client side operations (e.g., murder environments). this is separate from (and overridden by) the ability to use the <host shortname>_mechs option to set preferred mechanisms for a specific host.
global_lock β default: 1
use a global shared lock for ALL writes, allowing the global lock wrapper tool to freeze the world. π₯
fulldirhash β default: 0
if enabled, uses an improved directory hashing scheme which hashes on the entire username instead of using just the first letter as the hash. this changes hash algorithm used for quota and user directories and if hashimapspool is enabled, the entire mail spool.
note: this option CANNOT be changed on a live system. the server must be quiesced and then the directories moved with the rehash utility.
hashimapspool: 0β turn this on and the partitions get hashed too, not just the config directories. Highly recommend if one of your partitions has a super bushy mailbox tree π³ (iykyk).hostname_mechs: <none>β force a specific list of SASL mechanisms to be used when authenticating to the backend server hostname (where hostname is the short hostname of the server in question). Leave it unset and it'll go ask the server what mechanisms it has and pick one. Cyrus Murder energy πhostname_password: <none>β the password used to authenticate to the backend server hostname (again, hostname = short hostname of the server). Cyrus Murder β¨httpallowcompress: 1β when it's on, the server compresses response payloads if the client says it can handle them. π«Ά Heads up though: the compressed data shows up in telemetry logs, so literally only the response headers stay human-readable. πhttpallowcors: <none>β a wildmat pattern listing the origin URIs (scheme "://" host [ ":" port ]) that are allowed to make Cross-Origin Resource Sharing (CORS) requests on the server. Default? CORS requests are disabled, periodt.
Note that the scheme and host should both be lowercase, the port should be omitted if you're using the default for the scheme (80 for http, 443 for https), and there should be no trailing'/'β like"http://www.example.com:8080"or"https://example.org". π
httpallowtrace: 0β lets you use the TRACE method.
Not me warning you that sensitive data might get disclosed by the response π be careful bestie.
httpallowedurls: <none>β a space-separated list of relative URLs (paths) rooted at"httpdocroot"(see below) that httpd should serve. Set it and you limit the served static content to only those paths β everything else gets"404 Not Found"π«. Leave it unset and httpd will serve literally anything it finds in"httpdocroot".
Note that any path specified by "rss_feedlist_template" is an exception to this rule. β¨
httpcontentmd5: 0β enable this and HTTP responses include a Content-MD5 header, for an end-to-end message integrity check (MIC) of the payload body. π Fair warning: it eats extra CPU to generate that MD5 digest, and clients might just ignore it anyway π.httpdocroot: <none>β if set, http serves the static content (html/text/jpeg/gif files, etc) rooted at this directory. Otherwise httpd serves no static content at all.httpkeepalive: 20sβ sets the length of the HTTP server's keepalive heartbeat. Default is 20 seconds. Minimum value is0, which disables the keepalive heartbeat entirely. When it's on and a request takes longer than httpkeepalive to process, the server sends the client provisional responses every httpkeepalive until it can send the final one. π«Ά
For backward compatibility, if no unit is specified, seconds is assumed.
httplogheaders: <none>β space-separated list of HTTP header fields that get included in the requests logged byhttpd(8). πhttpmodules: <empty string>β space-separated list of HTTP modules enabled inhttpd(8). This option has no effect on modules disabled at compile time due to missing dependencies (e.g.libical).
Note that"domainkey"depends on"ischedule"being enabled, and both"freebusy"and"ischedule"depend on"caldav"being enabled. Allowed values:admin,caldav,carddav,cgi,domainkey,freebusy,ischedule,jmap,prometheus,rss,tzdist,webdavπ
httpprettytelemetry: 0β enable it and HTTP response payloads that include server-generated markup languages (HTML, XML) use line breaks and indentation so telemetry logs are nicer for humans to read. π But it does increase the amount of data sent across the wire, so, tradeoffs.httppts_uri: <none>β the URL endpoint used when querying group membership, in URI Template (level 1) format [RFC 6570]. The URL MUST contain a variable called"groupId". β οΈhttptimeout: 5mβ sets the length of the HTTP server's inactivity autologout timer. Minimum value is0, which disables persistent connections.
For backwards compatibility, if no unit is specified, minutes is assumed.
http_h2_altsvc: <none>β if set, HTTP/2 (over TLS) is advertised as being available on the specified[host]:port. β¨http_jwt_key_dir: <none>β the absolute path to a directory containing one or more key files used to authenticate JSON Web Tokens (RFC 7519) for HTTP connections. Supported JWS algorithms:"HS256","HS384","HS512","RS256","RS384","RS512".
A key file is made of one or more keys encoded in PEM format. RSA keys must sit between the lines "-----BEGIN PUBLIC KEY-----" and "-----END PUBLIC KEY-----". HMAC digest keys must sit between "-----BEGIN HMAC KEY-----" and "-----END HMAC KEY-----", encoded in base64. Any lines before or after a PEM key definition are ignored, and empty lines are ignored anywhere in the file. π§
The JSON Web Token must be the value of the HTTP "Authorization" header, using the "Bearer" authentication scheme. The JWS Header must include the "alg" and "typ" parameters. A header with any other parameter is rejected. The JWS Payload must include the "sub" claim with the Cyrus user identifier as its value. It may include the "iat" claim (see http_jwt_max_age). A payload with any other claim is rejected. π«
http_jwt_max_age: 0sβ defines the timespan in which a JSON Web Token is valid (see http_jwt_key). The value must be zero or positive.
If non-zero, the timespan starts at the point in time specified in the "iat" claim of the JWS Payload and ends after the duration of this option value has passed. Tokens without an "iat" claim, or with an issue date in the future, are rejected. There is no leeway for clock skew. Starting from Cyrus version 3.8, the "iat" claim only gets validated if no "exp" claim is present.
The zero value disables validation of the "iat" JWS claim.
Starting from Cyrus 3.8, the "nbf" and "exp" claims are always validated. π
icalendar_max_size: 0β maximum allowed iCalendar size. CalDAV and JMAP will reject storage of resources whose iCalendar representation is larger than this.
If set to 0 (the default), a large internally-defined limit gets applied.
If no unit is specified, bytes is assumed.
idlesocket: {configdirectory}/socket/idleβ Unix domain socket that idled listens on. πignorereference: 0β for backwards compatibility with Cyrus 1.5.10 and earlier β ignore the reference argument inLISTorLSUBcommands. π¦imapidlepoll: 60sβ the interval for polling for mailbox changes and ALERTs while running theIDLEcommand. This option is used when idled is not enabled or can't be contacted. The minimum value is 1 second. A value of0will disableIDLE.
For backward compatibility, if no unit is specified, seconds is assumed.
imapidresponse: 1β when enabled, the server responds to anIDcommand with a parameter list containing: version, vendor, support-url, os, os-version, command, arguments, environment. Otherwise the server returnsNIL. β¨imapmagicplus: 0β only list a restricted set of mailboxes via IMAP, by usinguserid+namespacesyntax as the authentication/authorization id. Usinguserid+(with an empty namespace) will list only subscribed mailboxes. πimap_inprogress_interval: 10sβ the interval after which the server sends an"INPROGRESS"response code to the client during a long-running imap command (e.g. search, copy). The default is 10 seconds. The minimum value is0, which disables"INPROGRESS"response codes.imipnotifier: <none>β theNotifyd(8)method to use for"IMIP"notifications, which are based on RFC 6047. If it's not set,"IMIP"notifications are disabled. πimplicit_owner_rights: lkxanβ the implicit Access Control List (ACL) for the owner of a mailbox. π@include: <none>β directive that includes the specified file as part of the configuration. If the path to the file isn't absolute,CYRUS_PATHis prepended. π«Άimproved_mboxlist_sort: 0β not used anymore. π (rip, iconic while it lasted)jmapaccess_url: <none>β the JMAP Session URL to advertise to successfully authenticated IMAP clients, if the same credentials can be used to authenticate via JMAP (see draft-ietf-extra-jmapaccess). β¨jmap_emailsearch_db_path: <none>β the absolute path to the JMAP email search cache file. If it's not specified, JMAPEmail/queryandEmail/queryChangeswill not cache email search results. πjmap_querycache_max_age: 0mβ the duration after which unused cached JMAP query results must be evicted from process memory. If non-zero, the full result of the last query (before windowing) is stored in-memory. Subsequent queries with the same expression and query state can then page through the cached result. A zero value disables query result caching.
If no unit is specified, minutes is assumed.
This feature currently only is enabled for Email/query.
jmap_preview_annot: <none>β the name of the per-message annotation, if any, used to store message previews. πjmap_imagesize_annot: <none>β the name of the per-message annotation, if any, that stores a JSON object, mapping message part numbers of MIME image types to an array of their image dimensions. The array must have at least two entries, where the first entry denotes the width and the second entry the height of the image. Any additional values are ignored.
For example, if message part 1.2 contains an image of width 300 and height 200, then the value of this annotation would be:
{ "1.2" : [ 300, 200 ] }
jmap_inlinedcids_annot: <none>β okay so this is the name of the per-message annotation, if any, that stores a JSON object mapping RFC 2392 Content-IDs referenced in HTML bodies to the respective HTML body part number. π
For example, if message part 1.2 contains HTML and references an inlined image at "cid:foo", then the value of this annotation would be:
{ "<foo>" : "1.2" }
Note that the Content-ID key must be URL-unescaped and enclosed in angular brackets, as defined in RFC 2392. π
jmap_preview_length: 64Bβ the max length of dynamically generated message previews. Previews stored injmap_preview_annottake precedence, no cap. If no unit is specified, bytes is assumed. β¨jmap_max_catenate_items: 100β the maximum number of items that can be catenated together by a JMAP Blob/upload action. Returned as themaxDataSourcesproperty value of the JMAP"urn:ietf:params:jmap:blob"capabilities object. Default value is100. π«Άjmap_max_size_upload: 1Gβ the maximum size that the JMAP API accepts for blob uploads. Returned as themaxSizeUploadproperty value of the JMAP"urn:ietf:params:jmap:core"capabilities object. For backward compatibility, if no unit is specified, kibibytes is assumed. πjmap_max_size_blob_set: 4Mβ the maximum size that the JMAP API accepts for Blob/upload. Returned as themaxSizeBlobSetproperty value of the JMAP"urn:ietf:params:jmap:blob"capabilities object. For backward compatibility, if no unit is specified, kibibytes is assumed. πΈjmap_max_calendareventnotifs: 200β the maximum count of CalendarEventNotification objects to keep per account. Any notifications exceeding this count are expunged to make room for new ones. Zero or any negative number disables this limit. πjmap_max_concurrent_upload: 5β the value to return for themaxConcurrentUploadproperty of the JMAP"urn:ietf:params:jmap:core"capabilities object. The Cyrus JMAP implementation does not enforce this rate-limit. πjmap_max_size_request: 10Mβ the maximum size that the JMAP API accepts for requests at the API endpoint. Returned as themaxSizeRequestproperty value of the JMAP"urn:ietf:params:jmap:core"capabilities object. For backward compatibility, if no unit is specified, kibibytes is assumed. π₯jmap_max_concurrent_requests: 5β the value to return for themaxConcurrentRequestsproperty of the JMAP"urn:ietf:params:jmap:core"capabilities object. The Cyrus JMAP implementation does not enforce this rate-limit. πjmap_max_calls_in_request: 50β the maximum number of calls per JMAP request object. Returned as themaxCallsInRequestproperty value of the JMAP"urn:ietf:params:jmap:core"capabilities object. β¨jmap_max_delayed_send: 512dβ the value to return for themaxDelayedSendproperty of the JMAP"urn:ietf:params:jmap:emailsubmission"capabilities object. The Cyrus JMAP implementation does not enforce this limit. For backward compatibility, if no unit is specified, seconds is assumed. π¦jmap_max_objects_in_get: 4096β the maximum number of ids that a JMAP client may request in a single"/get"type method call. The actual number of returned objects in the response may exceed this number if the JMAP object type supports unbounded"/get"calls. Returned as themaxObjectsInGetproperty value of the JMAP"urn:ietf:params:jmap:core"capabilities object. πjmap_max_objects_in_set: 4096β the maximum number of objects a JMAP client may send to create, update or destroy in a single/settype method call. Returned as themaxObjectsInSetproperty value of the JMAP"urn:ietf:params:jmap:core"capabilities object. πjmap_mail_max_size_attachments_per_email: 10Mβ the value to return for themaxSizeAttachmentsPerEmailproperty of the JMAP"urn:ietf:params:jmap:mail"capabilities object. The Cyrus JMAP implementation does not enforce this size limit. For backward compatibility, if no unit is specified, kibibytes is assumed. πjmap_nonstandard_extensions: 0β if enabled, support non-standard JMAP extensions. If not enabled, only IETF standard JMAP functionality is supported. βjmap_pushpoll: 60sβ the interval for polling for changes on an EventSource connection or when push has been ennabled on a WebSocket channel. The minimum value is 1 second. A value of0will disable push. If no unit is specified, seconds is assumed. πjmap_set_has_attachment: 1β if enabled, the$hasAttachmentflag is determined and set for new messages created with the JMAP Email/set or Email/import methods. This option should typically be enabled, but installations using Cyrus-external message annatotors to determine the$hasAttachmentflag might want to disable it. πjmap_vacation: 1β if enabled, support the JMAP vacation extension. π§jmapuploadfolder: #jmapβ the name of the folder for JMAP uploads. πjmapsubmission_deleteonsend: 1β if enabled (the default) then delete the EmailSubmission as soon as the email*has been sent. π«Άjmapsubmissionfolder: #jmapsubmissionβ the name of the folder for JMAP Submissions. πΈjmappushsubscriptionfolder: #jmappushsubscriptionβ the name of the folder for JMAP Push Subscriptions. πjmapnotificationfolder: #jmapnotificationβ the name of the folder for JMAP notifications. β¨iolog: 0β should cyrus output I/O log entries. π
ldap_authz: <none>β SASL authorization ID for the LDAP server. π₯ldap_base: <empty string>β contains the LDAP base dn for the LDAP ptloader module. πldap_bind_dn: <none>β bind DN for the connection to the LDAP server (simple bind). Do not use for anonymous simple binds. πldap_deref: neverβ specify how aliases dereferencing is handled during search. Allowed values:search,find,always,never. πldap_domain_base_dn: <empty string>β base DN to search for domain name spaces. βldap_domain_filter: (&(objectclass=domainrelatedobject)(associateddomain=%s))β filter to use searching for domains. πldap_domain_name_attribute: associateddomainβ the attribute name for domains. πldap_domain_scope: subβ search scope. Allowed values:sub,one,base. πldap_domain_result_attribute: inetdomainbasednβ result attribute. π§ldap_filter: (uid=%u)β specify a filter that searches user identifiers. The following tokens can be used in the filter string:%%=%%u= user%U= user portion of%u(%U=testwhen%u=test@domain.tld)%d= domain portion of%uif available (%d=domain.tldwhen%u=test@domain.tld), otherwise same as%R%R= domain portion of%ustarting with@(%R=@domain.tldwhen%u=test@domain.tld)%D= user dn. (use whenldap_member_method: filter)%1-9= domain tokens (%1=tld,%2=domainwhen%d=domain.tld)
ldap_filter is not used when ldap_sasl is enabled. π
ldap_group_base: <empty string>β LDAP base dn forldap_group_filter. β¨ldap_groupmember_attribute: memberβ specify a field within groups with a list of members. π«Άldap_group_filter: (cn=%u)β specify a filter that searches for group identifiers. Seeldap_filterfor more options. πΈldap_group_scope: subβ specify search scope forldap_group_filter. Allowed values:sub,one,base. πldap_id: <none>β SASL authentication ID for the LDAP server. πldap_mech: <none>β SASL mechanism for LDAP authentication. π₯ldap_user_attribute: <none>β specify LDAP attribute to use as canonical user id. πldap_member_attribute: <none>β seeldap_member_method. πldap_member_base: <empty string>β LDAP base dn forldap_member_filter. πldap_member_filter: (member=%D)β specify a filter for"ldap_member_method: filter". Seeldap_filterfor more options. βldap_member_method: attributeβ specify a group method. The"attribute"method retrieves groups from a multi-valued attribute specified inldap_member_attribute. The"filter"method uses a filter, specified byldap_member_filter, to find groups;ldap_member_attributeis a single-value attribute group name. Allowed values:attribute,filter. πldap_member_scope: subβ specify search scope forldap_member_filter. Allowed values:sub,one,base. πldap_password: <none>β password for the connection to the LDAP server (SASL and simple bind). Do not use for anonymous simple binds. πldap_realm: <none>β SASL realm for LDAP authentication. π§ldap_referrals: 0β specify whether or not the client should follow referrals. πldap_restart: 1β specify whether or not LDAP I/O operations are automatically restarted if they abort prematurely. π«Άldap_sasl: 1β use SASL for LDAP binds in the LDAP PTS module. πΈldap_sasl_authc: <none>β deprecated. Useldap_id. πldap_sasl_authz: <none>β deprecated. Useldap_authz. β¨ldap_sasl_mech: <none>β deprecated. Useldap_mech. πldap_sasl_password: <none>β deprecated. Userldap_password. π₯ldap_sasl_realm: <none>β deprecated. Useldap_realm. πldap_scope: subβ specify search scope. Allowed values:sub,one,base. πldap_servers: ldap://localhost/β deprecated. Useldap_uri. πldap_size_limit: 1β specify a number of entries for a search request to return. βldap_start_tls: 0β use transport layer security forldap://using STARTTLS. Do not useldaps://in'ldap_uri'with this option enabled. πldap_time_limit: 5sβ how long to wait for a search request to complete. For backward compatibility, if no unit is specified, seconds is assumed. πldap_timeout: 5sβ how long a search can take before timing out. For backward compatibility, if no unit is specified, seconds is assumed. πldap_ca_dir: <none>β the path to a directory stuffed full of CA (Certificate Authority) certificates. β¨ldap_ca_file: <none>β the path to a single file holding your CA (Certificate Authority) certificate(s). One file, all the certs, we love a bundle. πldap_ciphers: <none>β the list of SSL/TLS ciphers you're allowing. The string format? That's described over inciphers(1), go peek. πldap_client_cert: <none>β the file containing the client certificate. iykyk. πldap_client_key: <none>β the file containing the private client key. Keep it secret, keep it safe. π₯ldap_verify_peer: 0β require and verify the server certificate. If you set this toyes, bestie, you must also give itldap_ca_fileorldap_ca_dir. No cert, no vibe check. πldap_tls_cacert_dir: <none>β deprecated in favor ofldap_ca_dir. Old news, moving on. πldap_tls_cacert_file: <none>β deprecated in favor ofldap_ca_file. Same energy. πldap_tls_cert: <none>β deprecated in favor ofldap_client_cert. πldap_tls_key: <none>β deprecated in favor ofldap_client_key. πldap_tls_check_peer: 0β deprecated in favor ofldap_verify_peer. πldap_tls_ciphers: <none>β deprecated in favor ofldap_ciphers. πldap_uri: <none>β holds a list of the URLs of all the LDAP servers, for when you're running the LDAP PTS module. πldap_version: 3β pick your LDAP protocol version. Heads up though: ifldap_start_tlsand/orldap_use_saslare enabled,ldap_versiongets automatically set to3whether you like it or not. β¨literalminus: 0β if enabled, CAPABILITIES replies withLITERAL-instead ofLITERAL+(RFC 7888). And ngl, it doesn't actually size-restrict uploads though. πlmtp_downcase_rcpt: 1β if enabled,lmtpdconverts the recipient addresses to lowercase (up to a+character, if there is one). πlmtp_exclude_specialuse: \Snoozedβ don't allow delivery to folders that have the given special-use attributes. π«
Quick note bestie: "snoozing" of emails can currently only be done via the JMAP protocol, so delivery directly to the Snoozed mailbox is prohibited by default β because it will not get moved back into INBOX automatically. It's giving one-way trip. π
lmtp_fuzzy_mailbox_match: 0β if enabled, and the mailbox named in the detail part of the recipient (that's everything after the+) doesn't exist,lmtpdwill try to find the closest match to the specified mailbox name β ignoring case, ignoring whitespace, falling back to the parent. Close enough counts. π¦lmtp_over_quota_perm_failure: 0β if enabled,lmtpdreturns a permanent failure code when a user's mailbox is over quota. By default the failure is temporary, which makes the MTA queue the message and retry later. βlmtp_preparse: 0β if enabled,lmtpdwill map in the email and parse the xapian data for jmapsearch. The advantage? The parsing is done without holding any locks. The disadvantage? The parsing is done even if it winds up not being needed. Trade-offs, bestie. πlmtp_strict_quota: 0β if enabled,lmtpdreturns a failure code when the incoming message will cause the user's mailbox to exceed its quota. By default, the failure won't occur until the mailbox is already over quota. π«Άlmtp_strict_rfc2821: 1β by default,lmtpdis strict (per RFC 2821) about which envelope addresses are allowed. If you set this option to false, 8bit characters in the local-part of envelope addresses get changed toXinstead. That's genuinely useful for avoiding backscatter with certain MTAs like Postfix or Exim, which accept such messages. π₯lmtpsocket: {configdirectory}/socket/lmtpβ the Unix domain socket thatlmtpdlistens on, used bydeliver(8). This should match the path specified incyrus.conf(5). Matchy matchy. πlmtptxn_timeout: 5mβ timeout used during an lmtp transaction to a remote backend (like, in a murder environment). Can be used to prevent hung lmtpds on proxy hosts when a backend server becomes unresponsive during an lmtp transaction. Change it to zero for infinite. βΎοΈ
For backward compatibility, if no unit is specified, seconds is assumed.
lock_debugtime: <none>β a floating point number of seconds. If set, it times how long we wait for any lock, and syslogs the filename and time if it's longer than this value. The default of NULL means not to time locks. This is implemented forfcntl(2)locks and has no effect onflock(2)locks. β±οΈloginrealms: <empty string>β the list of remote realms whose users may authenticate using cross-realm authentication identifiers. Separate each realm name by a space. (A cross-realm identity is considered any identity returned by SASL with an"@"in it.) πloginuseacl: 0β if enabled, any authentication identity which has a rights on a user's INBOX may log in as that user. πlogtimestamps: 0β include notations in the protocol telemetry logs indicating the number of seconds since the last command or response. π°οΈmailbox_default_options: 0β the default"options"field for the mailbox on create. You'll want to know what you're doing before setting this, but it can apply some default annotations like duplicate suppression. π§mailbox_initial_flags: <none>β a space-separated list of permanent flags which will be pre-set in every newly created mailbox. If you know you will require particular flag names, this avoids a possible race condition against a client that fills the entire 128 available slots. Default is NULL, which is no flags. Example:$Label1 $Label2 $Label3 NotSpam Spamπ·οΈmailbox_legacy_dirs: 0β if enabled, new mailboxes without parents will be created with legacy paths. sub mailboxes of users will still inherit the parent legacy setting. πΈmailbox_maxmessages_addressbook: 0β limit the number of messages that may exist in a single mailbox of"addressbook"type. Default (0) means no limit. This limit applies after quotas are checked, so if you have both quota limits and this set, then you will be denied if you are either over quota or over this per-mailbox count. πmailbox_maxmessages_calendar: 0β limit the number of messages that may exist in a single mailbox of"calendar"type. Default (0) means no limit. This limit applies after quotas are checked, so if you have both quota limits and this set, then you will be denied if you are either over quota or over this per-mailbox count. πmailbox_maxmessages_email: 0β limit the number of messages that may exist in a single mailbox of"email"(normal) type. Default (0) means no limit. This limit applies after quotas are checked, so if you have both quota limits and this set, then you will be denied if you are either over quota or over this per-mailbox count. π§mailnotifier: <none>β theNotifyd(8)method to use for"MAIL"notifications. If it's not set,"MAIL"notifications are disabled. πmaster_bind_errors_fatal: 0β if enabled, failure to bind a port during startup is treated as a fatal error, causing master to shut down immediately. The default is to keep running, with the affected service disabled until the next SIGHUP causes it to retry. π
Note that this only applies during startup. New services that fail to come up in response to a reconfig+SIGHUP will just be logged and disabled like the default behaviour, without causing master to exit.
master_pid_file: {configdirectory}/master.pidβ the path to a file thatmaster(8)will write its PID to when running as a daemon. πmaster_ready_file: {configdirectory}/master.readyβ the path to a file thatmaster(8)will update to indicate that it is ready to accept client connections. This file will be created if it does not already exist, or truncated if it does. π’maxheaderlines: 1000β maximum number of lines of header that will be processed into cache records. Default1000. If set to zero, it is unlimited. If a message hits the limit, an error will be logged and the rest of the lines in the header will be skipped. This is to avoid malformed messages causing giant cache records. πmaxlogins_per_host: 0β maximum number of logged in sessions allowed per service per host. Zero means no limit. πͺmaxlogins_per_user: 0β maximum number of logged in sessions allowed per service per user. Zero means no limit. πͺmaxargssize: 0β maximum total size of arguments to an IMAP command that will be accepted by Cyrus. Commands with arguments that exceed this limit will be rejected. π«
If set to 0 (the default), a large internally-defined limit will be applied.
If no unit is specified, bytes is assumed.
maxmessagesize: 0β maximum size of messages that will be accepted by Cyrus. This affects LMTP deliveries, IMAP appends, DAV uploads, etc. Messages larger than this will be rejected. π¦
If set to 0 (the default), a large internally-defined limit will be applied.
If no unit is specified, bytes is assumed.
maxliteral: 128Kβ maximum size of a single literal allowed by the IMAP parser. π€
If set to 0, a large internally-defined limit will be applied.
If no unit is specified, bytes is assumed.
Literals used for message [part] data in APPEND are only limited by the 'maxmessagesize' option.
If the 'literalminus' option is enabled, non-synchonizing literals will be limited to the lesser of 4K and either 'maxliteral' or 'maxmessagesize', depending on the use-case.
maxquoted: 128Kβ maximum size of a single quoted string allowed by the IMAP parser. π¬
If set to 0, a large internally-defined limit will be applied.
If no unit is specified, bytes is assumed.
maxword: 128Kβ maximum size of a single word allowed by the IMAP parser. π
If set to 0, a large internally-defined limit will be applied.
If no unit is specified, bytes is assumed.
mboxkey_db: twoskipβ the cyrusdb backend to use for mailbox keys. ποΈ
Allowed values: skiplist, twoskip, zeroskip
mboxlist_db: twoskipβ the cyrusdb backend to use for the mailbox list. ποΈ
Allowed values: flat, skiplist, sql, twoskip, zeroskip
mboxlist_db_path β <none>
Absolute path to the mailboxes db file, bestie. Like, the whole path. If you don't specify it, it just defaults to configdirectory/mailboxes.db and honestly that's fine π
mboxname_lockpath β <none>
Path to the mailbox name lock files. The default is $conf/lock if you don't say anything π
metapartition_files β <empty string>
A space-separated list of metadata files that get stored on a metapartition instead of in the mailbox directory on a spool partition. Allowed values are literally: header, index, cache, expunge, squat, annotations, lock, dav, archivecache β¨
metapartition-name β <none>
The pathname of the metadata partition name, matching up with the spool partition partition-name. So for any mailbox chilling in a directory on partition-name, the metadata files listed in metapartition_files get stored in a corresponding directory on metapartition-name. Not every partition-name option needs a matching metapartition-name option tho β so you can pick and choose which spool partitions get their own separate metadata partitions π¦
mupdate_authname β <none>
The SASL username (Authentication Name) to use when authenticating to the mupdate server, if that's even needed π
mupdate_config β standard
The configuration of the mupdate servers in the Cyrus Murder, and there's three flavors:
standardβ there are discreet frontend (proxy) and backend serversunifiedβ a server can be both a frontend and a backend, main character energy frreplicatedβ multiple backend servers all share the same mailspool, but each one has its own "replicated" copy ofmailboxes.db
Allowed values: standard, unified, replicated π
munge8bit β 1
If this is enabled, lmtpd munges messages that have 8-bit characters in the headers. Those 8-bit characters get changed to X'. But heads up β if reject8bit is enabled, setting munge8bit does absolutely nothing π (A proper solution to non-ASCII characters in headers is offered by RFC 2047 and its predecessors, just saying.)
mupdate_connections_max β 128
The max number of connections a mupdate process will allow. This is tied to the number of file descriptors in the mupdate process. Go over this number and connections get immediately issued a BYE response. Rude but efficient π
mupdate_password β <none>
The SASL password (if needed) to use when authenticating to the mupdate server.
mupdate_port β 3905
The port of the mupdate server for the Cyrus Murder.
mupdate_realm β <none>
The SASL realm (if needed) to use when authenticating to the mupdate server.
mupdate_retry_delay β 20
The base time to wait between connection retries to the mupdate server. Patience is a virtue or whatever β³
mupdate_server β <none>
The mupdate server for the Cyrus Murder.
mupdate_username β <empty string>
The SASL username (Authorization Name) to use when authenticating to the mupdate server.
mupdate_workers_max β 50
The maximum number of mupdate worker threads, overall, periodt π
mupdate_workers_maxspare β 10
The maximum number of idle mupdate worker threads.
mupdate_workers_minspare β 2
The minimum number of idle mupdate worker threads.
mupdate_workers_start β 5
The number of mupdate worker threads to start. Like, at the beginning. The starter pack πΈ
netscapeurl β <none>
If enabled at compile time, this specifies a URL to reply when Netscape asks the server where the mail administration HTTP server is. Admins should set this to a local resource, no cap.
newsaddheaders β to
Space-separated list of headers to be added to incoming usenet articles. Added To: headers will contain email delivery addresses corresponding to each newsgroup in the Newsgroups: header. Added Reply-To: headers will contain email delivery addresses corresponding to each newsgroup in the Followup-To: or Newsgroups: header. And if the specified header(s) already exist in an article, the email delivery addresses get appended to the original header body(s) β no overwriting, we're just adding π
This option applies if and only if the newspostuser option is set. Allowed values: to, replyto
newsgroups β *
A wildmat pattern specifying which mailbox hierarchies should be treated as newsgroups. Only mailboxes matching the wildmat will accept and/or serve articles via NNTP. If you don't set it, a default wildmat of "*" (ALL shared mailboxes) gets used. And if the newsprefix option is also set, that default wildmat gets translated to "<newsprefix>.*" π¦
newsmaster β news
The userid used for checking access controls when executing Usenet control messages. So like, to let articles be automatically deleted by cancel messages, give the "news" user the 'd' right on the desired mailboxes. To let newsgroups be automatically created, deleted and renamed by the corresponding control messages, give the "news" user the 'c' right on the desired mailbox hierarchies. Give them the keys to the kingdom π
newspeer β <none>
A list of whitespace-separated news server specifications to which articles should be fed. Each server specification is a string of the form:
[user[:pass]@]host[:port][/wildmat]
where 'host' is the fully qualified hostname of the server, 'port' is the port the server is listening on, 'user' and 'pass' are the authentication credentials, and 'wildmat' is a pattern specifying which groups should be fed. If no 'port' is specified, port 119 is used. If no 'wildmat' is specified, all groups are fed. And if 'user' is specified (even if it's empty), then the NNTP POST command is used to feed the article to the server β otherwise the IHAVE command is used.
A '@' may be used in place of '!' in the wildmat to prevent feeding articles cross-posted to the given group. Otherwise, cross-posted articles are fed if any part of the wildmat matches. For example, the string "peer.example.com:*,!control.*,@local.*" would feed all groups except control messages and local groups to peer.example.com. And in the case of cross-posting to local groups, those articles would not be fed π
βοΈ
newspostuser β <none>
Userid used to deliver usenet articles to newsgroup folders (usually via lmtp2nntp). For example, if set to "post", email sent to "post+comp.mail.imap" would be delivered to the "comp.mail.imap" folder. Cute, right? π
When set, the Cyrus NNTP server will add the header(s) specified in the newsaddheaders option to each incoming usenet article. The added header(s) will contain email delivery addresses corresponding to each relevant newsgroup. If not set, no headers are added to usenet articles.
newsprefix β <none>
Prefix to be prepended to newsgroup names to make the corresponding IMAP mailbox names.
newsrc_db_path β <none>
The absolute path to the newsrc db file. If not specified, it'll be configdirectory/fetchnews.db π
nntptimeout β 3m
Sets the length of the NNTP server's inactivity autologout timer. The minimum value is 3 minutes, which is also the default. So like, it times out fast and it's not sorry.
For backward compatibility, if no unit is specified, minutes is assumed. iykyk β°
notesmailbox β <none>
The top level mailbox in each user's account which is used to store Apple-style Notes. Default is blank (disabled). π
notifysocket β {configdirectory}/socket/notify
Unix domain socket that the mail notification daemon listens on.
notify_external β <none>
Path to the external program that notifyd(8) will call to send mail notifications.
The external program will be called with the following command line options:
-c class
-p priority
-u user
-m mailbox
And the notification message will be available on stdin π¬
partition-name β <none>
The pathname of the partition name. At least one partition pathname MUST be specified. If the defaultpartition option is used, then its pathname MUST be specified too. For example, if the value of the defaultpartion option is part1, then the partition-part1 field is required. No skips, bestie π¨
partition_select_mode β freespace-most
Partition selection mode. Here's the whole menu:
randomβ (pseudo-)random selection π²freespace-mostβ partition with the most free space (KiB)freespace-percent-mostβ partition with the most free space (%)freespace-percent-weightedβ each partition is weighted according to its free space (%); the more free space the partition has, the more chances it has to be selectedfreespace-percent-weighted-deltaβ each partition is weighted according to its difference of free space (%) compared to the most used partition; the more the partition is lagging behind the most used partition, the more chances it has to be selected- Note that actually even the most used partition has a few chances to be selected, and those chances increase when other partitions get closer π
Allowed values: random, freespace-most, freespace-percent-most, freespace-percent-weighted, freespace-percent-weighted-delta
partition_select_exclude β <none>
List of partitions to exclude from selection mode. Not invited to the party π
partition_select_usage_reinit β 0
For a given session, number of operations (e.g. partition selection) for which partitions usage data are cached.
partition_select_soft_usage_limit β 0
Limit of partition usage (%): if a partition is over that limit, it is automatically excluded from selection mode.
If all partitions are over that limit, this feature is not used anymore. Everyone's over the limit, so we're just ignoring the limit, okay? π
plaintextloginpause β <none>
Time to pause after a successful plaintext login. For systems that support strong authentication, this permits users to perceive a cost of using plaintext passwords. Petty? Yes. Effective? Also yes. (This does not affect the use of PLAIN in SASL authentications.)
For backward compatibility, if no unit is specified, seconds is assumed.
plaintextloginalert β <none>
Message to send to the client after a successful plaintext login. Say hi, be nice π
popexpiretime: -1β okay so this is the duration that gets advertised as the minimum time a message might sit on the POP server before it's deleted (it's sent via theCAPAcommand, which is defined in the POP3 Extension Mechanism, and some clients actually support it). The granularity here is whole days, and partial days get truncated β so like"45m"is effectively"0d". The default is"NEVER", which you can specify with a negative number. π«ποΈ
Now listen bestie: the Cyrus POP3 server never deletes mail, no matter what you set this to. But if your site has a less liberal policy, you gotta change this parameter accordingly. Also, for backward compatibility, if you don't specify a unit, days is assumed. π
popminpoll: <none>β this sets the minimum amount of time the server forces users to wait between successive POP logins. β³
For backward compatibility, if no unit is specified, minutes is assumed.
popsubfolders: 0β allow access to subfolders ofINBOXvia POP3 by using theuserid+subfoldersyntax as the authentication/authorization id. πpoppollpadding: 1β this creates a softer minimum poll restriction. It allowspoppollpaddingconnections before theminpollrestriction is triggered. Additionally, one padding entry is recovered everypopminpollminutes. This allows for the occasional polling rate faster thanpopminpoll(i.e., for clients that require a send/receive to send mail) but still enforces the rate long-term. Default is1(disabled). ποΈ
The easiest way to think of it is a queue of past connections, with one slot being filled for every connection, and one slot being cleared every popminpoll minutes. When the queue is full, the user will not be able to check mail again until a slot is cleared. If the user waits a sufficient amount of time, they will get back many or all of the slots. ποΈ
poptimeout: 10mβ set the length of the POP server's inactivity autologout timer. The minimum value is10minutes, the default. β°
For backward compatibility, if no unit is specified, minutes is assumed.
popuseacl: 0β enforce IMAP ACLs in the pop server. Due to the nature of the POP3 protocol, the only rights which are used by the pop server are'r','t', and's'for the owner of the mailbox. The'r'right allows the user to open the mailbox and list/retrieve messages. The't'right allows the user to delete messages. The's'right allows messages retrieved by the user to have the\Seenflag set (only ifpopuseimapflagsis also enabled). πpopuseimapflags: 0β if enabled, the pop server will set and obey IMAP flags. Messages having the\Deletedflag are ignored as if they do not exist. Messages that are retrieved by the client will have the\Seenflag set. All messages will have the\Recentflag unset. π·οΈpostmaster: postmasterβ username that is used as the'From'address in rejection MDNs produced by sieve. π§postuser: <empty string>β userid used to deliver messages to shared folders. For example, if set to"bb", email sent to"bb+shared.blah"would be delivered to the"shared.blah"folder. By default, an email address of"+shared.blah"would be used. π¬proc_path: <none>β path to proc directory. Default isNULLβ must be an absolute path if specified. If not specified, the path$configdirectory/proc/will be used. πprometheus_enabled: 0β whether tracking of metrics for Prometheus is enabled. πprometheus_need_auth: adminβ authentication level required to fetch Prometheus metrics. π
Allowed values: none, user, admin
prometheus_update_freq: 10sβ deprecated in favour ofprometheus_service_update_freq,prometheus_master_update_freq, andprometheus_usage_update_freq. β οΈprometheus_service_update_freq: 10sβ frequency at whichpromstatsdshould re-collate its service statistics report. The minimum value is1second. π
If no unit is specified, seconds is assumed.
prometheus_master_update_freq: <none>β frequency at whichmastershould re-collate its statistics report. If not set,prometheus_service_update_freqis used. π
If no unit is specified, seconds is assumed.
prometheus_usage_update_freq: <none>β frequency at whichpromstatsdshould re-collate its usage statistics report. Note that this report is relatively expensive to produce. If not set, usage statistics are not reported. πΈ
Best to make this a multiple of prometheus_service_update_freq.
If no unit is specified, seconds is assumed.
prometheus_stats_dir: <none>β directory to use for gathering prometheus statistics. If specified, must be an absolute path. If not specified, the default path$configdirectory/stats/will be used. It may be advantageous to locate this directory on ephemeral storage. ποΈproxy_authname: proxyβ the authentication name to use when authenticating to a backend server in the Cyrus Murder. π΅οΈproxy_compress: 0β try to enable protocol-specific compression when performing a client connection to a backend server in the Cyrus Murder. ποΈ
Note that this should only be necessary over slow network connections. Also note that currently only IMAP and MUPDATE support compression.
proxy_password: <none>β the default password to use when authenticating to a backend server in the Cyrus Murder. May be overridden on a host-specific basis using thehostname_passwordoption. πproxy_realm: <none>β the authentication realm to use when authenticating to a backend server in the Cyrus Murder. πproxyd_allow_status_referral: 0β set to true to allowproxydto issue referrals to clients that support it when answering theSTATUScommand. This is disabled by default since some clients issue manySTATUScommands in a row, and do not cache the connections that these referrals would cause, thus resulting in a higher authentication load on the respective backend server. π¨proxyd_disable_mailbox_referrals: 0β set to true to disable the use of mailbox-referrals on the proxy servers. π«proxyservers: <none>β a list of users and groups that are allowed to proxy for other users, separated by spaces. Any user listed in this will be allowed to login for any other user: use with caution. In a standard murder this option should ONLY be set on backends. DO NOT SET on frontends or things won't work properly. β οΈπpts_module: afskrbβ the PTS module to use. π§©
Allowed values: afskrb, ldap, http
ptloader_sock: <none>β Unix domain socket thatptloaderlistens on. (defaults toconfigdirectory/ptclient/ptsock). πptscache_db: twoskipβ the cyrusdb backend to use for the pts cache. ποΈ
Allowed values: skiplist, twoskip, zeroskip
ptscache_db_path: <none>β the absolute path to the ptscache db file. If not specified, will beconfigdirectory/ptscache.dbπptscache_timeout: 3hβ the timeout for the PTS cache database when using theauth_krb_ptsauthorization method (default:3hours). β³
For backward compatibility, if no unit is specified, seconds is assumed.
ptskrb5_convert524: 1β when using the AFSKRB ptloader module with Kerberos 5 canonicalization, do the final 524 conversion to get an AFS style name (using'.'instead of'/', and using short names. πptskrb5_strip_default_realm: 1β when using the AFSKRB ptloader module with Kerberos 5 canonicalization, strip the default realm from the userid (this does not affect the stripping of realms specified by theafspts_localrealmsoption). βοΈqosmarking: cs0β this specifies the Class Selector or Differentiated Services Code Point designation on IP headers (in the ToS field). Allowed values:cs0,cs1,cs2,cs3,cs4,cs5,cs6,cs7,af11,af12,af13,af21,af22,af23,af31,af32,af33,af41,af42,af43,efπquota_db: quotalegacyβ the cyrusdb backend to use for quotas. π
Allowed values: flat, skiplist, sql, quotalegacy, twoskip, zeroskip
quota_db_path: <none>β the absolute path for the quota database (if you choose a single-file quota DB type β or the base path if you choosequotalegacy). If not specified will beconfigdirectory/quotas.dborconfigdirectory/quota/πquota_use_conversations: 0β if conversations it enabled and quotaroot is a user folder, use the conversations quota counts, which count multiple copies of exactly the same message (by GUID) as only one. π¬quotawarn: 90β deprecated in favour ofquotawarnpercent. β οΈquotawarnpercent: 90β the percent of quota utilization over which the server generates warnings. β οΈquotawarnkb: <none>β deprecated in favour ofquotawarnsize. β οΈquotawarnsize: 0β the maximum amount of free space at which to give a quota warning (if this value is0, or if the quota is smaller than this amount, then warnings are always given). π
Note that quota has kibibyte granularity. Values specified here will be truncated to the nearest whole kibibyte.
For backward compatibility, if no unit is specified, kibibytes is assumed.
quotawarnmsg: 0β the maximum amount of messages at which to give a quota warning (if this value is0, or if the quota is smaller than this amount, then warnings are always given). π¬readonly: 0β if enabled, all IMAP, POP and JMAP connections are read-only, no writes allowed. π«βοΈreplicaonly: 0β if enabled, marks the server as only being a replica. This will stopcalalarmdfrom doing anything, and also deny any non-silent writes (nothing is allowed to increase modseq or uidvalidity). πreject8bit: 0β if enabled,lmtpdrejects messages with 8-bit characters in the headers. π«π€restore_authname: <none>β the authentication used by the restore tool when authenticating to an IMAP/sync server. π
restore_password: <none>
The password your restore tool uses when it's authenticating to an IMAP/sync server. Just the password, bestie, nothing else. π
restore_realm: <none>
The authentication realm the restore tool uses when it's authenticating to an IMAP/sync server. It's giving "who are you, really" energy. π
reverseacls: 0
When the server starts up, ctl_cyrusdb -r peeks at this value, and depending on what it says it'll either add or remove reverse ACL pointers from mailboxes.db. Yes, this one option literally changes what happens to your database at startup, so don't just vibes-based-edit it. π
reverseuniqueids: 1
Deprecated. No longer used. It's a ghost, bestie. Ignore it. π
rfc2046_strict: 0
Flip this on and imapd gets strict (like, per RFC 2046) when it's matching MIME boundary strings. Which means boundaries that contain other boundaries as substrings get treated as identical. Sounds tidy, right? Nope β enabling it will break some messages created by Eudora 5.1 (and earlier). So the recommendation is: leave it disabled unless you have a genuinely good reason to do otherwise. π«Ά
rfc2047_utf8: 0
If enabled, imapd will parse any non-encoded character sequence in MIME header values as UTF8. Super useful for installations that either advertise the UTF8SMTP (RFC 5335) extension or receive mails with improperly escaped UTF-8 byte sequences. Same deal as above though β recommended that this option is left disabled unless there is good reason to do otherwise. β¨
rfc3028_strict: 1
If enabled, Sieve is strict (per RFC 3028) about which headers are allowed in address and envelope tests. Meaning: only those headers which are defined to contain addresses are allowed in address tests, and only "to" and "from" are allowed in envelope tests. When disabled, ANY grammatically correct header is allowed. Periodt. π
rss_feedlist_template: <none>
A file containing HTML that gets used as a template for displaying the list of available RSS feeds. One single instance of the variable %RSS_FEEDLIST% should appear in the file, and that's where the nested unordered list of feeds gets swapped in. The toplevel unordered list gets tagged with an id of "feed" (<ul id='feed'>) which you can use with stylesheet(s) in your template. And the dynamically created list of feeds based on the HTML template will be accessible at the "/rss" URL on the server. Iconic. π¦
rss_feeds: *
A wildmat pattern specifying which mailbox hierarchies get treated as RSS feeds. Only mailboxes matching the wildmat will have their messages available via RSS. If you don't set it, a default wildmat of "*" (that's ALL mailboxes) gets used. π
rss_maxage: <none>
Maximum age of items to display in an RSS channel. If non-zero, httpd will only display items received within this time period. If set to 0, all available items will be displayed (that's the default).
For backward compatibility, if no unit is specified, days is assumed. β³
rss_maxitems: 0
Maximum number of items to display in an RSS channel. If non-zero, httpd will display no more than the rss_maxitems most recent items. If set to 0, all available items will be displayed (the default). πΈ
rss_maxsynopsis: 0
Maximum RSS item synopsis length. If non-zero, httpd will display no more than the first rss_maxsynopsis characters of an item's synopsis. If set to 0, the entire synopsis will be displayed (the default). Short and sweet or the whole novel, your call. π
rss_realm: <none>
The realm to present for HTTP authentication of RSS feeds. If not set (which is the default), the value of the "servername" option will be used instead. π
sasl_auto_transition: 0
If enabled, the SASL library will automatically create authentication secrets when given a plaintext password. See the SASL documentation for the deets β that's where the lore lives. π
sasl_maximum_layer: 256
Maximum SSF (security strength factor) that the server will allow a client to negotiate. The ceiling, basically. ποΈ
sasl_minimum_layer: 0
The minimum SSF that the server will allow a client to negotiate. A value of 1 requires integrity protection; any higher value requires some amount of encryption. So like, the floor. Don't go below the floor. π₯
sasl_option: 0
Any SASL option can be set by preceding it with sasl_. And heads up β this file overrides the SASL configuration file. So what you write here wins. π
sasl_pwcheck_method: <none>
The mechanism used by the server to verify plaintext passwords. Possible values include "auxprop", "saslauthd", and "pwcheck". Pick your fighter. β
search_batchsize: 20
The number of messages to be indexed in one batch (default 20). Note that long batches may delay user commands or mail delivery β so don't go feral with this one, bestie. π
search_attachment_extractor_url: <none>
A HTTP or HTTPS URL to extract search text from rich text attachments and other media during search indexing. The server at this URL must implement the following protocol, and I'm quoting it exactly because protocol is protocol:
- For each attachment of an email, Cyrus sends a GET request to the URL
<extractor-url>/<cyrus-id>, where<extractor-url>is the configured URL and<cyrus-id>is a Cyrus-chosen path segment that uniquely identifies this attachment. - If the extractor already has a cached plain text extract of the attachment identified by
<cyrus-id>then it may return HTTP status code200(OK) and the plain text extract with a Content-Type"text/plain"header. Otherwise it must return HTTP status code404(Not Found). - If Cyrus receives the HTTP status code
404(Not Found), then it sends a PUT request to the same URL as previously. The PUT request body contains the decoded, binary body of the attachment. The Content-Type request header has the same value as declared in the MIME part headers, including any type parameters. - The extractor must return the plain text extract with either HTTP status
200(OK) or201(Created) and a Content-Type"text/plain"header. If no text can be extracted, then the extractor may return any return code in the range4xx, or200and an empty response body.
Any other HTTP status code is treated as an error. For performance reasons, the Cyrus indexer attempts to keep-alive the TCP connection to the extractor. Xapian only. π§
search_attachment_extractor_request_timeout: 5m
Defines the duration after which to cancel non-responding requests to the search attachment extractor service.
If no unit is specified, seconds is assumed. β±οΈ
search_attachment_extractor_idle_timeout: 5m
Defines the duration after which to close unused connections to the search attachment extractor service. If the idle timeout is less than search_attachment_extractor_request_timeout, then it is ignored and request timeout used instead.
If no unit is specified, seconds is assumed. π€
search_index_language: 0
If enabled, then messages bodies are stemmed by detected language in addition to the default English stemmer. Xapian only. Multilingual slay. π
search_index_parts: 0
Deprecated. No longer used. Another ghost. π
search_index_skip_domains: <none>
A space separated list of domains β if set, any users in the listed domains will be skipped when indexing. Not your problem, not your index. π
search_index_skip_users: <none>
A space separated list of usernames β if set, any users in the list will be skipped when indexing. Same energy, different list. π
search_query_language: 0
Deprecated. No longer used. Bye. π
search_normalisation_max: 1000
A resource bound for the combinatorial explosion of search expression tree complexity caused by normalising expressions with many OR nodes. Those can use more CPU time to optimise than they save IO time in scanning folders. So it's a vibe check on your OR spam. π₯
search_engine: none
The indexing engine used to speed up searching.
Allowed values: none, squat, xapian π
search_fuzzy_always: 0
Whether to enable RFC 6203 FUZZY search for all IMAP SEARCH. If turned on, search attributes will be searched using FUZZY search by default. If turned off, clients have to explicitly use the FUZZY search key to enable fuzzy search for regular SEARCH commands. π¦
search_index_headers: 1
Whether to index headers other than From, To, Cc, Bcc, and Subject. Experiment shows that some headers such as Received and DKIM-Signature can contribute up to 2/3rds of the index size but almost nothing to the utility of searching. Note that if header indexing is disabled, headers can still be searched, the searches will just be slower. πΈ
search_indexed_db: twoskip
The cyrusdb backend to use for the search latest indexed uid state. Xapian only.
Allowed values: flat, skiplist, twoskip, zeroskip π
search_maxtime: <none>
The maximum number of seconds to run a search for before aborting. Default of no value means search "forever" until other timeouts. Forever search era. βΎοΈ
search_maxsize: 4M
The maximum size to index for each message part. Message contents that occur after this byte offset will not be indexed nor used to generate search snippets. Xapian-only.
For backward compatibility, if no unit is specified, kibibytes is assumed. π
search_queryscan: 5000
The minimum number of records require to do a direct scan of all G keys * rather than indexed lookups. A value of 0 means always do indexed lookups. (Yes, the original says "require" β I'm not fixing it, I'm just reporting the tea. π΅)
search_skipdiacrit: 1
When searching, should diacriticals be stripped from the search terms. The default is "true", so a search for "hav" will match "HΓ₯vard". This is not RFC 5051 compliant, but is backwards compatible, and may be preferred by some sites. β
search_skiphtml: 0
If enabled, HTML parts of messages are skipped, i.e. not indexed and not searchable. Otherwise, they're indexed. π
search_whitespace: merge
When searching, how whitespace should be handled. The options are:
"skip"(default in 2.3 and earlier series) β where a search for"equi"would match"the quick brown fox"."merge"β the default, where"he qu"would match"the quick brownfox"."keep"β where whitespace must match exactly.
The default of "merge" is recommended for most cases β it's a good compromise which keeps words separate.
Allowed values: skip, merge, keep β¨
search_snippet_length: 255β the max byte length of a snippet that theXSNIPPETScommand spits out. Only the Xapian search backend supports this, and bestie, it will try to always fill allsearch_snippet_lengthbytes of that snippet. Overachiever energy fr. β¨search_stopword_path: <none>β the absolute base path to the search stopword lists. Leave it unset and literally no stopwords get taken into account during search indexing, which is giving "no filter" but for search. Currently the only supported and default stop word file isenglish.txt.searchpartition-name: <none>β the pathname where you store the Xapian search indexes of searchtier for mailboxes of partition name. You MUST configure this for thedefaultsearchtierand for any additional search tier (peepsquatterfor the deets).
Example, okay, because this one's a lot: if defaultpartition is defined as part1 and defaultsearchtier as tier1, then your config must contain an entry tier1searchpartition-part1 that defines the path where to store this tier1's search index for the part1 partition.
This option MUST be specified for Xapian search. No cap. π«Ά
seenstate_db: twoskipβ the cyrusdb backend to use for the seen state.
Allowed values: flat, skiplist, twoskip, zeroskip
sendmail: /usr/lib/sendmailβ the pathname of the sendmail executable. Sieve invokessendmailfor sending rejections, redirects and vacation responses. πsendmail_auth_id: CYRUS_SENDMAIL_AUTH_IDβ the name of an environment variable to set when invokingsendmail. That environment variable's value will contain the user id of the currently authenticated user. If nobody's authenticated, the env var just... doesn't get set. πserverlist: <none>β a whitespace separated list of backend server names. Used for finding the server with the most available free space for proxyingCREATE. Basically it's your server roster. πserverlist_select_mode: freespace-mostβ the server selection mode, i.e. how we pick which backend gets the job.randomβ (pseudo-)random selectionfreespace-mostβ backend with the most (total) free space (KiB)freespace-percent-mostβ backend whose partition has the most free space (%)freespace-percent-weightedβ same as for partition selection, comparing the free space (%) of the least used partition of each backendfreespace-percent-weighted-deltaβ same as for partition selection, comparing the free space (%) of the least used partition of each backend.
Allowed values: random, freespace-most, freespace-percent-most, freespace-percent-weighted, freespace-percent-weighted-delta
serverlist_select_usage_reinit: 0β for a given session, the number of operations (e.g. backend selection) for which backend usage data are cached. β¨serverlist_select_soft_usage_limit: 0β a limit of backend usage (%). If a backend is over that limit, it's automatically excluded from selection mode. And if all backends are over that limit? Then this feature just isn't used anymore. Everybody's over the limit, so we pretend the limit doesn't exist. πservername: <none>β the hostname visible in the greeting messages of the POP, IMAP and LMTP daemons. Unset it and whatevergethostname(2)returns gets used instead. This is also the value murder clusters use to identify the host name. It should be resolvable by DNS to the correct host, and unique within an active cluster. And if you're using low level replication (likedrbd) then it should be the same on each copy and the DNS name should also be moved to the new master on failover. Cluster girlies, write this one down.serverinfo: onβ the server information to display in the greeting and capability responses. Info shows up like this:"off"= no server information in the greeting or capabilities"min"= servername in the greeting; no server information in the capabilities"on"= servername and product version in the greeting; product version in the capabilities
Allowed values: off, min, on
sharedprefix: Shared Foldersβ if you're using the alternate IMAP namespace, this is the prefix for the shared namespace. The hierarchy delimiter gets automatically appended. No manual delimiter-ing, we love a self-sufficient option. πsieve_allowreferrals: 1β if enabled,timsievedwill issue referrals to clients when the user's scripts live on a remote server (in a Murder). Otherwise,timsievedwill proxy traffic to the remote server. Pick your fighter. π₯sieve_duplicate_max_expiration: 90dβ maximum expiration time for duplicate message tracking records.
For backward compatibility, if no unit is specified, seconds is assumed.
sieve_extensions: fileinto reject vacation vacation-seconds notify include envelope environment body relational regex subaddress copy date index imap4flags mailbox mboxmetadata servermetadata variables editheader extlists duplicate ihave fcc special-use redirect-dsn redirect-deliverby mailboxid vnd.cyrus.log vnd.cyrus.jmapquery processcalendar snooze vnd.cyrus.implicit_keep_targetβ a space-separated list of Sieve extensions allowed to be used in sieve scripts, enforced at submission bytimsieved(8). Any previously installed script will be unaffected by this option and will continue to execute regardless of the extensions used. This option has no effect on options that are disabled at compile time (e.g.,"regex"). π
Allowed values: fileinto, reject, vacation, vacation-seconds, notify, include, envelope, environment, body, relational, regex, subaddress, copy, date, index, imap4flags=imapflags, mailbox, mboxmetadata, servermetadata, variables, editheader, extlists, duplicate, ihave, fcc, special-use, redirect-dsn, redirect-deliverby, mailboxid, vnd.cyrus.log=x-cyrus-log, vnd.cyrus.jmapquery=x-cyrus-jmapquery, processcalendar=vnd.cyrus.imip, snooze=vnd.cyrus.snooze=x-cyrus-snooze, vnd.cyrus.implicit_keep_target
sieve_folder: #sieveβ the name of the folder for storing Sieve scripts. πsieve_maxscriptsize: 32Kβ maximum size any sieve script can be, enforced at submission bytimsieved(8)and JMAP.
For backward compatibility, if no unit is specified, kibibytes is assumed.
sieve_maxscripts: 5β maximum number of sieve scripts any user may have, enforced at submission bytimsieved(8). Five is the moment. βsieve_utf8fileinto: 0β if enabled, the sieve engine expects folder names for thefileintoaction in scripts to use UTF8 encoding. Otherwise, modified UTF7 encoding should be used. Encoding lore, iykyk.sieve_sasl_send_unsolicited_capability: 1β Deprecated: this option does nothing. It's giving decorative. Ignore her. πsieve_use_lmtp_reject: 1β enabled by default. If reject can be done via LMTP, then return a550rather than generating the bounce message in Cyrus. Straight to the point, no bounce middleman. π₯sieve_vacation_min_response: 3dβ minimum time interval between consecutive vacation responses, per RFC 6131. The default is 3 days.
For backward compatibility, if no unit is specified, seconds is assumed.
sieve_vacation_max_response: 90dβ maximum time interval between consecutive vacation responses, per RFC 6131. The default is 90 days. The minimum is 7 days.
For backward compatibility, if no unit is specified, seconds is assumed.
sievedir: /usr/sieveβ ifsieveusehomediris false, this directory is searched for Sieve scripts. π¦sievenotifier: <none>β theNotifyd(8)method to use for"SIEVE"notifications. If it's not set,"SIEVE"notifications are disabled. This method is only used when no method is specified in the script.sieveusehomedir: 0β if enabled,lmtpdwill look for Sieve scripts in user's home directories:~user/.sieve. πanysievefolder: 0β it must be"yes"in order to permit the autocreation of any INBOX subfolder requested by a sieve filter, through the"fileinto"action.singleinstancestore: 1β if enabled,imapd,lmtpdandnntpdattempt to only write one copy of a message per partition and create hard links, resulting in a potentially large disk savings. Disk savings?? Obsessed. πskiplist_always_checkpoint: 1β if enabled, this option forces the skiplist cyrusdb backend to always checkpoint when doing a recovery. This causes slightly more IO, but on the other hand leads to more efficient databases, and the entire file is already "hot". Trade-offs, bestie. β¨skiplist_unsafe: 0β if enabled, this option forces the skiplist cyrusdb backend to not sync writes to the disk.
Enabling this option is NOT RECOMMENDED. Like, at all. Do not. π¨
smtp_backend: sendmailβ the SMTP backend to use for sending email. π§
The "host" backend sends message submissions via a TCP socket to the SMTP host defined in the config option smtp_host.
The "sendmail" backend forks the Cyrus process into the executable defined in the config option sendmail. The executable must accept "-bs" as command line argument, read from stdin and must implement the minimum SMTP protocol as defined in section 4.5.1 of RFC 5321.
If the SMTP EHLO command reports AUTH (RFC 4954) as a supported extension, then the MAIL FROM command includes the AUTH parameter, with its value set to the name of any authenticated user which triggered the email. The AUTH parameter is omitted if the user is unknown to the calling process.
If the directory configdirectory/log/smtpclient.smtp_backend exists, then telemetry logs for outgoing SMTP sessions will be created in this directory.
Allowed values: host, sendmail
smtp_host: localhost:587β the SMTP host to use for sending mail (also see thesmtp_backendoption). The value of this option must be the name or IP address of a TCP host, followed optionally by a colon and the port or service to use. The default port is587. TLS may be activated by appending"/tls"to the value. Authentication is enabled ifsmtp_auth_authnameis set. Authentication can be explicitly disabled by appending"/noauth"to the host address. πsmtp_auth_authname: <none>β the authentication name to use when authenticating to the SMTP server defined insmtp_host. πsmtp_auth_passwordβ default:<none>. The password to use when authenticating to the SMTP server defined insmtp_host. Keep it secret, keep it safe πsmtp_auth_realmβ default:<none>. The authentication SASL realm to use when authenticating to a SMTP server. SASL realm realness β¨soft_noauthβ default:1. If enabled,lmtpdreturns temporary failures if the client does not successfully authenticate. Otherwiselmtpdreturns permanent failures (causing the mail to bounce immediately). So if it's on, it's a soft no; if it's off, the mail bounces instantly πsortcache_dbβ default:twoskip. The cyrusdb backend to use for caching sort results (currently only used forxconvmultisort). Allowed values:skiplist,twoskip,zeroskip. Sorting cache vibes π§specialuse_extraβ default:<none>. Whitespace separated list of extra special-use attributes that can be set on a mailbox. RFC 6154 currently lists what special-use attributes can be set. This allows extending that list in the future or adding your own if needed. Extra special-use, because why not πspecialuse_nochildrenβ default:\Scheduled \Snooze. Whitespace separated list of special-use attributes that may not contain child folders. If set, mailboxes with any of these attributes may not have child folders created, and these attributes cannot be added to mailboxes that already have children. No kids allowed under these folders π«specialuse_protectβ default:\Archive \Drafts \Important \Junk \Sent \Scheduled \Snooze \Trash. Whitespace separated list of special-use attributes to protect the mailboxes for. If set, don't allow mailboxes with these special use attributes to be deleted or renamed to have a different parent. Default is the built-in list. Protect these at all costs π‘οΈspecialusealwaysβ default:1. If enabled, this option causes unextendedLISTandLSUBoutput to include the"special-use"flags. Always show the special-use flags πsql_databaseβ default:<none>. Name of the database which contains the cyrusdb table(s). SQL database name drop πsql_engineβ default:<none>. Name of the SQL engine to use. Allowed values:mysql,pgsql,sqlite. Pick your SQL engine, bestie β¨sql_hostnamesβ default:<empty string>. Comma separated list of SQL servers (inhost[:port]format). Host:port combo list, no cap πΈsql_passwdβ default:<none>. Password to use for authentication to the SQL server. SQL password, keep it lowkey πsql_userβ default:<none>. Username to use for authentication to the SQL server. SQL username, main character energy πsql_usesslβ default:0. If enabled, a secure connection will be made to the SQL server. Secure the bag with SSL πsrs_alwaysrewriteβ default:0. If true, perform SRS rewriting for ALL forwarding, even when not required. Rewrite ALL the things π₯srs_domainβ default:<none>. The domain to use in rewritten addresses. This must point only to machines which know the encoding secret used by this system. When present, SRS is enabled. Only point to machines that know the secret π€«srs_hashlengthβ default:0. The hash length to generate in a rewritten address. Hash length, cute β¨srs_secretsβ default:<none>. A list of secrets with which to generate addresses. Secrets list, shh π€«srs_separatorβ default:<none>. The separator to appear immediately afterSRS[01]in rewritten addresses. Separator after SRS[01] πsrvtabβ default:<empty string>. Deprecated: This option does nothing. Deprecated, it does nothing. Not me wasting time πsubmitserversβ default:<none>. A list of users and groups that are allowed to resolve"urlauth=submit+"IMAP URLs, separated by spaces. Any user listed in this will be allowed to fetch the contents of any valid"urlauth=submit+"IMAP URL: use with caution. Use with caution, bestie! This is powerful π¨subscription_dbβ default:flat. The cyrusdb backend to use for the subscriptions list. Allowed values:flat,skiplist,twoskip,zeroskip. Subscription list backend vibes π§suppress_capabilitiesβ default:<none>. Suppress the named capabilities from any capability response. Use the exact case as it appears in the response, e.g."suppress_capabilities: ESEARCH QRESYNC WITHIN XLIST LIST-EXTENDED"if you have a murder with 2.3.x backends and don't want clients being confused by new capabilities that some backends don't support. Exact case, no cap! πstatuscacheβ default:0. Enable/disable the imap status cache. Status cache on/off πstatuscache_dbβ default:twoskip. The cyrusdb backend to use for the imap status cache. Allowed values:skiplist,sql,twoskip,zeroskip. Status cache backend, slay β¨statuscache_db_pathβ default:<none>. The absolute path to the statuscache db file. If not specified, will beconfigdirectory/statuscache.db. Absolute path or default toconfigdirectory/statuscache.dbπsync_authnameβ default:<none>. The authentication name to use when authenticating to a sync server. Prefix with a channel name to only apply for that channel. Sync auth name, channel-prefixed πsync_batchsizeβ default:8192. the number of messages to upload in a single mailbox replication. Default is8192. If there are more than this many messages appended to the mailbox, generate a synthetic partial state and send that. Batch size 8192, synthetic partial state if more π¦sync_cache_dbβ default:twoskip. The cyrusdb backend to use for the replication cache. Allowed values:skiplist,sql,twoskip,zeroskip. Replication cache backend β¨sync_cache_db_pathβ default:<none>. The path for the replication cache. Prefix with a channel name to apply for that channel. NOTE, it's quite important to have a different one per backend! NOTE: different one per backend, fr fr! π₯sync_hostβ default:<none>. Name of the host (replica runningsync_server(8)) to which replication actions will be sent bysync_client(8). Prefix with a channel name to only apply for that channel. Sync host, where the replica lives πsync_logβ default:0. Enable replication action logging bylmtpd(8),imapd(8),pop3d(8), andnntpd(8). The log{configdirectory}/sync/logis used bysync_client(8)for"rolling"replication. Rolling replication logging πsync_log_chainβ default:0. Enable replication action logging bysync_serveras well, allowing chaining of replicas. Use this on'B'forA => B => Creplication layout. Chain replicas A => B => C πsync_log_channelsβ default:<none>. If specified, log all events to multiple log files in directories specified by each"channel". Each channel can then be processed separately, such as by multiplesync_client(8)s in a mesh replication scheme, or bysquatter(8)for rolling search index updates. You can use""(the two-character string U+22 U+22) to mean the default sync channel. Multi-channel logging, mesh vibes πsync_log_unsuppressable_channelsβ default:squatter. If specified, the named channels are exempt from the effect of settingsync_log_chain:off, i.e. they are always logged to by thesync_serverprocess. This is only really useful to allow rolling search indexing on a replica. Always logged, even if chain is off β¨sync_passwordβ default:<none>. The default password to use when authenticating to a sync server. Prefix with a channel name to only apply for that channel. Sync password, channel-prefixed πsync_portβ default:<none>. Name of the service (or port number) of the replication service on replica host. Prefix with a channel name to only apply for that channel. If not specified, and ifsync_try_imapis set to"yes"(the default), then the replication client will first try"imap"(port143) to check if imapd supports replication. Otherwise it will default to"csync"(usually port2005). Port or service, tries imap 143 then csync 2005 π¦sync_realmβ default:<none>. The authentication realm to use when authenticating to a sync server. Prefix with a channel name to only apply for that channel. Sync realm, channel-prefixed πsync_reconnect_maxwaitβ default:20m. Whensync_clientcannot connect to the replica, it enters a retry loop with an exponential backoff between attempts. This option sets the upper limit on that exponential backoff: no matter how long the replica has been down so far,sync_clientwill never wait longer thansync_reconnect_maxwaitbetween retries. If this is zero or negative, the backoff duration will be allowed to increase indefinitely (not recommended). If no unit is specified, seconds is assumed. Not recommended to go infinite, bestie! β³sync_repeat_intervalβ default:1s. Minimum interval between replication runs in rolling replication mode. If a replication run takes longer than this time, we repeat immediately. Prefix with a channel name to only apply for that channel. For backward compatibility, if no unit is specified, seconds is assumed. Rolling mode repeat interval πsync_rightnow_channelβ default:<none>. if set, runsync_clientto this channel immediately. As with channels, set this value to'""'to sync the default channel! Sync right now! Set to'""'for default πsync_shutdown_fileβ default:<none>. Simple latch used to tellsync_client(8)that it should shut down at the next opportunity. Safer than sending signals to running processes. Prefix with a channel name to only apply for that channel. Safer than signals, fr fr πsync_timeoutβ default:30m. How long to wait for a response before returning a timeout failure when talking to a replication peer (client or server). The minimum duration is3seconds, the default is30minutes. For backward compatibility, if no unit is specified, seconds is assumed. Timeout, min 3 seconds, default 30 minutes β°sync_try_imapβ default:1. Whethersync_clientshould try to perform an IMAP connection before falling back to csync. If this is set to"no",sync_clientwill only use csync. Prefix with a channel name to apply only for that channel. Try IMAP first, then csync β¨syslog_prefixβ default:<none>. String to be prepended to the process name in syslog entries. Can be further overridden by setting the$CYRUS_SYSLOG_PREFIXenvironment variable. Using the$CYRUS_SYSLOG_PREFIXenvironment variable has the additional advantage that it can be set before theimapd.confis read, so errors while reading the config file can be syslogged with the correct prefix. Prefix perks: can be set before config read πsyslog_facilityβ default:<none>. Configure a syslog facility. The default is whatever is compiled in. Allowed values are:DAEMON,MAIL,NEWS,USER, andLOCAL0through toLOCAL7. Syslog facility, default is compiled in πΈtcp_keepaliveβ default:0. Enable keepalive on TCP connections. TCP keepalive on/off πtcp_keepalive_cntβ default:0. Number of TCP keepalive probes to send before declaring the connection dead(0 == system default). Probe count, 0 means system default πtcp_keepalive_idleβ default:0. How long a connection must be idle before keepalive probes are sent(0 == system default). For backward compatibility, if no unit is specified, seconds is assumed. Idle time, 0 means system default β³tcp_keepalive_intvlβ default:0. Time between keepalive probes(0 == system default). For backward compatibility, if no unit is specified, seconds is assumed. Interval between probes, 0 means system default β¨temp_pathβ default:/tmp. The pathname to store temporary files in. It is recommended to use an in-memory filesystem such as tmpfs for this path. Recommended: tmpfs for temp_path π§telemetry_bysessionidβ default:0. If true, log by sessionid instead of PID for telemetry. Log by sessionid, not PID πtimeout:32mβ how long the IMAP server waits around being ignored before it kicks you out (the inactivity autologout timer, bestie). Minimum you're allowed to set is30 minutes. Default is32 minutes, and that lil extra cushion exists on purpose so clients that NOOP every 30 minutes don't get got. π«Ά
For backward compatibility, if you don't specify a unit, minutes is assumed.
imapidletimeout:<none>β timeout specifically for idling clients (RFC 2177, the IDLE girlies). If it's not set (which is the default), the value of"timeout"gets used instead. π€
For backward compatibility, if no unit is specified, minutes is assumed.
tls_ca_file:<none>β deprecated, babe. Usetls_client_ca_fileinstead.tls_ca_path:<none>β also deprecated, usetls_client_ca_dirinstead.tlscache_db:twoskipβ deprecated in favor oftls_sessions_db. πtlscache_db_path:<none>β deprecated in favor oftls_sessions_db_path.tls_cert_file:<none>β deprecated in favor oftls_server_cert.tls_cipher_list:DEFAULTβ deprecated in favor oftls_ciphers.tls_ciphers:DEFAULTβ the list of SSL/TLS ciphers you're allowing. The format of that string (and what"DEFAULT"even means) is described inciphers(1). π
Also check Mozilla's server-side TLS recommendations, they're iconic:
https://wiki.mozilla.org/Security/Server_Side_TLS
tls_crl_file:<none>β path to a file holding the Certificate Revocation List.tls_client_ca_dir:<none>β path to a directory holding the CA certificates used to verify client SSL certificates used for authentication.tls_client_ca_file:<none>β path to a file holding the CA certificate(s) used to verify client SSL certificates used for authentication.tls_client_cert:<none>β file containing the certificate presented to a server for authentication during STARTTLS. Setting it to"disabled"turns off this server's use of certificate-based authentication. πtls_client_certs:optionalβ disable ("off"), allow ("optional", the default) or require ("require") clients using SSL certificates to authenticate themselves. Allowed values:off,optional,require.tls_client_key:<none>β file containing the private key that belongs to thetls_client_certcertificate. A value of"disabled"disables this server's use of certificate-based authentication.tls_eccurve:prime256v1β the elliptic curve used for ECDHE. Default is NIST Suite B prime256. Run'openssl ecparam -list_curves'to see all the possible values, go look. πtls_key_file:<none>β deprecated in favor oftls_server_key.tls_required:0β if you enable this, a TLS/SSL encryption layer has to be negotiated before ANY authentication mechanisms get advertised or allowed. No encryption, no auth, periodt. π₯tls_prefer_server_ciphers:0β prefer the ciphers on the server side instead of the client side.tls_server_ca_dir:<none>β path to a directory with CA certificates used to verify certificates offered by the server, for when cyrus is acting as a client. This directory must have filenames with the hashed value of the certificates (peepopenssl(1)).tls_server_ca_file:<none>β path to a file containing CA certificates used to verify certificates offered by the server, when cyrus acts as a client.tls_server_cert:<none>β file containing the certificate, including the full chain, presented to clients. You can set two certificates, like RSA and EC, if the filenames are separated with a comma and no spaces.tls_server_dhparam:<none>β file containing the DH parameters belonging to the certificate intls_server_cert. Used by OpenSSL before version 3.0.tls_server_key:<none>β file containing the private key belonging to the certificate intls_server_cert. If it's not set,tls_server_certmust contain both the private and public key. If you're using two certificates you can set two key files, and then the files must be separated with a comma and no spaces.tls_sessions_db:twoskipβ the cyrusdb backend to use for the TLS cache. ποΈ
Allowed values: skiplist, sql, twoskip, zeroskip
tls_sessions_db_path:<none>β the absolute path to the TLS sessions db file. If you don't specify it, it'll beconfigdirectory/tls_sessions.db.tls_session_timeout:24hβ how long a TLS session gets cached for later reuse. The maximum value is24 hours, which is also the default. A value of0disables session caching entirely. β°
For backward compatibility, if no unit is specified, minutes is assumed.
tls_versions:tls1_0 tls1_1 tls1_2 tls1_3β a list of SSL/TLS versions to not disable. Cyrus IMAP SSL/TLS starts with all protocols and then subtracts the ones not in this list. Newer versions of SSL/TLS will need to be added here if you want them to be able to get disabled. πuidl_format:cyrusβ pick the format for UIDLs in pop3. Possible values are"uidonly","cyrus","dovecot"and"courier"."uidonly"forces the old default of UID,"cyrus"is UIDVALIDITY.UID. Dovecot is 8 digits of leading hex (lower case) each UID UIDVALIDITY. Courier is UIDVALIDITY-UID. Allowed values:uidonly,cyrus,dovecot,courierumask:077β the umask value used by various Cyrus IMAP programs.userdeny_db:flatβ the cyrusdb backend to use for the user access list.
Allowed values: flat, skiplist, sql, twoskip, zeroskip
userdeny_db_path:<none>β the absolute path to the userdeny db file. If you don't specify it, it'll beconfigdirectory/user_deny.db.username_tolower:1β convert usernames to all lowercase before login/authentication. Super useful with authentication backends that ignore case during username lookups (hi, LDAP π).userprefix:Other Usersβ if you're using the alternate IMAP namespace, this is the prefix for the other users namespace. The hierarchy delimiter gets automatically appended.unix_group_enable:1β should we look up groups when using auth_unix? Disable this if you're not using groups in ACLs for your IMAP server and you're using auth_unix with a backend (like LDAP) that can makegetgrent()calls painfully slow. πunixhierarchysep:1β use the UNIX separator character'/'for delimiting levels of mailbox hierarchy. Turn it off to use the netnews separator character'.'. Heads up though: with the newnews separator, no dots may occur in mailbox names. The default switched in 3.0 from off to on.vcard_max_size:0β maximum allowed vCard size. If it's non-zero, CardDAV and JMAP will reject storage of contacts whose vCard representation is bigger thanvcard_max_size. π
If set to 0 (the default), a large internally-defined limit gets applied.
If no unit is specified, bytes is assumed.
virtdomains:offβ configure virtual domain support. Here are the moods:offβ Cyrus doesn't know or care about domains. Only the local part of email addresses is ever considered. This is not recommended for any deployment, but it's currently the default.useridβ the user's domain is determined by splitting a fully qualified userid at the last'@'or'%'symbol. If the userid is unqualified, thedefaultdomaingets used. This is the recommended configuration for all deployments. If you wish to provide calendaring services you must use this configuration.onβ fully qualified userids are respected, same as"userid". Unqualified userids will have their domain determined by doing a reverse lookup on the IP address of the incoming network interface, or if no record is found, thedefaultdomaingets used.
Allowed values: off, userid, on
virusscan_notification_subject:Automatically deleted mailβ the text used in the subject of email notifications created bycyr_virusscan(8)when it deletes infected mail. π¦virusscan_notification_template:<none>β the absolute path to a file containing a template to use to describe infected messages that have been deleted bycyr_virusscan(8). Seecyr_virusscan(8)for the spec of how this file's format works. If you don't specify it, the builtin default template gets used.websocket_timeout:30mβ sets the length of the HTTP server's inactivity autologout timer once a WebSocket channel has been established. Default is30 minutes. The minimum value is0, which disables WebSockets. π
If no unit is specified, minutes is assumed.
webdav_attachments_baseurl:<none>β the base URL for WebDAV managed attachments, not counting the Cyrus-specific URL paths. Typically this only includes the HTTP scheme and host name at which DAV clients may fetch managed attachments from, e.g."https://dav.example.com". If it's not specified, the target host of the DAV HTTP request that uploaded the attachment gets used. For JMAP, theLink.blobIdproperty of JSCalendar objects will be disabled.webdav_attachments_max_binary_attach_size:1024Kβ the maximum byte length of anATTACHproperty value when managed attachment URIs get rewritten to BINARY during iTIP processing. Any attachment that exceeds this byte size keeps its managed attachment URI as itsATTACHvalue. A zero size limit causes attachments of any size to be rewritten as BINARY.xbackup_enabled:0β deprecated. No longer used, she's retired. πxlist-flag:<none>β set the special-use flag flag on the specified folder when it gets autocreated (see theautocreate_inbox_foldersoption). For example, ifxlist-junk: Spamis set, and the folderSpamis autocreated, the special-use flag\Junkgets set on it. ποΈ
(This option is so named for backward compatibility with old config files. iykyk.)
lmtp_catchall_mailbox:<none>β mail sent to mailboxes that don't exist will be delivered to this user.
NOTE: This must be an existing local user name with an INBOX, NOT an email address! Don't get caught slippin' on this one. π
zoneinfo_db:twoskipβ the cyrusdb backend for zoneinfo. This db is what thetzdisthttpmodules use, and it's managed byctl_zoneinfo(8). Allowed values, and bestie you have exactly four:flat,skiplist,twoskip,zeroskip. That's the whole menu. πzoneinfo_db_path:<none>β the absolute path to the zoneinfo db file. Leave it blank and it just becomesconfigdirectory/zoneinfo.db. Easy. β¨zoneinfo_dir:<none>β the absolute path to the zoneinfo directory, the one holding all your timezone definitions as generated by thevzictool. Setting this overrides any compile-time value that got baked in with the--with-zoneinfo-dirconfigure option. Rude? No, it's just how precedence works. π
If you don't specify it, and there's no compile-time value either, then whatever definitions libical manages to find are what you get. Surprise time. π¦
And if you're running a Time Zone Data Distribution Service β like, you've literally got"tzdist"sitting in yourhttpmodulesβ then this option or a compile-time value MUST be specified. Not optional. Not vibes-based. Required, periodt.
object_storage_enabled:0β is Object storage enabled for this server? Big question. Note that you also need archiving enabled and anarchivepartitionfor the mailbox β this flag alone doesn't do the thing. Only email files go on Object storage; the archive partition is what stores any other files. Teamwork. π«Άobject_storage_dummy_spool:<none>β a dummy object storage spool. This one is for test only, okay? It's the spool where the user directory (container) gets created to store all the emails in a flat structure. πopenio_namespace:<none>β the OpenIO namespace used to store archived email messages. A namespace identifies the physical platform that cyrus has to contact. This directive is what the OpenIO's SDK uses to locate its platform entry point. πopenio_account:<none>β the OpenIO account used to account for stored emails. Accounts are unique inside their namespace, and they hand you virtual partitions, with quotas and QoS features. Fancy. πopenio_rawx_timeout:30sβ the OpenIO timeout for querying the RAWX services (default30sec). β³openio_proxy_timeout:5sβ the OpenIO timeout for querying the PROXY services (default5sec). β³openio_autocreate:0β lets the OpenIO SDK autocreate containers. This is mainly destined to be turned on in development environments. In production, the container should have already been provisioned with the mailboxes, so likeβ¦ don't. πopenio_verbosity:<none>β sets the logging verbosity of the OpenIO's internal behavior. Admissible values are"warning","notice","info","debug","trace","quiet". The default verbosity is"warning". Set to"notice"for a few lines on a per-client basis. Set to"info"for a few lines on a per-request basis. Set to"debug". Set to"trace"to activate the underlyinglibcurldebug output. Enabling a verbosity higher to equal than"debug"requires the cyrus to be set in debug mode. And the special"quiet"value disables all kinds of logging at the GLib level. πcaringo_hostname:<none>β the Caringo hostname used to store archived email messages. A hostname identifies the physical platform cyrus must contact. This directive is used by the Caringo's SDK (CastorSDK: Caringo Simple Content Storage Protocol (SCSP) on HTTP 1.1 using a RESTful architecture. πcaringo_port:80β the port of the caringo server (caringo_hostname); default is80. πfastmailsharing:0β if enabled, use FastMail style sharing (oldschool full server paths). Vintage. Iconic. β¨
π SEE ALSO π
imapd(8), pop3d(8), nntpd(8), lmtpd(8), httpd(8), timsieved(8), idled(8), notifyd(8), deliver(8), master(8), ciphers(1)
Go read them, bestie, they're all part of the same family reunion. π«Ά
π AUTHOR π
The Cyrus Team
π COPYRIGHT π
1993β2026, The Cyrus Team
and that's a wrap on IMAPD.CONF(5) β the whole thing, every last option, no crumbs left behind π
β¨
This one's from the 3.12.4 era, dated Sep 09, 2026 β so you know it's fresh. Go forth and configure, you absolute icon. slay π¦ππ
π¦ where this page comes from
- fedora 44: cyrus-imapd 3.12.4-1.fc44 Β· BSD-Attribution-HPND-disclaimer
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms