Recent Releases

8/15/2008: Version 4.0.3

Bug fixes only for an integer parsing error on FreeBSD and incorrect handling of invalid nameservers in /etc/resolv.conf.

View the changelog
View the upgrade instructions
Download spamdyke 4.0.3

8/6/2008: Version 4.0.2

Bug fixes only for a graylist directory error that resulted in very deep directory structures for empty senders.

Download spamdyke 4.0.2

7/17/2008: Version 4.0.1

Bug fixes only for a graylist directory error, a double-free() problem that can cause crashes in a specific circumstance and a compiler warning on Solaris.

Download spamdyke 4.0.1

spamdyke Documentation

This file is updated with each version of spamdyke to reflect the latest features and behavior. If you need documentation for an older version, each version's README file is included in the download package for that version.

This document applies to spamdyke version 4.0.3.

Other Documentation

The following additional documents are available:
Installation instructions: INSTALL.txt
Upgrading instructions: UPGRADING.txt
Frequently Asked Questions: FAQ.html
Change log: Changelog.txt
To-do list: TODO.txt

About spamdyke

help
version

spamdyke is a filter for monitoring and intercepting incoming SMTP connections to a qmail server. It acts as a transparent middleman, observing the conversation without interference unless it sees something it should block. Because it can silently monitor, it can also log mail traffic in several different ways.

spamdyke is ©2008 Sam Clippinger, samc (at) silence (dot) org. It is distributed under the GNU General Public License (version 2 only) from http://www.spamdyke.org/

The --help command line option will give a brief summary of the available command line options. The --version command line option will give just the version and copyright statement.

Support

spamdyke support is available from the spamdyke-users mailing list: www.spamdyke.org/mailman/listinfo/spamdyke-users.

The mailing list archives are searchable thanks to mail-archive.com: www.mail-archive.com/spamdyke-users@spamdyke.org.

All of the spamdyke documentation and downloadable files are available from the spamdyke website: www.spamdyke.org.

If all else fails, email the author directly at samc (at) silence (dot) org.

How spamdyke works: When a message is not blocked

