SQL-indexed storage
The imapsql module implements database for IMAP index and message metadata using SQL-based relational database.
Message contents are stored in an "blob store" defined by msg_store directive. By default this is a file system directory under /var/lib/maddy.
Supported RDBMS: - SQLite 3.25.0 - PostgreSQL 9.6 or newer - CockroachDB 20.1.5 or newer
Account names are required to have the form of a email address (unless configured otherwise) and are case-insensitive. UTF-8 names are supported with restrictions defined in the PRECIS UsernameCaseMapped profile.
storage.imapsql {
driver sqlite3
dsn imapsql.db
msg_store fs messages/
}
imapsql module also can be used as a lookup table. It returns empty string values for existing usernames. This might be useful with destination_in directive e.g. to implement catch-all addresses (this is a bad idea to do so, this is just an example):
destination_in &local_mailboxes {
deliver_to &local_mailboxes
}
destination example.org {
modify {
replace_rcpt regexp ".*" "catchall@example.org"
}
deliver_to &local_mailboxes
}
Arguments
Specify the driver and DSN.
Configuration directives
Syntax: driver string
Default: not specified
REQUIRED.
Use a specified driver to communicate with the database. Supported values: sqlite3, postgres.
Should be specified either via an argument or via this directive.
Syntax: dsn string
Default: not specified
REQUIRED.
Data Source Name, the driver-specific value that specifies the database to use.
For SQLite3 this is just a file path. For PostgreSQL: https://godoc.org/github.com/lib/pq#hdr-Connection_String_Parameters
Should be specified either via an argument or via this directive.
Syntax: msg_store store
Default: fs messages/
Module to use for message bodies storage.
See "Blob storage" section for what you can use here.
Syntax:
compression off
compression algorithm
compression algorithm level
Default: off
Apply compression to message contents. Supported algorithms: lz4, zstd.
Syntax: appendlimit size
Default: 32M
Don't allow users to add new messages larger than 'size'.
This does not affect messages added when using module as a delivery target. Use 'max_message_size' directive in SMTP endpoint module to restrict it too.
Syntax: debug boolean
Default: global directive value
Enable verbose logging.
Syntax: junk_mailbox name
Default: Junk
The folder to put quarantined messages in. Thishis setting is not used if user does have a folder with "Junk" special-use attribute.
Syntax: disable_recent boolean
*Default: true
Disable RFC 3501-conforming handling of \Recent flag.
This significantly improves storage performance when SQLite3 or CockroackDB is used at the cost of confusing clients that use this flag.
Syntax: sqlite_cache_size integer
Default: defined by SQLite
SQLite page cache size. If positive - specifies amount of pages (1 page - 4 KiB) to keep in cache. If negative - specifies approximate upper bound of cache size in KiB.
Syntax: sqlite_busy_timeout integer
Default: 5000000
SQLite-specific performance tuning option. Amount of milliseconds to wait before giving up on DB lock.
Syntax: imap_filter { ... }
Default: not set
Specifies IMAP filters to apply for messages delivered from SMTP pipeline.
Ex.
imap_filter {
command /etc/maddy/sieve.sh {account_name}
}
Syntax: delivery_map table
Default: identity
Use specified table module to map recipient addresses from incoming messages to mailbox names.
Normalization algorithm specified in delivery_normalize is appied before delivery_map.
Syntax: delivery_normalize name
Default: precis_casefold_email
Normalization function to apply to email addresses before mapping them to mailboxes.
See auth_normalize.
Syntax: auth_map table
Default: identity
Use specified table module to map authentication usernames to mailbox names.
Normalization algorithm specified in auth_normalize is applied before auth_map.
Syntax: auth_normalize name
Default: precis_casefold_email
Normalization function to apply to authentication usernames before mapping them to mailboxes.
Available options: - precis_casefold_email PRECIS UsernameCaseMapped profile + U-labels form for domain - precis_casefold PRECIS UsernameCaseMapped profile for the entire string - precis_email PRECIS UsernameCasePreserved profile + U-labels form for domain - precis PRECIS UsernameCasePreserved profile for the entire string - casefold Convert to lower case - noop Nothing
Note: On message delivery, recipient address is unconditionally normalized using precis_casefold_email function.