Configuring the Queues¶
With the mail queue being the heart of an MTA, the queue
section of
slimta.conf
is both important and highly customizable. It also introduces
the possibility of using the slimta-worker
executable for some queue types.
In the queue
section, each key provides an arbitrary, free-form name for
the queue. The sub-section for each key has two required settings:
type
: String, requiredDefines the type of queue. A known type must be given or an error will be thrown. The other keys in this mapping depend on the value of
type
.relay
: String, requiredDelivery attempts of messages in the queue are passed to this relay. The value is a name, which must correspond to a key in the top-level
relay
section.bounce_queue
: StringOften when mail is to be relayed locally, the relay is incapable of delivering bounce messages to arbitrary sender addresses hosted elsewhere. You may also want to apply different retry behavior to bounce messages. This option allows you to specify the name of another queue in the top-level
queue
section, which will be used to deliver bounce messages instead of the current queue.
Queue Policy Settings¶
On entry into the queue, there are several Policy Implementation that can be applied
to a message. To configure them, there is an additional, optional key available
in a queue
sub-section:
policies
: ListEach entry in this list is a dictionary with a
type
field. Check out the Policy Implementation page for more information about each type:add_date_header
: Adds theDate:
header to the message.add_message_id_header
: Adds theMessage-Id:
header to the message.add_received_header
: Adds aReceived:
header to the message.recipient_split
: Forks the message so that for each recipient there is a deep copy of the original message.recipient_domain_split
: Forks the message so that for each unique domain in the message recipients there is a deep copy of the original message with the recipients for that domain.forward
: Rewrites recipients using regular expressions. Along with thetype
key, there is amapping
key which is a dictionary of replacement rules where each key is a regular expression pattern and the value is string to replace the pattern match with.spamassassin
: Queries a SpamAssassin server to check if the message is considered spam, adding headers to the message with the results.
Delivery Retry Behavior¶
Additionally, every queue
type (except for "custom"
and "proxy"
)
honors the ability to configure message retrying with the following
configuration settings:
retry
: DictionaryIf this dictionary is not given, messages are never retried. This dictionary has two keys,
delay
andmaximum
:delay
: StringDefines an mathematic expression whose result is used as the number of seconds to delay between each delivery attempt of a message. The string allows arithmetic operators and the use of any functions in the
math
module (without themath.
prefix). The variablex
may be used in the expression, and will be replaced with the number of delivery attempts the message has undergone.For example, passing the string
"300*x"
will start the delay at five minutes, and increase the delay by an additional five minutes for each attempt on the message.The default value of this setting is
"300"
, which results in messages being retried every five minutes until the maximum number of attempts has been reached.maximum
: IntegerDefines the maximum number of retries before a message is failed. If this value is not given, messages are never retried.
memory
Queues¶
With this queue type, all queued messages and their metadata reside in memory.
While this is fast and easy to setup, it is not safe for production usage, and
can easily result in loss of mail. The "memory"
queue type does not have any
additional settings.
disk
Queues¶
With this queue type, messages and their metadata are spooled to disk before acceptance. This queue type requires three directories, which are configured with the following keys:
tmp_dir
: StringThis directory is used as scratch space so that files can be created and written before being moved to their final destination. This allows for the use of the atomic
os.rename()
operation, to help prevent data corruption. By default, the OS-specific temporary directory is used.envelope_dir
: String, requiredIn this directory, the message contents and envelope information are written to files that use the
.env
suffix in a Pythonpickle
format.meta_dir
: String, requiredIn this directory, the message metadata is kept in files that end in
.meta
. This information is primarily related to the delivery of the message, including how many attempts it has undergone, and is kept separately so that it can be written to often.
redis
Queues¶
With this queue type, messages and their metadata are stored as a hash in a local or remote redis instance. Additionally, a queue is maintained in redis of pending new message IDs, meaning this mechanism can receive and deliver messages across processes. This queue type is configured with the following keys:
host
: StringThis is the hostname of the redis instance to connect to and use as queue storage. By default,
localhost
is used.port
: IntegerThis is the port to connect to on the redis instance. By default,
6379
is used.db
: IntegerUpon connection, this is the database number to SELECT before doing anything else. By default,
0
is used.password
: StringIf given, the AUTH command is called with this string before doing anything else with the connection.
prefix
: StringThis string is prefixed to every key created by the redis storage engine. This can be used to isolate keys from others in the system, to allow for multiple redis storage engines to run in the same database, or just to make keys more recognizable. By default,
slimta:
is used.
aws
Queues¶
This queue type stores messages and their metadata in AWS services. The
boto
library must be installed from PyPI to use this queue type. It
takes the following keys:
access_key_id
: StringYour AWS Access Key ID. If this is not given, the
boto
library attempts to fetch this value from environment variables.secret_access_key
: StringYour AWS Secret Access Key. If this is not given, the
boto
library attempts to fetch this value from environment variables.bucket_name
: String, requiredThe S3 bucket name used to create storage objects containing the
Envelope
and queue metadata.queue_name
: StringThe SQS queue name used by the storage engine. If this value is not given, SQS will not be used.
queue_region
: StringThe SQS queue region. By default,
us-west-2
is used.
proxy
Queues¶
The "proxy"
queue type is not a queue at all, but rather a method of
bypassing the queue step and immediately attempting message delivery. If
delivery fails, the client gets immediate feedback from the edge service. There
are no additional configuration settings for this queue type.
custom
Queues¶
Only one additional key is required by the "custom"
queue type:
factory
: String, requiredThis is a string of the form
package.module:symbol
. The package and module portion are imported withimportlib.import_module()
, and then the symbol is fetched from the loaded module withgetattr()
.The result of loading the symbol must be a function that takes two arguments, the options object (that contains the
type
,relay
, andfactory
keys as well as any others as necessary) and theRelay
object that the queue should use for message delivery:def queue_factory(options, relay): if 'foo' in options: return FooQueue(options.stuff, relay) else: return BarQueue(options.baz, relay)