spamdyke works by acting as a middleman between qmail and the network (in Unix terms, it's a pipe). When no spamdyke filters are triggered and a message is delivered normally, spamdyke silently passes data in both directions. As the SMTP conversation takes place, spamdyke collects a few pieces of data (e.g. the sender and recipient addresses) so they can be logged.

spamdyke does modify the incoming message in one way. The SMTP protocol requires the remote sender to end every line with a two character terminator -- a carriage return and a line feed. Unlike most other mail servers, qmail chooses to strictly enforce this requirement. If a remote sender uses only a line feed to end a line (a typical and easy mistake to make), qmail will reject the message:

451 See http://pobox.com/~djb/docs/smtplf.html.
Because qmail's strict enforcement of the protocol tends to cause more problems than it solves, spamdyke silently helps mail clients avoid this error by inserting a carriage return before any bare line feed characters it sees. This doesn't affect the messages, it only allows poorly-written mail clients to send email.

How spamdyke works: When a message is blocked

spamdyke's filters are described in detail below. When one of them is triggered, spamdyke moves in to block the incoming message.

First, it considers the enabled filters and waits until there is no way the client can avoid a rejection. For example, if authentication could take place but has not done so, spamdyke will wait to see if the remote sender authenticates. Authenticated or whitelisted connections are never filtered.

Next, once spamdyke is certain the message should be filtered, it cuts the connection between the remote sender and qmail. In the background, spamdyke closes the connection to qmail, so qmail will exit normally, believing the remote sender disconnected.

spamdyke continues sending responses to the remote server, just as qmail would have. Once the remote sender has identified the sender and recipient, spamdyke sends an error code and refuses to accept the message. The remote server disconnects, never knowing that spamdyke hijacked the conversation. spamdyke, meanwhile, uses the sender and recipient information it gathered to construct its log messages.

Usage

spamdyke's behavior is controlled through options given on the command line or in configuration files (or both).

On the command line, long options should be prefixed with two hyphens (--). Some options have short versions, which should be prefixed with one hyphen (-).

In a configuration file, only the long versions are valid and an equals sign must separate the value from the option. See Configuration Files for details.

For example, consider the max-recipients option, which restricts the maximum number of recipients per message. On the command line, limiting the number of recipients to 5 might look like this:

spamdyke --max-recipients 5 ...
Or, since its short version has the same meaning, the command line could look like this:
spamdyke -a 5 ...
In a configuration file, only the long version is valid and an equals sign is required, so the entry would look like this:
max-recipients=5

If the option's value contains spaces, it should be surrounded by quotes on the command line. For example, consider the rejection-text-ip-blacklist option, which changes the error message spamdyke sends if the remote server's IP address is blacklisted. On the command line, changing the message might look like this:

spamdyke --rejection-text-ip-blacklist "Go away spammer" ...
However, in a configuration file quotes are not allowed, so the entry would look like this:
rejection-text-ip-blacklist=Go away spammer

After all options are given, spamdyke expects the rest of its command line to contain the qmail command. For example:

spamdyke -a 5 /var/qmail/bin/qmail-smtpd
Sometimes, depending on the options in use, spamdyke's command line parser can become confused. If spamdyke believes the qmail command is a parameter to one of its options, you may see the following error message:
ERROR: Missing qmail-smtpd command
To resolve this, place two hyphens (--) between the end of spamdyke's options and the qmail command. For example:
spamdyke -a 5 -- /var/qmail/bin/qmail-smtpd

The following options are only valid on the command line:

Long Version Short Version Parameter Description
config-test     Tests the configuration as much as possible and reports any errors that can be discovered without actually accepting an incoming message. Use this option with all other options that are given during normal operation. To check file permissions properly, use the run-as-user option.

See Configuration Tests for details.
config-test-smtpauth-password   PASSWORD While testing the configuration with config-test, run the commands given with smtp-auth-command to test authentication processing. Use PASSWORD as the authentication password. This option has no effect unless config-test, config-test-smtpauth-username and smtp-auth-command are given.

If config-test-smtpauth-password is given multiple times, spamdyke will use the last value it finds.

If config-test-smtpauth-password is not given, spamdyke will not test the authentication command(s).

See Configuration Tests for details.
config-test-smtpauth-username   USERNAME While testing the configuration with config-test, run the commands given with smtp-auth-command to test authentication processing. Use USERNAME as the authentication username. This option has no effect unless config-test, config-test-smtpauth-password and smtp-auth-command are given.

If config-test-smtpauth-username is given multiple times, spamdyke will use the last value it finds.

If config-test-smtpauth-username is not given, spamdyke will not test the authentication command(s).

See Configuration Tests for details.
help h   Displays a summary of spamdyke's options, then exits.
version v   Displays the spamdyke version and copyright statement, then exits.

The following options are valid on the command line and in configuration files. Some options are not valid in files within configuration directories; those options are noted below. See Configuration Directories for details.

Long Version Short Version
(command line only)
Parameter Description
access-file   FILE Use FILE to determine if the remote host is allowed to connect and/or relay. Only needed when using spamdyke to provide SMTP AUTH for an unpatched qmail installation. Most often, FILE is /etc/tcp.smtp.

If access-file is given multiple times, each FILE is scanned (in the given order) until a match is found.

If access-file is not given, spamdyke will not search any files for relaying permission.

access-file is not valid within configuration directories.

See Relaying for details.
config-dir   DIR Search the directory structure starting at DIR for configuration files that match the remote server's IP address, the remote server's rDNS name, the sender's email address, the recipient's email address or any combination of the four criteria.

If config-dir is given multiple times, each DIR is scanned (in the given order) until a match is found.

If config-dir is not given, spamdyke will not scan any directories for configuration files.

config-dir is not valid within configuration directories.

See Configuration Directories for details.
config-dir-search   first, all-ip, all-rdns, all-sender or all-recipient Search the directory structure given by config-dir using the given search rules.

If config-dir-search is given multiple times, the given values are used in combination.

If config-dir-search is not given, spamdyke will use a value of first.

config-dir-search is not valid within configuration directories.

See Configuration Directories for details.
config-file f FILE Read additional configuration options from FILE as though they were given on the command line.

If config-file is given multiple times, each FILE is read in the given order.

If config-file is not given, spamdyke will not read a configuration file.

See Configuration Files for details.
connection-timeout-secs t SECS Forcibly disconnect after a total of SECS seconds, regardless of activity. A value of 0 disables this feature.

If connection-timeout-secs is given multiple times, spamdyke will use the last value it finds.

If connection-timeout-secs is not given, spamdyke will not enforce a connection timeout.

connection-timeout-secs is not valid within configuration directories.

See Timeouts for details.
dns-blacklist-entry x DNSRBL Check the remote server's IP address against the realtime blackhole list DNSRBL. If it is found, the connection is rejected. NOTE: Using more than a few DNS blacklists can cause serious performance problems.

If dns-blacklist-entry is given multiple times, spamdyke will check each given DNSRBL for the remote server's IP address.

If dns-blacklist-entry and dns-blacklist-file are not given, spamdyke will not check any blackhole lists.

See DNS RBLs for details.
dns-blacklist-file   FILE Check the remote server's IP address against each of the realtime blackhole lists listed in FILE. If it is found on any of the lists, the connection is rejected. NOTE: Using more than a few DNS blacklists can cause serious performance problems.

If dns-blacklist-file is given multiple times, spamdyke will check each of the blackhole lists listed in each of the files for the remote server's IP address until a match is found.

If dns-blacklist-entry and dns-blacklist-file are not given, spamdyke will not search any files for blackhole lists.

See DNS RBLs for details.
dns-level   none, normal or aggressive none: Do not perform any DNS queries. All DNS-based filters will behave as though no response was received from any nameserver.

normal: Send single DNS queries to one nameserver at a time and wait for responses. This mimics the standard system resolver library's behavior.

aggressive: Send multiple DNS queries to multiple DNS servers simultaneously to find answers as quickly as possible.

If dns-level is given multiple times, spamdyke will use the last value it finds.

If dns-level is not given, spamdyke will use a value of aggressive.

dns-level is not valid within configuration directories.

See DNS Queries for details.
dns-max-retries-primary   NUM Query the primary nameserver(s) NUM times before also querying the secondary nameserver(s). If NUM is larger than the value of dns-max-retries-total, the value of dns-max-retries-total is used instead.

If dns-max-retries-primary is given multiple times, spamdyke will use the last value it finds.

If dns-max-retries-primary is not given, spamdyke will use a value of 1.

dns-max-retries-primary is not valid within configuration directories.

See DNS Queries for details.
dns-max-retries-total   NUM Send a maximum of NUM queries to any nameserver(s), primary or secondary.

If dns-max-retries-total is given multiple times, spamdyke will use the last value it finds.

If dns-max-retries-total is not given, spamdyke will use a value of 3.

dns-max-retries-total is not valid within configuration directories.

See DNS Queries for details.
dns-server-ip   IPADDRESS[:PORT] Use IPADDRESS as a secondary nameserver. If PORT is given, DNS queries will be send to that port number.

If dns-server-ip is given multiple times, each of the given nameservers will be queried.

If dns-server-ip and dns-server-ip-primary are not given, spamdyke will read the list of nameservers from /etc/resolv.conf.

dns-server-ip is not valid within configuration directories.

See DNS Queries for details.
dns-server-ip-primary   IPADDRESS[:PORT] Use IPADDRESS as a primary nameserver. If PORT is given, DNS queries will be send to that port number.

If dns-server-ip-primary is given multiple times, each of the given nameservers will be queried before any secondary nameservers are queried.

If dns-server-ip and dns-server-ip-primary are not given, spamdyke will read the list of nameservers from /etc/resolv.conf.

dns-server-ip-primary is not valid within configuration directories.

See DNS Queries for details.
dns-timeout-secs   SECS Do not take more than a total of SECS seconds to perform a DNS query, including all of the retries.

If dns-timeout-secs is given multiple times, spamdyke will use the last value it finds.

If dns-timeout-secs is not given, spamdyke will use the value 30.

dns-timeout-secs is not valid within configuration directories.

See DNS Queries for details.
dns-whitelist-entry   DNSWHITELIST Check the remote server's IP address against the DNS whitelist DNSWHITELIST (essentially a DNSRBL that contains whitelisted IPs). If it is found, all filters are bypassed. NOTE: Using more than a few DNS whitelists can cause serious performance problems.

If dns-whitelist-entry is given multiple times, spamdyke will check each given DNSWHITELIST for the remote server's IP address.

If dns-whitelist-entry and dns-whitelist-file are not given, spamdyke will not check any DNS whitelists.

See DNS Whitelists for details.
dns-whitelist-file   FILE Check the remote server's IP address against each of the DNS whitelists (essentially a DNSRBL that contains whitelisted IPs) listed in FILE. If it is found on any of the lists, all filters are bypassed. NOTE: Using more than a few DNS whitelists can cause serious performance problems.

If dns-whitelist-file is given multiple times, spamdyke will check each DNS whitelist listed in each given FILE for the remote server's IP address.

If dns-whitelist-entry and dns-whitelist-file are not given, spamdyke will not check any DNS whitelists.

See DNS Whitelists for details.
filter-level   allow-all, normal, require-auth or reject-all allow-all: Allow all connections to bypass all filters, effectively whitelisting everything.

normal: Apply enabled filters according to the options on the command line and in the configuration file(s).

require-auth: Reject all connections that haven't authenticated using SMTP AUTH.

reject-all: Reject all connections, regardless of authentication or whitelists.

If filter-level is given multiple times, spamdyke will use the last value it finds.

If filter-level is not given, spamdyke will use a value of normal.

See Filter Levels for details.
full-log-dir L DIR Log all SMTP data to files in DIR. This is handy for troubleshooting delivery problems but it is not meant to be used long-term. This option imposes a performance penalty!

If full-log-dir is given multiple times, spamdyke will use the last value it finds.

If full-log-dir is not given, spamdyke will not log all SMTP data.

full-log-dir is not valid within configuration directories.

See Logging All Data for details.
graylist-dir g DIR Search for and create graylist files in directory structures within DIR. This option has no effect unless graylist-level is given.

If graylist-dir is given multiple times, spamdyke will search each given directory in the given order for the recipient's domain directory and stop when it finds the first one.

If graylist-dir is not given, spamdyke will not graylist connections.

See Graylisting / Greylisting for details.
graylist-exception-ip-entry   IPADDRESS Reverse the behavior of the graylist filter for remote servers whose IP addresses match IPADDRESS. This option has no effect unless graylist-level and graylist-dir are given.

If graylist-exception-ip-entry is given multiple times, spamdyke will match the remote server's IP address against given IPADDRESS.

If graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry and graylist-exception-rdns-file are not given, spamdyke will graylist each connection according to the value of graylist-level.

See Graylisting / Greylisting for details.
graylist-exception-ip-file   FILE Reverse the behavior of the graylist filter for remote servers whose IP addresses match entries in FILE. This option provides better performance than graylist-exception-ip-entry for more than a few entries. This option has no effect unless graylist-level and graylist-dir are given.

If graylist-exception-ip-file is given multiple times, spamdyke will match the remote server's IP address against each entry in each given FILE.

If graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry and graylist-exception-rdns-file are not given, spamdyke will graylist each connection according to the value of graylist-level.

See Graylisting / Greylisting for details.
graylist-exception-rdns-dir   DIR Reverse the behavior of the graylist filter for remote servers whose rDNS names match files in DIR. This option provides much better performance than graylist-exception-rdns-file for large numbers of entries. This option has no effect unless graylist-level and graylist-dir are given.

If graylist-exception-rdns-dir is given multiple times, spamdyke will search each DIR for files that match the remote server's rDNS name.

If graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry and graylist-exception-rdns-file are not given, spamdyke will graylist each connection according to the value of graylist-level.

See Graylisting / Greylisting for details.
graylist-exception-rdns-entry   RDNSNAME Reverse the behavior of the graylist filter for remote servers whose rDNS names match RDNSNAME. This option has no effect unless graylist-level and graylist-dir are given.

If graylist-exception-rdns-entry is given multiple times, spamdyke will match the remote server's rDNS name against each given RDNSNAME.

If graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry and graylist-exception-rdns-file are not given, spamdyke will graylist each connection according to the value of graylist-level.

See Graylisting / Greylisting for details.
graylist-exception-rdns-file   FILE Reverse the behavior of the graylist filter for remote servers whose rDNS names match entries in FILE. This option provides better performance than graylist-exception-rdns-entry for more than a few entries. This option has no effect unless graylist-level and graylist-dir are given.

If graylist-exception-rdns-file is given multiple times, spamdyke will match the remote server's rDNS name against each entry in each given FILE.

If graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry and graylist-exception-rdns-file are not given, spamdyke will graylist each connection according to the value of graylist-level.

See Graylisting / Greylisting for details.
graylist-level   none, always, always-create-dir, only or only-create-dir none: Do not graylist any connections.

always: Graylist all connections that have an existing recipient domain directory, except those that match one of the options graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry or graylist-exception-rdns-file. If local-domains-entry or local-domains-file is not given, this value has no effect.

always-create-dir: Graylist all connections except those that match one of the options graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry or graylist-exception-rdns-file. If the recipient's domain directory does not exist, create it. If local-domains-entry or local-domains-file is not given, this value has no effect.

only: Do not graylist any connections unless the recipient's domain directory exists and the connection matches one of the options graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry or graylist-exception-rdns-file. If local-domains-entry or local-domains-file is not given, this value has no effect.

only-create-dir: Do not graylist any connections unless it matches one of the options graylist-exception-ip-entry, graylist-exception-ip-file, graylist-exception-rdns-dir, graylist-exception-rdns-entry or graylist-exception-rdns-file. If the recipient's domain directory does not exist, create it. If local-domains-entry or local-domains-file is not given, this value has no effect.

If graylist-level is given multiple times, spamdyke will use the last value it finds.

If graylist-level is not given, spamdyke will use a value of none.

See Graylisting / Greylisting for details.
graylist-max-secs M SECS Invalidate graylist entries after they are SECS seconds old. A value of 0 prevents graylist entries from ever expiring. Requires graylist-dir and graylist-level.

If graylist-max-secs is given multiple times, spamdyke will use the last value it finds.

If graylist-max-secs is not given, spamdyke will use a value of 0.

See Graylisting / Greylisting for details.
graylist-min-secs m SECS Require a graylist entry to be present for SECS seconds before allowing incoming mail. A value of 0 will not require any delay; mail will be accepted in any connection immediately after the initial graylisting. Requires graylist-dir and graylist-level.

If graylist-min-secs is given multiple times, spamdyke will use the last value it finds.

If graylist-min-secs is not given, spamdyke will use a value of 0.

See Graylisting / Greylisting for details.
greeting-delay-secs e SECS Delay sending the SMTP greeting banner SECS seconds to see if the remote server begins sending data early. If it does, the connection is rejected.

If greeting-delay-secs is given multiple times, spamdyke will use the last value it finds.

If greeting-delay-secs is not given, spamdyke will use a value of 0.

See Earlytalkers for details.
hostname   NAME Use NAME as the fully qualified domain name of this host. This value is only used to create an encrypted challenge during SMTP AUTH challenge-response protocols.

If hostname is given multiple times, spamdyke will use the last value it finds.

If hostname, hostname-command and hostname-file are not given, spamdyke will search for the host's name in the environment or will use a default name.

hostname is not valid within configuration directories.

See SMTP AUTH for details.
hostname-command   COMMAND Read the fully qualified domain name of this host from the output of COMMAND. Most often, this value is /bin/hostname -f. This value is only used to create an encrypted challenge during SMTP AUTH challenge-response protocols. This option is ignored if hostname or hostname-file are given.

If hostname-command is given multiple times, spamdyke will use the last value it finds.

If hostname, hostname-command and hostname-file are not given, spamdyke will search for the host's name in the environment or will use a default name.

hostname-command is not valid within configuration directories.

See SMTP AUTH for details.
hostname-file   FILE Read the fully qualified domain name of this host from the first line of FILE. This value is only used to create an encrypted challenge during SMTP AUTH challenge-response protocols. This option is ignored if hostname is given.

If hostname-file is given multiple times, spamdyke will use the last value it finds.

If hostname, hostname-command and hostname-file are not given, spamdyke will search for the host's name in the environment or will use a default name.

hostname-file is not valid within configuration directories.

See SMTP AUTH for details.
idle-timeout-secs T SECS Forcibly disconnect after SECS seconds of inactivity. A value of 0 disables this feature.

If idle-timeout-secs is given multiple times, spamdyke will use the last value it finds.

If idle-timeout-secs is not given, spamdyke will use a value of 0.

idle-timeout-secs is not valid within configuration directories.

See Timeouts for details.
ip-blacklist-entry   IPADDRESS Reject the connection if the remote server's IP address matches IPADDRESS.

If ip-blacklist-entry is given multiple times, spamdyke will check the remote server's IP address against each given IPADDRESS.

If ip-blacklist-entry and ip-blacklist-file are not given, spamdyke will not attempt to match the remote server's IP address against blacklist entries.

See Blacklists for details.
ip-blacklist-file B FILE Reject the connection if the remote server's IP address matches an entry in FILE. This option provides better performance than ip-blacklist-entry for more than a few entries.

If ip-blacklist-file is given multiple times, spamdyke will check the remote server's IP address against each entry in each given FILE.

If ip-blacklist-entry and ip-blacklist-file are not given, spamdyke will not attempt to match the remote server's IP address against blacklist entries.

See Blacklists for details.
ip-in-rdns-keyword-blacklist-entry   KEYWORD Search the remote server's rDNS name for its IP address and KEYWORD. If both are found, reject the connection.

If ip-in-rdns-keyword-blacklist-entry is given multiple times, spamdyke will search the remote server's rDNS name for its IP address and each given KEYWORD.

If ip-in-rdns-keyword-blacklist-entry and ip-in-rdns-keyword-blacklist-file are not given, spamdyke will not reject connections because the remote server's rDNS name contains its IP address.

See Reverse DNS for details.
ip-in-rdns-keyword-blacklist-file k FILE Search the remote server's rDNS name for its IP address and a keyword listed in FILE. If both are found, reject the connection. This option provides better performance than ip-in-rdns-keyword-whitelist-entry for more than a few entries.

If ip-in-rdns-keyword-blacklist-file is given multiple times, spamdyke will search the remote server's rDNS name for its IP address and each keyword listed in each given FILE.

If ip-in-rdns-keyword-blacklist-entry and ip-in-rdns-keyword-blacklist-file are not given, spamdyke will not reject connections because the remote server's rDNS name contains its IP address.

See Reverse DNS for details.
ip-in-rdns-keyword-whitelist-entry   KEYWORD Search the remote server's rDNS name for its IP address and KEYWORD. If both are found, bypass all filters.

If ip-in-rdns-keyword-whitelist-entry is given multiple times, spamdyke will search the remote server's rDNS name for its IP address and each given KEYWORD.

If ip-in-rdns-keyword-whitelist-entry and ip-in-rdns-keyword-whitelist-file are not given, spamdyke will not bypass all filters because the remote server's rDNS name contains its IP address.

See Reverse DNS for details.
ip-in-rdns-keyword-whitelist-file   FILE Search the remote server's rDNS name for its IP address and a keyword listed in FILE. If both are found, bypass all filters. This option provides better performance than ip-in-rdns-keyword-whitelist-entry for more than a few entries.

If ip-in-rdns-keyword-whitelist-file is given multiple times, spamdyke will search the remote server's rDNS name for its IP address and each keyword listed in each given FILE.

If ip-in-rdns-keyword-whitelist-entry and ip-in-rdns-keyword-whitelist-file are not given, spamdyke will not bypass all filters because the remote server's rDNS name contains its IP address.

See Reverse DNS for details.
ip-whitelist-entry   IPADDRESS If the remote server's IP address matches IPADDRESS, bypass all filters.

If ip-whitelist-entry is given multiple times, spamdyke will check the remote server's IP address against each given IPADDRESS.

If ip-whitelist-entry and ip-whitelist-file are not given, spamdyke will not attempt to match the remote server's IP address against whitelist entries.

See Whitelists for details.
ip-whitelist-file W FILE If the remote server's IP address matches an entry in FILE, bypass all filters. This option provides better performance than ip-whitelist-entry for more than a few entries.

If ip-whitelist-file is given multiple times, spamdyke will check the remote server's IP address against each entry in each given FILE.

If ip-whitelist-entry and ip-whitelist-file are not given, spamdyke will not attempt to match the remote server's IP address against whitelist entries.

See Whitelists for details.
local-domains-entry   DOMAIN Treat DOMAIN as a locally hosted domain (to determine if an email address is local or remote).

If local-domains-entry is given multiple times, spamdyke will consider each given DOMAIN to be local.

If local-domains-entry and local-domains-file are not given, spamdyke will disable all filters that depend on distinguishing between local and remote addresses.

local-domains-entry is not valid within configuration directories.

See Rejecting Senders and Recipients for details.
local-domains-file d FILE Search FILE for a list of locally hosted domains (to determine if an email address is local or remote). Most often, FILE is /var/qmail/control/rcpthosts.

If local-domains-file is given multiple times, spamdyke will consider each entry in each given FILE to be local.

If local-domains-entry and local-domains-file are not given, spamdyke will disable all filters that depend on distinguishing between local and remote addresses.

local-domains-file is not valid within configuration directories.

See Rejecting Senders and Recipients for details.
log-level l (lowercase ell) none, error, info, verbose, debug or excessive none: No logging.

error: Log errors only.

info: Everything from error plus connection messages.

verbose: Everything from info plus non-critical errors such as network errors caused by the remote host, protocol errors, config-test status messages and child process error messages.

debug: Everything from verbose plus high-level debugging messages to show the processing path within spamdyke.

excessive: Everything from debug plus low-level debugging messages to show data values and small status messages within spamdyke.

If log-level is given multiple times, spamdyke will use the last value it finds.

If log-level is not given, spamdyke will use a value of error.

log-level is not valid within configuration directories.

See Log Messages for details.
log-target   stderr or syslog stderr: Send log messages to standard error (stderr).

syslog: Send log messages to the system log file via syslogd.

If log-target is given multiple times, spamdyke will use a combination of the given values.

If log-target is not given, spamdyke will use a value of syslog.

log-target is not valid within configuration directories.

See Log Messages for details.
max-recipients a NUM Allow a maximum of NUM recipients per connection.

If max-recipients is given multiple times, spamdyke will use the last value it finds.

If max-recipients is not given, spamdyke will not limit the number of recipients.

max-recipients is not valid within configuration directories.

See Limiting Numbers of Recipients for details.
policy-url u URL Append URL to the rejection message to explain why the rejection occurred. NOTE: most servers hide rejection messages from their users and most users don't read bounce messages. Maximum 100 characters.

If policy-url is given multiple times, spamdyke will use the last value it finds.

If policy-url is not given, spamdyke will not append a URL to the rejection message.

See SMTP Error Codes for details.
rdns-blacklist-dir b DIR Reject the connection if the remote server's rDNS name matches a file in DIR. This option provides better performance than rdns-blacklist-file for large numbers of entries.

If rdns-blacklist-dir is given multiple times, spamdyke will search each DIR for files that match the remote server's rDNS name.

If rdns-blacklist-dir, rdns-blacklist-entry and rdns-blacklist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against blacklist entries.

See Blacklists for details.
rdns-blacklist-entry   DOMAIN Reject the connection if the remote server's rDNS name matches DOMAIN.

If rdns-blacklist-entry is given multiple times, spamdyke will attempt to match the remote server's rDNS name against each given DOMAIN.

If rdns-blacklist-dir, rdns-blacklist-entry and rdns-blacklist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against blacklist entries.

See Blacklists for details.
rdns-blacklist-file   FILE Reject the connection if the remote server's rDNS name matches an entry in FILE. This option provides better performance than rdns-blacklist-entry for more than a few entries.

If rdns-blacklist-file is given multiple times, spamdyke will search each given FILE for entries that match the remote server's rDNS name.

If rdns-blacklist-dir, rdns-blacklist-entry and rdns-blacklist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against blacklist entries.

See Blacklists for details.
rdns-whitelist-dir   DIR If the remote server's rDNS name matches a file in DIR, bypass all filters. This option provides better performance than rdns-whitelist-file for large numbers of entries.

If rdns-whitelist-dir is given multiple times, spamdyke will search each DIR for files that match the remote server's rDNS name.

If rdns-whitelist-dir, rdns-whitelist-entry and rdns-whitelist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against whitelist entries.

See Whitelists for details.
rdns-whitelist-entry   DOMAIN If the remote server's rDNS name matches DOMAIN, bypass all filters.

If rdns-whitelist-entry is given multiple times, spamdyke will attempt to match the remote server's rDNS name against each given DOMAIN.

If rdns-whitelist-dir, rdns-whitelist-entry and rdns-whitelist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against whitelist entries.

See Whitelists for details.
rdns-whitelist-file w FILE If the remote server's rDNS name matches an entry in FILE, bypass all filters. This option provides better performance than rdns-whitelist-entry for more than a few entries.

If rdns-whitelist-file is given multiple times, spamdyke will search each given FILE for entries that match the remote server's rDNS name.

If rdns-whitelist-dir, rdns-whitelist-entry and rdns-whitelist-file are not given, spamdyke will not attempt to match the remote server's rDNS name against whitelist entries.

See Whitelists for details.
recipient-blacklist-entry   ADDRESS Reject any recipient addresses that match ADDRESS.

If recipient-blacklist-entry is given multiple times, spamdyke will attempt to match each recipient address against each given ADDRESS.

If recipient-blacklist-entry and recipient-blacklist-file are not given, spamdyke will not attempt to match recipient addresses against blacklist entries.

See Rejecting Senders and Recipients for details.
recipient-blacklist-file S FILE Reject any recipient addresses that match entries in FILE. This option provides better performance than recipient-blacklist-entry for more than a few entries.

If recipient-blacklist-file is given multiple times, spamdyke will attempt to match each recipient address against each entry in each given FILE.

If recipient-blacklist-entry and recipient-blacklist-file are not given, spamdyke will not attempt to match recipient addresses against blacklist entries.

See Rejecting Senders and Recipients for details.
recipient-whitelist-entry   ADDRESS If the recipient's address matches ADDRESS, bypass all filters.

If recipient-whitelist-entry is given multiple times, spamdyke will attempt to match each recipient address against each given ADDRESS.

If recipient-whitelist-entry and recipient-whitelist-file are not given, spamdyke will not attempt to match recipient addresses against whitelist entries.

See Whitelisting Senders and Recipients for details.
recipient-whitelist-file   FILE If the recipient's email address matches an entry in FILE, bypass all filters. This option provides better performance than recipient-whitelist-entry for more than a few entries.

If recipient-whitelist-file is given multiple times, spamdyke will attempt to match each recipient address against each entry in each given FILE.

If recipient-whitelist-entry and recipient-whitelist-file are not given, spamdyke will not attempt to match recipient addresses against whitelist entries.

See Whitelisting Senders and Recipients for details.
reject-empty-rdns r optional:
0, 1, false, true, no or yes
Reject the connection if the remote server has no rDNS name.

If reject-empty-rdns is given multiple times, spamdyke will use the last value it finds.

If reject-empty-rdns is not given, spamdyke will not reject connections with missing rDNS names.

If reject-empty-rdns is given without an argument, spamdyke will use a value of yes.

See Reverse DNS for details.
reject-ip-in-cc-rdns c optional:
0, 1, false, true, no or yes
Search the remote server's rDNS name for its IP address and a two-letter country code. If both are found, reject the connection.

If reject-ip-in-cc-rdns is given multiple times, spamdyke will use the last value it finds.

If reject-ip-in-cc-rdns is not given, spamdyke will not reject connections from servers whose rDNS names contain their IP address and a country code.

If reject-ip-in-cc-rdns is given without an argument, spamdyke will use a value of yes.

See Reverse DNS for details.
reject-missing-sender-mx   optional:
0, 1, false, true, no or yes
Check the domain name of the sender's email address for a mail exchanger (an MX or an A record). If neither are found, reject the connection. Requires local-domains-entry or local-domains-file.

If reject-missing-sender-mx is given multiple times, spamdyke will use the last value it finds.

If reject-missing-sender-mx is not given, spamdyke will not reject connections from senders whose email domains do not have an MX record.

If reject-missing-sender-mx is given without an argument, spamdyke will use a value of yes.

See Rejecting Senders and Recipients for details.
reject-unresolvable-rdns R optional:
0, 1, false, true, no or yes
Reject the connection if the remote server's rDNS name does not resolve (search for an A record).

If reject-unresolvable-rdns is given multiple times, spamdyke will use the last value it finds.

If reject-unresolvable-rdns is not given, spamdyke will not reject connections from remote servers whose rDNS names do not resolve.

If reject-unresolvable-rdns is given without an argument, spamdyke will use a value of yes.

See Reverse DNS for details.
rejection-text-access-denied   TEXT Send TEXT to the client as an error message if the remote server is not allowed to send mail due to an entry in the access file.

If rejection-text-access-denied is given multiple times, spamdyke will use the last value it finds.

If rejection-text-access-denied is not given, spamdyke will use the text Refused. Access is denied.

See SMTP Error Codes for details.
rejection-text-auth-failure   TEXT Send TEXT to the client as an error message if authentication fails for any reason.

If rejection-text-auth-failure is given multiple times, spamdyke will use the last value it finds.

If rejection-text-auth-failure is not given, spamdyke will use the text Refused. Authentication failed.

rejection-text-auth-failure is not valid within configuration directories.

See SMTP Error Codes for details.
rejection-text-auth-unknown   TEXT Send TEXT to the client as an error message if the remote server attempts to authenticate using an unsupported authentication method. This should never happen.

If rejection-text-auth-unknown is given multiple times, spamdyke will use the last value it finds.

If rejection-text-auth-unknown is not given, spamdyke will use the text Refused. Unknown authentication method.

rejection-text-auth-unknown is not valid within configuration directories.

See SMTP Error Codes for details.
rejection-text-dns-blacklist   TEXT Send TEXT to the client as an error message if the remote server's IP address is found on a DNS blacklist (RBL). The name of the matching RBL will be appended to TEXT. Note: this flag has no effect if the RBL returns a text message; that text will be used instead.

If rejection-text-dns-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-dns-blacklist is not given, spamdyke will use the text Refused. Your IP address is listed in the DNS RBL at

See SMTP Error Codes for details.
rejection-text-earlytalker   TEXT Send TEXT to the client as an error message if the remote server sends data before the SMTP greeting banner is displayed.

If rejection-text-earlytalker is given multiple times, spamdyke will use the last value it finds.

If rejection-text-earlytalker is not given, spamdyke will use the text Refused. You are not following the SMTP protocol.

See SMTP Error Codes for details.
rejection-text-empty-rdns   TEXT Send TEXT to the client as an error message if the remote server has no rDNS name.

If rejection-text-empty-rdns is given multiple times, spamdyke will use the last value it finds.

If rejection-text-empty-rdns is not given, spamdyke will use the text Refused. You have no reverse DNS entry.

See SMTP Error Codes for details.
rejection-text-graylist   TEXT Send TEXT to the client as an error message if the recipient address has been graylisted.

If rejection-text-graylist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-graylist is not given, spamdyke will use the text Your address has been graylisted. Try again later.

See SMTP Error Codes for details.
rejection-text-ip-blacklist   TEXT Send TEXT to the client as an error message if the remote server's IP address is found in an IP blacklist file or matches an IP blacklist entry.

If rejection-text-ip-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-ip-blacklist is not given, spamdyke will use the text Refused. Your IP address is blacklisted.

See SMTP Error Codes for details.
rejection-text-ip-in-cc-rdns   TEXT Send TEXT to the client as an error message if the remote server's rDNS name contains the remote server's IP address and ends in a two-character country code.

If rejection-text-ip-in-cc-rdns is given multiple times, spamdyke will use the last value it finds.

If rejection-text-ip-in-cc-rdns is not given, spamdyke will use the text Refused. Your reverse DNS entry contains your IP address and a country code.

See SMTP Error Codes for details.
rejection-text-ip-in-rdns-keyword-blacklist   TEXT Send TEXT to the client as an error message if the remote server's rDNS name contains the remote server's IP address and a banned keyword.

If rejection-text-ip-in-rdns-keyword-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-ip-in-rdns-keyword-blacklist is not given, spamdyke will use the text Refused. Your reverse DNS entry contains your IP address and a banned keyword.

See SMTP Error Codes for details.
rejection-text-local-recipient   TEXT Send TEXT to the client as an error message if the specified recipient does not include a domain name.

If rejection-text-local-recipient is given multiple times, spamdyke will use the last value it finds.

If rejection-text-local-recipient is not given, spamdyke will use the text Improper recipient address. Try supplying a domain name.

See SMTP Error Codes for details.
rejection-text-max-recipients   TEXT Send TEXT to the client as an error message if the remote server gives too many recipient addresses.

If rejection-text-max-recipients is given multiple times, spamdyke will use the last value it finds.

If rejection-text-max-recipients is not given, spamdyke will use the text Too many recipients. Try the remaining addresses again later.

See SMTP Error Codes for details.
rejection-text-missing-sender-mx   TEXT Send TEXT to the client as an error message if the sender's domain name does not have a DNS entry for a mail exchanger (MX).

If rejection-text-missing-sender-mx is given multiple times, spamdyke will use the last value it finds.

If rejection-text-missing-sender-mx is not given, spamdyke will use the text Refused. The domain of your sender address has no mail exchanger (MX).

See SMTP Error Codes for details.
rejection-text-rdns-blacklist   TEXT Send TEXT to the client as an error message if the remote server's rDNS name is found in a blacklist file or matches a blacklist entry.

If rejection-text-rdns-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-rdns-blacklist is not given, spamdyke will use the text Refused. Your domain name is blacklisted.

See SMTP Error Codes for details.
rejection-text-recipient-blacklist   TEXT Send TEXT to the client as an error message if the recipient address is blacklisted.

If rejection-text-recipient-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-recipient-blacklist is not given, spamdyke will use the text Refused. Mail is not being accepted at this address.

See SMTP Error Codes for details.
rejection-text-reject-all   TEXT Send TEXT to the client as an error message if all mail is being rejected.

If rejection-text-reject-all is given multiple times, spamdyke will use the last value it finds.

If rejection-text-reject-all is not given, spamdyke will use the text Refused. Mail is not being accepted.

See SMTP Error Codes for details.
rejection-text-relaying-denied   TEXT Send TEXT to the client as an error message if the recipient is not local and the remote server is not allowed relay.

If rejection-text-relaying-denied is given multiple times, spamdyke will use the last value it finds.

If rejection-text-relaying-denied is not given, spamdyke will use the text Refused. Sending to remote addresses (relaying) is not allowed.

See SMTP Error Codes for details.
rejection-text-rhs-blacklist   TEXT Send TEXT to the client as an error message if the remote server's rDNS name or the sender's domain name are found on a right-hand side blacklist (RHSBL). The name of the matching RHSBL will be appended to TEXT. Note: this flag has no effect if the RHSBL returns a text message; that text will be used instead.

If rejection-text-rhs-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-rhs-blacklist is not given, spamdyke will use the text Refused. Your domain name is listed in the RHSBL at

See SMTP Error Codes for details.
rejection-text-sender-blacklist   TEXT Send TEXT to the client as an error message if the sender's email address is blacklisted.

If rejection-text-sender-blacklist is given multiple times, spamdyke will use the last value it finds.

If rejection-text-sender-blacklist is not given, spamdyke will use the text Refused. Your sender address has been blacklisted.

See SMTP Error Codes for details.
rejection-text-smtp-auth-required   TEXT Send TEXT to the client as an error message if authentication is required to send email and the remote server has not authenticated.

If rejection-text-smtp-auth-required is given multiple times, spamdyke will use the last value it finds.

If rejection-text-smtp-auth-required is not given, spamdyke will use the text Refused. Authentication is required to send mail.

See SMTP Error Codes for details.
rejection-text-timeout   TEXT Send TEXT to the client as an error message if the connection times out.

If rejection-text-text-timeout is given multiple times, spamdyke will use the last value it finds.

If rejection-text-text-timeout is not given, spamdyke will use the text Timeout. Talk faster next time.

rejection-text-timeout is not valid within configuration directories.

See SMTP Error Codes for details.
rejection-text-tls-failure   TEXT Send TEXT to the client as an error message if a SSL/TLS session cannot be started with the remote server.

If rejection-text-text-tls-failure is given multiple times, spamdyke will use the last value it finds.

If rejection-text-text-tls-failure is not given, spamdyke will use the text Failed to negotiate TLS connection.

rejection-text-tls-failure is not valid within configuration directories.

See SMTP Error Codes for details.
rejection-text-unresolvable-rdns   TEXT Send TEXT to the client as an error message if the remote server's rDNS name does not resolve.

If rejection-text-unresolvable-rdns is given multiple times, spamdyke will use the last value it finds.

If rejection-text-unresolvable-rdns is not given, spamdyke will use the text Refused. Your reverse DNS entry does not resolve.

See SMTP Error Codes for details.
rejection-text-zero-recipients   TEXT Send TEXT to the client as an error message if none of the recipients given by the remote server are accepted.

If rejection-text-zero-recipients is given multiple times, spamdyke will use the last value it finds.

If rejection-text-zero-recipients is not given, spamdyke will use the text Refused. You must specify at least one valid recipient.

rejection-text-zero-recipients is not valid within configuration directories.

See SMTP Error Codes for details.
relay-level   block-all, no-check, normal or allow-all block-all: Block all relaying attempts, even if the sender has authenticated or the access file or an environment variable should allow relaying. Messages to local recipients will still be accepted. Requires local-domains-entry or local-domains-file and access-file.

no-check: Do not prevent relaying; allow qmail (or another filter) to prevent relaying as appropriate.

normal: Prevent relaying unless the sender authenticates, the access file allows relaying or an environment variable allows relaying. Requires local-domains-entry or local-domains-file and access-file.

allow-all: Allow relaying from all senders. Note: This creates an open relay and is not recommended.

If relay-level is given multiple times, spamdyke will use the last value it finds.

If relay-level is not given, spamdyke will use a value of normal.

relay-level is not valid within configuration directories.

See Relaying for details.
rhs-blacklist-entry X RHSBL Check the remote server's rDNS name and the sender email address' domain name against the right hand-side blackhole list RHSBL. If it is found, the connection is rejected. NOTE: Using more than a few RHS blacklists can cause serious performance problems.

If rhs-blacklist-entry is given multiple times, spamdyke will check each given RHSBL for the remote server's rDNS name and the sender's email address domain name.

If rhs-blacklist-entry and rhs-blacklist-file are not given, spamdyke will not check any blackhole lists for the remote server's rDNS name and the sender's email address domain name.

See DNS RHSBLs for details.
rhs-blacklist-file   FILE Check the remote server's domain name and the sender email address' domain name against each of the right hand-side blackhole lists listed in FILE. If it is found on any of the lists, the connection is rejected. NOTE: Using more than a few RHS blacklists can cause serious performance problems.

If rhs-blacklist-file is given multiple times, spamdyke will check each blackhole list listed in each given FILE for the remote server's rDNS name and the sender's email address domain name.

If rhs-blacklist-file and rhs-blacklist-file are not given, spamdyke will not check any blackhole lists for the remote server's rDNS name and the sender's email address domain name.

See DNS RHSBLs for details.
rhs-whitelist-entry   RHSWHITELIST Check the remote server's domain name and the sender email address' domain name against the right hand-side whitelist RHSWHITELIST (essentially an RHSBL that contains whitelisted domains). If it is found, all filters are bypassed. NOTE: Using more than a few RHS whitelists can cause serious performance problems.

If rhs-whitelist-entry is given multiple times, spamdyke will check each given RHSWHITELIST for the remote server's rDNS name and the sender's email address domain name.

If rhs-whitelist-entry and rhs-whitelist-file are not given, spamdyke will not check any whitelists for the remote server's rDNS name and the sender's email address domain name.

See DNS Whitelists for details.
rhs-whitelist-file   FILE Check the remote server's domain name and the sender email address' domain name against each of the right hand-side whitelists (essentially an RHSBL that contains whitelisted domains) listed in FILE. If it is found on any of the lists, all filters are bypassed. NOTE: Using more than a few RHS whitelists can cause serious performance problems.

If rhs-whitelist-file is given multiple times, spamdyke will check each whitelist listed in each given FILE for the remote server's rDNS name and the sender's email address domain name.

If rhs-whitelist-file and rhs-whitelist-file are not given, spamdyke will not check any whitelist for the remote server's rDNS name and the sender's email address domain name.

See DNS Whitelists for details.
run-as-user   USER[:GROUP] As soon as possible, change the running user identity to the user with the username or ID USER. If GROUP is provided, also change the group identity to the system group with the name GROUP or ID GROUP. This feature requires spamdyke to be started as a user with the ability to switch identities (typically the superuser).

If run-as-user is given multiple times, spamdyke will use the last value it finds.

If run-as-user is not given, spamdyke will not attempt to switch user identities.

run-as-user is not valid within configuration directories.

See Permissions for details.
sender-blacklist-entry   ADDRESS Reject the connection if the sender's email address matches ADDRESS.

If sender-blacklist-entry is given multiple times, spamdyke will reject the connection if the sender's email address matches any of the given ADDRESS values.

If sender-blacklist-entry and sender-blacklist-file are not given, spamdyke will not blacklist any sender email addresses.

See Rejecting Senders and Recipients for details.
sender-blacklist-file s FILE Reject the connection if the sender's email address matches an entry in FILE. This option provides better performance than sender-blacklist-entry for more than a few entries.

If sender-blacklist-file is given multiple times, spamdyke will reject the connection if the sender's email address matches any of the entries in each given FILE.

If sender-blacklist-entry and sender-blacklist-file are not given, spamdyke will not blacklist any sender email addresses.

See Rejecting Senders and Recipients for details.
sender-whitelist-entry   ADDRESS If the sender's email address matches ADDRESS, bypass all filters.

If sender-whitelist-entry is given multiple times, spamdyke will compare the sender's email address to each given ADDRESS.

If sender-whitelist-entry and sender-whitelist-file are not given, spamdyke will not whitelist any sender email addresses.

See Whitelisting Senders and Recipients for details.
sender-whitelist-file   FILE If the sender's email address matches an entry in FILE, bypass all filters. This option provides better performance than sender-whitelist-entry for more than a few entries.

If sender-whitelist-file is given multiple times, spamdyke will compare the sender's email address to each entry in each given FILE.

If sender-whitelist-entry and sender-whitelist-file are not given, spamdyke will not whitelist any sender email addresses.

See Whitelisting Senders and Recipients for details.
smtp-auth-command   COMMAND Perform SMTP AUTH verification using COMMAND. If the authentication is valid, all filters will be bypassed. This option may have no effect, depending on the value of smtp-auth-level.

If smtp-auth-command is given multiple times, spamdyke will authenticate using each given COMMAND until one of them indicates success.

If smtp-auth-command is not given, spamdyke will not process authentication. Depending on the value of smtp-auth-level, authentication may still be possible.

smtp-auth-command is not valid within configuration directories.

See SMTP AUTH for details.
smtp-auth-level   none, observe, ondemand, ondemand-encrypted, always or always-encrypted none: Do not offer or allow authentication, even if qmail has been patched to provide it.

observe: Observe authentication only (and trust qmail's responses), do not offer it. This value has no effect if qmail has not been patched to offer authentication.

ondemand: If qmail offers authentication, observe any authentication attempts and trust qmail's responses. If qmail does not offer authentication, spamdyke will offer cleartext authentication, then process it using the value of smtp-auth-command.

ondemand-encrypted: If qmail offers authentication, observe any authentication attempts and trust qmail's responses. If qmail does not offer authentication, spamdyke will offer cleartext and encrypted authentication, then process it using the value of smtp-auth-command.

always: Always offer cleartext authentication, then process it using the value of smtp-auth-command. If qmail attempts to offer authentication, spamdyke will hide qmail's offer and prevent the authentication data from reaching qmail.

always-encrypted: Always offer cleartext and encrypted authentication, then process it using the value of smtp-auth-command. If qmail attempts to offer authentication, spamdyke will hide qmail's offer and prevent the authentication data from reaching qmail.

If smtp-auth-level is given multiple times, spamdyke will use the last value it finds.

If smtp-auth-level is not given, spamdyke will use a value of observe.

smtp-auth-level is not valid within configuration directories.

See SMTP AUTH for details.
tls-certificate-file   FILE Decrypt SSL/TLS traffic using the SSL certificate in FILE. The certificate must be in PEM format. If FILE does not also contain the private key, tls-privatekey-file must be used. This option has no effect unless tls-level is also given.

If tls-certificate-file is given multiple times, spamdyke will use the last value it finds.

If tls-certificate-file is not given, spamdyke will not decrypt SSL/TLS traffic. The encrypted traffic will be passed through to qmail.

tls-certificate-file is not valid within configuration directories.

See TLS for details.
tls-level   none, smtp or smtps none: Do not offer or allow SSL/TLS, even if qmail supports it.

smtp: If tls-certificate-file is given, offer TLS during the SMTP conversation and decrypt the traffic. If tls-certificate-file is not given, allow qmail to offer TLS (if it has been patched to provide TLS) and pass the encrypted traffic to qmail.

smtps: Initiate a SSL session at the beginning of the connection, before SMTP begins.

If tls-level is given multiple times, spamdyke will use the last value it finds.

If tls-level is not given, spamdyke will use a value of smtp.

tls-level is not valid within configuration directories.

See TLS for details.
tls-privatekey-file   FILE Read the private key for the SSL certificate (given with tls-certificate-file) from FILE. FILE must be in PEM format. Requires tls-certificate-file.

If tls-privatekey-file is given multiple times, spamdyke will use the last value it finds.

If tls-privatekey-file is not given, spamdyke will look for the private key in the certificate file.

tls-privatekey-file is not valid within configuration directories.

See TLS for details.
tls-privatekey-password   PASSWORD Use PASSWORD to decrypt the SSL private key (given with tls-certificate-file or tls-privatekey-file), if necessary. NOTE: this option reveals the password in the process list! Requires tls-certificate-file and/or tls-privatekey-file.

If tls-privatekey-password is given multiple times, spamdyke will use the last value it finds.

If tls-privatekey-password and tls-privatekey-password-file are not given, spamdyke will attempt to load the private key without a password.

tls-privatekey-password is not valid within configuration directories.

See TLS for details.
tls-privatekey-password-file   FILE Read the password to decrypt the private key for the SSL certificate (from tls-certificate-file) from the first line of FILE, if necessary. Requires tls-certificate-file and/or tls-password-file.

If tls-privatekey-password-file is given multiple times, spamdyke will use the last value it finds.

If tls-privatekey-password and tls-privatekey-password-file are not given, spamdyke will attempt to load the private key without a password.

tls-privatekey-password-file is not valid within configuration directories.

See TLS for details.

Configuration Files

config-file

The configuration file format is very simple. Each line should use the following format:

OPTION=VALUE
OPTION is the long version of a spamdyke option. See Usage for details.

VALUE is the parameter for the option. Note: While multi-word values must be quoted on the command line, quotes are not allowed in configuration files. spamdyke reads the entire VALUE after the equals sign, even if it contains spaces, so no quoting is needed.

Blank lines and lines beginning with # are ignored.

For example:

smtp-auth-command=/home/vpopmail/bin/vchkpw /bin/true
rdns-blacklist-dir=/home/vpopmail/blacklist_rdns.d
graylist-dir=/home/vpopmail/graylist.d
check-dnsrbl=dul.dnsbl.sorbs.net
check-dnsrbl=zombie.dnsbl.sorbs.net
max-recipients=5
True/false options can be given without a VALUE to activate them. yes, true and 1 are also acceptable. The options can also be explicitly deactivated with no, false or 0 (or the option can be simply removed). For example, the following lines all have the same effect:
reject-empty-rdns
reject-empty-rdns=yes
reject-empty-rdns=true
reject-empty-rdns=1
A configuration file is utilized by passing the command line option config-file to spamdyke:
spamdyke --config-file /etc/spamdyke.conf ...
The config-file option can also be used within configuration files to include other configuration files if desired. When configuration files are in use, options may still be provided on the command line as well, in any combination. If contradictory options are found, the option in the configuration file will be used. For example, if the following command line were used:
spamdyke --reject-empty-rdns --config-file /etc/spamdyke.conf ...
And /etc/spamdyke.conf contained the following line:
reject-empty-rdns=false
spamdyke would deactivate the reject-empty-rdns filter because the configuration file is read after the command line has been scanned. This can be confusing, so the best practice is to avoid specifying the same option in multiple places without good reason.

Some options can be given multiple times and spamdyke will use all of the values it finds. For example, if the following lines are given, spamdyke will search each of the files for a match to the sender's email address:

sender-blacklist-file=/home/vpopmail/sender_blacklist.txt
sender-blacklist-file=/home/vpopmail/more_sender_blacklist.txt
sender-blacklist-file=/home/vpopmail/additional_sender_blacklist.txt
However, in some situations, it may be necessary to remove one or all of the values. Most commonly, this occurs when the values are set in a global configuration file and are unset in a configuration directory. To remove one specific value from a list, the value should be specified with an exclamation point preceeding the value:
OPTION=!VALUE
For example:
sender-blacklist-file=!/home/vpopmail/sender_blacklist.txt
If the given value was not previously set, no action will be taken.

To clear all values from a list, three exclamation points should be given instead of a value:

OPTION=!!!
For example, if the following line is given, the sender-blacklist-file option will be cleared and spamdyke will behave as though sender-blacklist-file had never appeared:
sender-blacklist-file=!!!

Note: spamdyke processes configuration directives in the order they are read. If an option is cleared and later set again, the option will retain the last value. For example, if the following five lines appear in this order:

sender-blacklist-file=/home/vpopmail/sender_blacklist.txt
sender-blacklist-file=/home/vpopmail/more_sender_blacklist.txt
sender-blacklist-file=/home/vpopmail/additional_sender_blacklist.txt
sender-blacklist-file=!!!
sender-blacklist-file=/home/vpopmail/last_blacklist.txt
spamdyke will set the first three values, clear them, then set the last value. When the sender blacklist filter runs, it will search the file /home/vpopmail/last_blacklist.txt.

NOTE: It may seem that scanning a configuration file instead of the command line would impose a performance penalty each time spamdyke is started. However, the reverse seems to be true. Some rudimentary testing has indicated the configuration files are actually faster. This is likely due to inefficiencies in GNU's getopt_long() function.

Configuration Directories

config-dir
config-dir-search

Configuration directories allow spamdyke's behavior to be altered based on the remote server's IP address, the remote server's rDNS name, the sender's email address, the recipient's email address or any combination of those things. This can be very useful when, for example, graylisting should be deactivated for a specific sender. IP addresses can be whitelisted for specific recipients without whitelisting them for everyone. The possibilities are nearly endless.

NOTE: Configuration directories are confusing and complicated. Unless you really need the advanced configuration scenarios they offer, don't use them.

Configuration directories are given with the config-dir option. The option's value should be the path to the directory that contains the subdirectories explained below. If config-dir is given multiple times, spamdyke will search each given directory structure and load all of the matching files before it continues processing the SMTP connection.

In essence, a configuration directory is a special directory structure that contains configuration files. spamdyke determines which files to load based on the names of the directories and the details of the SMTP connection. Not all options are valid within configuration directories, but in all other respects the files follow the same rules as global configuration files. See Usage for details of which options are valid within configuration directories. See Configuration Files for details of the configuration file format.

When spamdyke loads a file from a configuration directory, it will do so because the names of the directories and the name of the file match all or part of the information from the SMTP connection. The last piece of information should always be used as the name of the file, not the name of a directory.

To create a file using the IP address of the remote server, first create a directory structure that begins with _ip_ and uses the first three octets of the address as directory names. For example, if the IP address is 11.22.33.44, the directory structure should look like this:

.../_ip_/11/22/33
Use the fourth octet as the name of the configuration file. For example:
.../_ip_/11/22/33/44

To create a file using the rDNS name of the remote server, first create a directory structure that begins with _rdns_ and contains directories named using the rDNS name with its words reversed. For example, if the rDNS name is mail.internal.headquarters.example.com, the directory structure should look like this:

.../_rdns_/com/example/headquarters/internal
The last word of the rDNS name is used as the name of the configuration file. For example:
.../_rdns_/com/example/headquarters/internal/mail

To create a file using the sender's email address, first create a directory structure that begins with _sender_ and contains directories using the domain portion of the sender's email address with its words reversed and ending in _at_. For example, if the sender's email address is mom@home.example.com, the directory structure should look like this:

.../_sender_/com/example/home/_at_
The sender's username is used as the name of the configuration file. For example:
.../_sender_/com/example/home/_at_/mom

To create a file using the recipient's email address, first create a directory structure that begins with _recipient_ and contains directories using the domain portion of the recipient's email address with its words reversed and ending in _at_. For example, if the recipient's email address is kid@school.example.com, the directory structure should look like this:

.../_recipient_/com/example/school/_at_
The recipient's username is used as the name of the configuration file. For example:
.../_recipient_/com/example/school/_at_/kid
spamdyke will match partial IP addresses, rDNS names, sender email addresses or recipient email addresses left-most portions of the directory structure are omitted. Note: spamdyke will never read a configuration file named _at_. If the sender's or recipient's username are omitted, the _at_ directory must be omitted as well. For example, if the IP address is 11.22.33.44, the rDNS name is mail.internal.headquarters.example.com, the sender's email address is mom@home.example.com and the recipient's email address is kid@school.example.com, spamdyke will look for configuration files with the following paths:
.../_ip_/11/22/33/44
.../_ip_/11/22/33
.../_ip_/11/22
.../_ip_/11
.../_rdns_/com/example/headquarters/internal/mail
.../_rdns_/com/example/headquarters/internal
.../_rdns_/com/example/headquarters
.../_rdns_/com/example
.../_rdns_/com
.../_recipient_/com/example/school/_at_/kid
.../_recipient_/com/example/school
.../_recipient_/com/example
.../_recipient_/com
.../_sender_/com/example/home/_at_/mom
.../_sender_/com/example/home
.../_sender_/com/example
.../_sender_/com

Configuration directories can be nested to create more specific targets. For example, if the IP address of the remote server is 11.22.33.44 and the sender's email address is mom@home.example.com, spamdyke will read a configuration file if its path is either of the following:

.../_ip_/11/22/33/44/_sender_/com/example/home/_at_/mom
.../_sender_/com/example/home/_at_/mom/_ip_/11/22/33/44
If only portions of the IP address or sender address are used, the possible list of file paths increases dramatically:
.../_ip_/11/22/33/44/_sender_/com/example/home
.../_ip_/11/22/33/44/_sender_/com/example
.../_ip_/11/22/33/44/_sender_/com
.../_ip_/11/22/33/_sender_/com/example/home/_at_/mom
.../_ip_/11/22/_sender_/com/example/home/_at_/mom
.../_ip_/11/_sender_/com/example/home/_at_/mom
.../_sender_/com/example/home/_ip_/11/22/33
.../_sender_/com/example/_ip_/11/22
.../_sender_/com/_ip_/11
spamdyke will check for every possible combination of partial paths (not all permutations are listed here). rDNS name directories and recipient directories can also be nested to create configuration files that will only be loaded if all four pieces of information match.

If all of that isn't confusing enough, spamdyke will only read one file from a _ip_, _rdns_, _sender_ or _recipient_ directory, even if more matches are possible. For example, if the remote IP address is 11.22.33.44, the sender's email address is mom@home.example.com and the recipient's email address is kid@school.example.com and two files exist with the following paths:

.../_ip_/11/22/33/44/_sender_/com/example/home/_at_/mom
.../_ip_/11/22/33/44/_recipient_/com/example/school/_at_/kid
spamdyke will only read one of the files because the _ip_ directory cannot be matched more than once. This behavior can be changed with the config-dir-search option.

config-dir-search can be given multiple times; the values will be added together to create a composite value. The possible values are:

  • first: Match each _ip_, _rdns_, _sender_ or _recipient directory only once. NOTE: The first value erases the composite value created from the other possible values, essentially "resetting" the config-dir-search option.
  • all-ip: Match each _ip_ directory as many times as possible.
  • all-rdns: Match each _rdns_ directory as many times as possible.
  • all-sender: Match each _sender_ directory as many times as possible.
  • all-recipient: Match each _recipient_ directory as many times as possible.

To aid with troubleshooting, spamdyke will log the paths it searches if the log-level option is debug or higher.

Configuration Tests

config-test
config-test-smtpauth-username
config-test-smtpauth-password

spamdyke has the ability to scan its configuration and look for common configuration mistakes. It checks file paths, permissions, graylist folders, directory structures, SMTP AUTH commands, TLS certificates and more. This feature was inspired by Apache's ability to check its configuration file for syntax errors.

To use the testing feature:

  1. Find and copy the entire spamdyke command line from your "supervise" script or xinetd configuration file, including the qmail command(s).
  2. At a command prompt, login as root and paste the spamdyke command without running it.
  3. Add the option --config-test among the spamdyke options (before the qmail command). If appropriate, add the options --config-test-smtpauth-username and --config-test-smtpauth-password.
  4. Run the command and carefully read the results. More output can be obtained by increasing the logging level (no test output goes to syslog).
If the run-as-user option is not given in your spamdyke configuration, it should be used on the command line to give spamdyke the name (or user ID) of the account used to run the mail server. The group name (or ID) can also be given. Before spamdyke runs its configuration tests, it will change process ownership to run as the given user. That way, the filesystem permissions tests will be accurate.

If spamdyke is configured to provide SMTP AUTH (using the smtp-auth-level and smtp-auth-command options), the --config-test-smtpauth-username and --config-test-smtpauth-password options should be used to provide a valid username and password for authentication. spamdyke will run the SMTP AUTH command to test its capabilities and make recommendations.

IMPORTANT! DANGER! WARNING! DO NOT EVER PUT THE --config-test OPTION IN THE SPAMDYKE COMMAND LINE THAT IS RUN FOR INCOMING CONNECTIONS! YOUR MAIL SERVER WILL IMMEDIATELY STOP RECEIVING MAIL AND REMOTE USERS WILL SEE ONLY THE DIAGNOSTIC OUTPUT! If you make this mistake and ask for help, expect to be publicly mocked. You have been warned.

Log Messages

log-level
log-target

The log-target option controls where spamdyke logs its messages. By default, log-target is set to syslog, which sends log messages to the system syslog facility. When log-target is set to stderr, messages are sent to standard error (stderr) instead. For most qmail installations, this will cause spamdyke's messages to be logged by the "multilog" program, along with qmail-smtpd's output. If log-target is given multiple times with different values, spamdyke will sends its output to each given target.

When spamdyke logs to syslog, it uses the LOG_MAIL facility, which typically puts the messages in /var/log/maillog. (Note: Plesk reconfigures syslog to put the messages in /usr/local/psa/var/log/maillog.)

Regardless of how the messages are logged, errors are always be preceded by the text ERROR: and are fairly self-explanatory. Whenever possible, spamdyke will recover from an error and continue processing mail. Philosophically, it's better to continue receiving spam than to block all mail.

The log-level option controls how much logging takes place. The following values are supported:

  • none: No logging at all, even if errors occur. This is not recommended.
  • error: Critical errors only, including authentication failures. This is the default when log-level is not given.
  • info: Everything from error plus logging of messages (sender, recipient, IP address, rDNS name and authenticated username). This is the value used when log-level is given with no value.
  • verbose: Everything from info plus non-critical errors such as network errors caused by the remote host, protocol errors, config-test status messages and child process error messages. At this level, spamdyke will also print messages to show which filter blocked the connection (if applicable) and some details about the filter's settings. These messages will be prefixed with FILTER:.
  • debug: Everything from verbose plus high-level debugging messages, intended to show the processing path within spamdyke. This level is handy for troubleshooting but it can be rather noisy. Extra messages generated by this level will be prefixed with DEBUG(): and will show the file and line number within the spamdyke source code where the message was produced. NOTE: If the configure script is run with the --without-debug-output option, spamdyke will accept the debug value but it will not print any more output than if verbose were used.
  • excessive: Everything from debug plus lots of internal status messages. This value should only be used for development. Extra messages generated by this level will be prefixed with EXCESSIVE(): and will show the file and line number within the spamdyke source code where the message was produced. NOTE: Unless the configure script is run with the --with-excessive-output option, spamdyke will not produce any more output for excessive than if debug were used.
Note that log-level must be used with care on the command line. Specifically, when --log-level is used, the value must be separated by an equals sign and no spaces. When -l is used, the value must not be separated by spaces or anything else. For example, the following two command lines will work:
/usr/local/bin/spamdyke --log-level=verbose ...
/usr/local/bin/spamdyke -lverbose ...
The log-level option may also be given with no value at all, which is the same as specifiying info. The following two command lines are also valid:
/usr/local/bin/spamdyke --log-level ...
/usr/local/bin/spamdyke -l ...

Each message log entry (produced when the value of log-level is info or higher) takes the following form (error messages and debugging statements are text preceeded by ERROR:, FILTER:, DEBUG: or EXCESSIVE:):

CODE from: SENDER to: RECIPIENT origin_ip: IPADDRESS origin_rdns: RDNSNAME auth: USERNAME [ reason: REALCODE ]
This format makes the logs very easy to parse from other scripts for monitoring and graphing.

The possible values of CODE are listed below:

CODE Description Related Option(s)
ALLOWED The message passed all filters. qmail may still bounce the message for other reasons, however.  
ALLOWED_AUTHENTICATED The remote client successfully authenticated using SMTP AUTH with spamdyke. If qmail is patched to provide SMTP AUTH, this code will never be used.  
ALLOWED_TLS The remote client successfully started a TLS session with spamdyke.  
DENIED_ACCESS_DENIED The connection was blocked because the remote server's IP address or rDNS name was found in the access file with a deny command. access-file
DENIED_AUTH_REQUIRED The message was blocked because the remote server has not authenticated, which is required. filter-level
DENIED_BLACKLIST_IP The connection was blocked because the remote server's IP address is blacklisted. ip-blacklist-entry
ip-blacklist-file
DENIED_BLACKLIST_NAME The connection was blocked because the remote server's rDNS name is blacklisted. rdns-blacklist-entry
rdns-blacklist-file
rdns-blacklist-dir
DENIED_EARLYTALKER The connection was blocked because the remote server began sending data before the SMTP greeting was issued. greeting-delay-secs
DENIED_GRAYLISTED The recipient was blocked because the sender/recipient combination was graylisted. The SMTP connection continues after this error occurs. graylist-level
DENIED_IP_IN_CC_RDNS The connection was blocked because the remote server's IP address was found in the remote server's rDNS name and the remote server's rDNS name ends in a country code. reject-ip-in-cc-rdns
DENIED_IP_IN_RDNS The connection was blocked because the remote server's IP address was found in the remote server's rDNS name and a prohibited keyword was found in the remote server's rDNS name. ip-in-rdns-keyword-blacklist-entry
ip-in-rdns-keyword-blacklist-file
DENIED_OTHER The connection was rejected by qmail (or another downstream filter), not spamdyke.  
DENIED_RBL_MATCH The connection was blocked because the remote server's IP address was found on a DNS RBL. dns-blacklist-entry
dns-blacklist-file
DENIED_RDNS_MISSING The connection was blocked because the remote server has no rDNS name at all. reject-empty-rdns
DENIED_RDNS_RESOLVE The connection was blocked because the remote server's rDNS name does not resolve. reject-unresolvable-rdns
DENIED_RHSBL_MATCH The connection was blocked because the remote server's reverse DNS name was found on a right hand-side DNS blacklist (RHSBL) OR because the sender's domain name was found on a right hand-side DNS blacklist (RHSBL). rhs-blacklist-entry
rhs-blacklist-file
DENIED_RECIPIENT_BLACKLISTED The recipient was blocked because the recipient email address is blacklisted. recipient-blacklist-entry
recipient-blacklist-file
DENIED_REJECT_ALL The message was blocked because all mail is being rejected. filter-level
DENIED_RELAYING The recipient was blocked because the recipient's domain is not locally hosted and the remote server is not allowed to relay. relay-level
DENIED_SENDER_BLACKLISTED The connection was blocked because the sender's email address is blacklisted. sender-blacklist-entry
sender-blacklist-file
DENIED_SENDER_NO_MX The connection was blocked because the sender's domain has no mail exchanger, making the sender address invalid. reject-missing-sender-mx
DENIED_TOO_MANY_RECIPIENTS The recipient was blocked because the limit was reached for this connection. The SMTP connection continues after this error occurs. max-recipients
DENIED_UNQUALIFIED_RECIPIENT The recipient was blocked because the address had no domain name. The SMTP connection continues after this error occurs.  
DENIED_ZERO_RECIPIENTS The message was blocked because no valid recipients have been specified.  
FAILED_AUTH The remote server attempted to authenticate but the given username and/or password were incorrect. smtp-auth-level
FAILED_TLS The remote client attempted to start a TLS session but SSL negotiation failed.  
TIMEOUT The connection timed out, either in total time or idle time. If the connection was already being blocked for another reason, the code for that error is given as REALCODE. connection-timeout-secs
idle-timeout-secs
TLS_ENCRYPTED The remote server has started a TLS session with qmail. spamdyke does not have access to the server's certificate file, so it cannot decrypt the traffic to log any information about senders or recipients. tls-level
UNKNOWN_AUTH The remote server requested an authentication method spamdyke doesn't support. This shouldn't happen.  

SENDER is the sender email address, if known, or (unknown) otherwise. NOTE: According to RFC 821, it is legal to deliver messages with no sender address. Most bounce messages are delivered this way.

RECIPIENT is the recipient email address, if known, or (unknown) otherwise. If CODE is ALLOWED, the recipient email address will be known.

IPADDRESS is the IP address of the remote server. This value is always known.

RDNSNAME is the rDNS name of the remote server, if known, or (unknown) otherwise.

USERNAME is the username given during authentication, if authentication was successful, or (unknown) otherwise.

REALCODE is only present if CODE is TIMEOUT and the connection was going to be blocked anyway. For example, if a remote server has no rDNS entry and the connection is going to be blocked but the connection times out instead, CODE will be TIMEOUT and REALCODE will be DENIED_RDNS_MISSING.

SMTP Error Codes

policy-url
rejection-text-access-denied
rejection-text-auth-failure
rejection-text-auth-unknown
rejection-text-dns-blacklist
rejection-text-earlytalker
rejection-text-empty-rdns
rejection-text-graylist
rejection-text-ip-blacklist
rejection-text-ip-in-cc-rdns
rejection-text-ip-in-rdns-keyword-blacklist
rejection-text-local-recipient
rejection-text-max-recipients
rejection-text-missing-sender-mx
rejection-text-rdns-blacklist
rejection-text-recipient-blacklist
rejection-text-reject-all
rejection-text-relaying-denied
rejection-text-rhs-blacklist
rejection-text-sender-blacklist
rejection-text-smtp-auth-required
rejection-text-timeout
rejection-text-tls-failure
rejection-text-unresolvable-rdns
rejection-text-zero-recipients

When spamdyke blocks a connection and returns an error code to a remote server, the text it sends is different from what appears in the logs (above). It is more user-friendly, just in case a human ever reads it (some, but not all, mail servers display the rejection message in bounce messages).

The messages can be changed using the options that are listed in the third column of the table below.

The messages that correspond to the syslog codes are:

syslog code SMTP message Option to change message
DENIED_ACCESS_DENIED Refused. Access is denied. rejection-text-access-denied
DENIED_AUTH_REQUIRED Refused. Authentication is required to send mail. rejection-text-smtp-auth-required
DENIED_BLACKLIST_IP Refused. Your IP address is blacklisted. rejection-text-ip-blacklist
DENIED_BLACKLIST_NAME Refused. Your domain name is blacklisted. rejection-text-rdns-blacklist
DENIED_EARLYTALKER Refused. You are not following the SMTP protocol. rejection-text-earlytalker
DENIED_GRAYLISTED Your address has been graylisted. Try again later. rejection-text-graylist
DENIED_IP_IN_CC_RDNS Refused. Your reverse DNS entry contains your IP address and a country code. rejection-text-ip-in-cc-rdns
DENIED_IP_IN_RDNS Refused. Your reverse DNS entry contains your IP address and a banned keyword. rejection-text-ip-in-rdns-keyword-blacklist
DENIED_OTHER The text returned by qmail (or the downstream filter that generated the rejection).  
DENIED_RBL_MATCH The text returned by the DNS RBL (if any) or
Refused. Your IP address is listed in the RBL at name.
rejection-text-dns-blacklist
DENIED_RDNS_MISSING Refused. You have no reverse DNS entry. rejection-text-empty-rdns
DENIED_RDNS_RESOLVE Refused. Your reverse DNS entry does not resolve. rejection-text-unresolvable-rdns
DENIED_RHSBL_MATCH The text returned by the RHSBL (if any) or
Refused. Your domain name is listed in the RHSBL at name.
rejection-text-rhs-blacklist
DENIED_RECIPIENT_BLACKLISTED Refused. Mail is not being accepted at this address. rejection-text-recipient-blacklist
DENIED_REJECT_ALL Refused. Mail is not being accepted. rejection-text-reject-all
DENIED_RELAYING Refused. Sending to remote addresses (relaying) is not allowed. rejection-text-relaying-denied
DENIED_SENDER_BLACKLISTED Refused. Your sender address has been blacklisted. rejection-text-sender-blacklist
DENIED_SENDER_NO_MX Refused. The domain of your sender address has no mail exchanger (MX). rejection-text-missing-sender-mx
DENIED_TOO_MANY_RECIPIENTS Too many recipients. Try the remaining addresses again later. rejection-text-max-recipients
DENIED_UNQUALIFIED_RECIPIENT Improper recipient address. Try supplying a domain name. rejection-text-local-recipient
DENIED_ZERO_RECIPIENTS Refused. You must specify at least one valid recipient. rejection-text-zero-recipients
FAILURE_AUTH Refused. Authentication failed. rejection-text-auth-failure
FAILURE_TLS Failed to negotiate TLS connection. rejection-text-tls-failure
TIMEOUT Timeout. Talk faster next time. rejection-text-timeout
UNKNOWN_AUTH Refused. Unknown authentication method. rejection-text-auth-unknown

If a policy location URL is given with the policy-url option, it will be appended to the end of the message, just in case a human ever reads it. This option should always be used. When a legitimate remote user is incorrectly blocked, the URL should provide your contact information so the error can be corrected.

spamdyke will always append the syslog code to the policy URL so a web browser will jump to an anchor within the HTML document. Most of the time, the code is prefixed with a # character. For example, if the policy URL is:

http://www.example.com/policy.html
spamdyke would generate the following URL for a rejection due to a missing reverse DNS entry:
http://www.example.com/policy.html#DENIED_RDNS_MISSING
However, if the policy URL ends in an equals sign (=), spamdyke will assume the URL is for a dynamic page and will not add the # character. For example, if the policy URL is:
http://www.example.com/policy?code=
spamdyke would generate the following URL for a rejection due to a missing reverse DNS entry:
http://www.example.com/policy?code=DENIED_RDNS_MISSING

Logging All Data

full-log-dir

spamdyke has the ability to log all SMTP data to files. This is very helpful when debugging but (depending on the mail server traffic levels) it can generate a huge number of files.

This