Mailing List Archive

svn commit: r1871201 [5/17] - in /spamassassin/site/full/3.4.x: ./ doc/
Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt?rev=1871201&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf.txt Wed Dec 11 22:18:49 2019
@@ -0,0 +1,2408 @@
+NAME
+ Mail::SpamAssassin::Conf - SpamAssassin configuration file
+
+SYNOPSIS
+ # a comment
+
+ rewrite_header Subject *****SPAM*****
+
+ full PARA_A_2_C_OF_1618 /Paragraph .a.{0,10}2.{0,10}C. of S. 1618/i
+ describe PARA_A_2_C_OF_1618 Claims compliance with senate bill 1618
+
+ header FROM_HAS_MIXED_NUMS From =~ /\d+[a-z]+\d+\S*@/i
+ describe FROM_HAS_MIXED_NUMS From: contains numbers mixed in with letters
+
+ score A_HREF_TO_REMOVE 2.0
+
+ lang es describe FROM_FORGED_HOTMAIL Forzado From: simula ser de hotmail.com
+
+ lang pt_BR report O programa detetor de Spam ZOE [...]
+
+DESCRIPTION
+ SpamAssassin is configured using traditional UNIX-style configuration
+ files, loaded from the "/usr/share/spamassassin" and
+ "/etc/mail/spamassassin" directories.
+
+ The following web page lists the most important configuration settings
+ used to configure SpamAssassin; novices are encouraged to read it first:
+
+ http://wiki.apache.org/spamassassin/ImportantInitialConfigItems
+
+FILE FORMAT
+ The "#" character starts a comment, which continues until end of line.
+ NOTE: if the "#" character is to be used as part of a rule or
+ configuration option, it must be escaped with a backslash. i.e.: "\#"
+
+ Whitespace in the files is not significant, but please note that
+ starting a line with whitespace is deprecated, as we reserve its use for
+ multi-line rule definitions, at some point in the future.
+
+ Currently, each rule or configuration setting must fit on one-line;
+ multi-line settings are not supported yet.
+
+ File and directory paths can use "~" to refer to the user's home
+ directory, but no other shell-style path extensions such as globing or
+ "~user/" are supported.
+
+ Where appropriate below, default values are listed in parentheses.
+
+ Test names ("SYMBOLIC_TEST_NAME") can only contain
+ alphanumerics/underscores, can not start with digit, and must be less
+ than 128 characters.
+
+USER PREFERENCES
+ The following options can be used in both site-wide ("local.cf") and
+ user-specific ("user_prefs") configuration files to customize how
+ SpamAssassin handles incoming email messages.
+
+ SCORING OPTIONS
+ required_score n.nn (default: 5)
+ Set the score required before a mail is considered spam. "n.nn" can
+ be an integer or a real number. 5.0 is the default setting, and is
+ quite aggressive; it would be suitable for a single-user setup, but
+ if you're an ISP installing SpamAssassin, you should probably set
+ the default to be more conservative, like 8.0 or 10.0. It is not
+ recommended to automatically delete or discard messages marked as
+ spam, as your users will complain, but if you choose to do so, only
+ delete messages with an exceptionally high score such as 15.0 or
+ higher. This option was previously known as "required_hits" and that
+ name is still accepted, but is deprecated.
+
+ score SYMBOLIC_TEST_NAME n.nn [ n.nn n.nn n.nn ]
+ Assign scores (the number of points for a hit) to a given test.
+ Scores can be positive or negative real numbers or integers.
+ "SYMBOLIC_TEST_NAME" is the symbolic name used by SpamAssassin for
+ that test; for example, 'FROM_ENDS_IN_NUMS'.
+
+ If only one valid score is listed, then that score is always used
+ for a test.
+
+ If four valid scores are listed, then the score that is used depends
+ on how SpamAssassin is being used. The first score is used when both
+ Bayes and network tests are disabled (score set 0). The second score
+ is used when Bayes is disabled, but network tests are enabled (score
+ set 1). The third score is used when Bayes is enabled and network
+ tests are disabled (score set 2). The fourth score is used when
+ Bayes is enabled and network tests are enabled (score set 3).
+
+ Setting a rule's score to 0 will disable that rule from running.
+
+ If any of the score values are surrounded by parenthesis '()', then
+ all of the scores in the line are considered to be relative to the
+ already set score. ie: '(3)' means increase the score for this rule
+ by 3 points in all score sets. '(3) (0) (3) (0)' means increase the
+ score for this rule by 3 in score sets 0 and 2 only.
+
+ If no score is given for a test by the end of the configuration, a
+ default score is assigned: a score of 1.0 is used for all tests,
+ except those whose names begin with 'T_' (this is used to indicate a
+ rule in testing) which receive 0.01.
+
+ Note that test names which begin with '__' are indirect rules used
+ to compose meta-match rules and can also act as prerequisites to
+ other rules. They are not scored or listed in the 'tests hit'
+ reports, but assigning a score of 0 to an indirect rule will disable
+ it from running.
+
+ WHITELIST AND BLACKLIST OPTIONS
+ whitelist_from user@example.com
+ Used to whitelist sender addresses which send mail that is often
+ tagged (incorrectly) as spam.
+
+ Use of this setting is not recommended, since it blindly trusts the
+ message, which is routinely and easily forged by spammers and phish
+ senders. The recommended solution is to instead use "whitelist_auth"
+ or other authenticated whitelisting methods, or
+ "whitelist_from_rcvd".
+
+ Whitelist and blacklist addresses are now file-glob-style patterns,
+ so "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all
+ work. Specifically, "*" and "?" are allowed, but all other
+ metacharacters are not. Regular expressions are not used for
+ security reasons. Matching is case-insensitive.
+
+ Multiple addresses per line, separated by spaces, is OK. Multiple
+ "whitelist_from" lines are also OK.
+
+ The headers checked for whitelist addresses are as follows: if
+ "Resent-From" is set, use that; otherwise check all addresses taken
+ from the following set of headers:
+
+ Envelope-Sender
+ Resent-Sender
+ X-Envelope-From
+ From
+
+ In addition, the "envelope sender" data, taken from the SMTP
+ envelope data where this is available, is looked up. See
+ "envelope_sender_header".
+
+ e.g.
+
+ whitelist_from joe@example.com fred@example.com
+ whitelist_from *@example.com
+
+ unwhitelist_from user@example.com
+ Used to override a default whitelist_from entry, so for example a
+ distribution whitelist_from can be overridden in a local.cf file, or
+ an individual user can override a whitelist_from entry in their own
+ "user_prefs" file. The specified email address has to match exactly
+ (although case-insensitively) the address previously used in a
+ whitelist_from line, which implies that a wildcard only matches
+ literally the same wildcard (not 'any' address).
+
+ e.g.
+
+ unwhitelist_from joe@example.com fred@example.com
+ unwhitelist_from *@example.com
+
+ whitelist_from_rcvd addr@lists.sourceforge.net sourceforge.net
+ Works similarly to whitelist_from, except that in addition to
+ matching a sender address, a relay's rDNS name or its IP address
+ must match too for the whitelisting rule to fire. The first
+ parameter is a sender's e-mail address to whitelist, and the second
+ is a string to match the relay's rDNS, or its IP address. Matching
+ is case-insensitive.
+
+ This second parameter is matched against a TCP-info information
+ field as provided in a FROM clause of a trace information (i.e. in a
+ Received header field, see RFC 5321). Only the Received header
+ fields inserted by trusted hosts are considered. This parameter can
+ either be a full hostname, or a domain component of that hostname,
+ or an IP address (optionally followed by a slash and a prefix
+ length) in square brackets. The address prefix (mask) length with a
+ slash may stand within brackets along with an address, or may follow
+ the bracketed address. Reverse DNS lookup is done by an MTA, not by
+ SpamAssassin.
+
+ For backward compatibility as an alternative to a CIDR notation, an
+ IPv4 address in brackets may be truncated on classful boundaries to
+ cover whole subnets, e.g. "[10.1.2.3]", "[10.1.2]", "[10.1]",
+ "[10]".
+
+ In other words, if the host that connected to your MX had an IP
+ address 192.0.2.123 that mapped to 'sendinghost.example.org', you
+ should specify "sendinghost.example.org", or "example.org", or
+ "[192.0.2.123]", or "[192.0.2.0/24]", or "[192.0.2]" here.
+
+ Note that this requires that "internal_networks" be correct. For
+ simple cases, it will be, but for a complex network you may get
+ better results by setting that parameter.
+
+ It also requires that your mail exchangers be configured to perform
+ DNS reverse lookups on the connecting host's IP address, and to
+ record the result in the generated Received header field according
+ to RFC 5321.
+
+ e.g.
+
+ whitelist_from_rcvd joe@example.com example.com
+ whitelist_from_rcvd *@* mail.example.org
+ whitelist_from_rcvd *@axkit.org [192.0.2.123]
+ whitelist_from_rcvd *@axkit.org [192.0.2.0/24]
+ whitelist_from_rcvd *@axkit.org [192.0.2.0]/24
+ whitelist_from_rcvd *@axkit.org [2001:db8:1234::/48]
+ whitelist_from_rcvd *@axkit.org [2001:db8:1234::]/48
+
+ def_whitelist_from_rcvd addr@lists.sourceforge.net sourceforge.net
+ Same as "whitelist_from_rcvd", but used for the default whitelist
+ entries in the SpamAssassin distribution. The whitelist score is
+ lower, because these are often targets for spammer spoofing.
+
+ whitelist_allows_relays user@example.com
+ Specify addresses which are in "whitelist_from_rcvd" that sometimes
+ send through a mail relay other than the listed ones. By default
+ mail with a From address that is in "whitelist_from_rcvd" that does
+ not match the relay will trigger a forgery rule. Including the
+ address in "whitelist_allows_relay" prevents that.
+
+ Whitelist and blacklist addresses are now file-glob-style patterns,
+ so "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all
+ work. Specifically, "*" and "?" are allowed, but all other
+ metacharacters are not. Regular expressions are not used for
+ security reasons. Matching is case-insensitive.
+
+ Multiple addresses per line, separated by spaces, is OK. Multiple
+ "whitelist_allows_relays" lines are also OK.
+
+ The specified email address does not have to match exactly the
+ address previously used in a whitelist_from_rcvd line as it is
+ compared to the address in the header.
+
+ e.g.
+
+ whitelist_allows_relays joe@example.com fred@example.com
+ whitelist_allows_relays *@example.com
+
+ unwhitelist_from_rcvd user@example.com
+ Used to override a default whitelist_from_rcvd entry, so for example
+ a distribution whitelist_from_rcvd can be overridden in a local.cf
+ file, or an individual user can override a whitelist_from_rcvd entry
+ in their own "user_prefs" file.
+
+ The specified email address has to match exactly the address
+ previously used in a whitelist_from_rcvd line.
+
+ e.g.
+
+ unwhitelist_from_rcvd joe@example.com fred@example.com
+ unwhitelist_from_rcvd *@axkit.org
+
+ blacklist_from user@example.com
+ Used to specify addresses which send mail that is often tagged
+ (incorrectly) as non-spam, but which the user doesn't want. Same
+ format as "whitelist_from".
+
+ unblacklist_from user@example.com
+ Used to override a default blacklist_from entry, so for example a
+ distribution blacklist_from can be overridden in a local.cf file, or
+ an individual user can override a blacklist_from entry in their own
+ "user_prefs" file. The specified email address has to match exactly
+ the address previously used in a blacklist_from line.
+
+ e.g.
+
+ unblacklist_from joe@example.com fred@example.com
+ unblacklist_from *@spammer.com
+
+ whitelist_to user@example.com
+ If the given address appears as a recipient in the message headers
+ (Resent-To, To, Cc, obvious envelope recipient, etc.) the mail will
+ be whitelisted. Useful if you're deploying SpamAssassin system-wide,
+ and don't want some users to have their mail filtered. Same format
+ as "whitelist_from".
+
+ There are three levels of To-whitelisting, "whitelist_to",
+ "more_spam_to" and "all_spam_to". Users in the first level may still
+ get some spammish mails blocked, but users in "all_spam_to" should
+ never get mail blocked.
+
+ The headers checked for whitelist addresses are as follows: if
+ "Resent-To" or "Resent-Cc" are set, use those; otherwise check all
+ addresses taken from the following set of headers:
+
+ To
+ Cc
+ Apparently-To
+ Delivered-To
+ Envelope-Recipients
+ Apparently-Resent-To
+ X-Envelope-To
+ Envelope-To
+ X-Delivered-To
+ X-Original-To
+ X-Rcpt-To
+ X-Real-To
+
+ more_spam_to user@example.com
+ See above.
+
+ all_spam_to user@example.com
+ See above.
+
+ blacklist_to user@example.com
+ If the given address appears as a recipient in the message headers
+ (Resent-To, To, Cc, obvious envelope recipient, etc.) the mail will
+ be blacklisted. Same format as "blacklist_from".
+
+ whitelist_auth user@example.com
+ Used to specify addresses which send mail that is often tagged
+ (incorrectly) as spam. This is different from "whitelist_from" and
+ "whitelist_from_rcvd" in that it first verifies that the message was
+ sent by an authorized sender for the address, before whitelisting.
+
+ Authorization is performed using one of the installed
+ sender-authorization schemes: SPF (using
+ "Mail::SpamAssassin::Plugin::SPF"), or DKIM (using
+ "Mail::SpamAssassin::Plugin::DKIM"). Note that those plugins must be
+ active, and working, for this to operate.
+
+ Using "whitelist_auth" is roughly equivalent to specifying duplicate
+ "whitelist_from_spf", "whitelist_from_dk", and "whitelist_from_dkim"
+ lines for each of the addresses specified.
+
+ e.g.
+
+ whitelist_auth joe@example.com fred@example.com
+ whitelist_auth *@example.com
+
+ def_whitelist_auth user@example.com
+ Same as "whitelist_auth", but used for the default whitelist entries
+ in the SpamAssassin distribution. The whitelist score is lower,
+ because these are often targets for spammer spoofing.
+
+ unwhitelist_auth user@example.com
+ Used to override a "whitelist_auth" entry. The specified email
+ address has to match exactly the address previously used in a
+ "whitelist_auth" line.
+
+ e.g.
+
+ unwhitelist_auth joe@example.com fred@example.com
+ unwhitelist_auth *@example.com
+
+ enlist_uri_host (listname) host ...
+ Adds one or more host names or domain names to a named list of URI
+ domains. The named list can then be consulted through a
+ check_uri_host_listed() eval rule implemented by the WLBLEval
+ plugin, which takes the list name as an argument. Parenthesis around
+ a list name are literal - a required syntax.
+
+ Host names may optionally be prefixed by an exclamation mark '!',
+ which produces false as a result if this entry matches. This makes
+ it easier to exclude some subdomains when their superdomain is
+ listed, for example:
+
+ enlist_uri_host (MYLIST) !sub1.example.com !sub2.example.com example.com
+
+ No wildcards are supported, but subdomains do match implicitly.
+ Lists are independent. Search for each named list starts by looking
+ up the full hostname first, then leading fields are progressively
+ stripped off (e.g.: sub.example.com, example.com, com) until a match
+ is found or we run out of fields. The first matching entry (the most
+ specific) determines if a lookup yielded a true (no '!' prefix) or a
+ false (with a '!' prefix) result.
+
+ If an URL found in a message contains an IP address in place of a
+ host name, the given list must specify the exact same IP address
+ (instead of a host name) in order to match.
+
+ Use the delist_uri_host directive to neutralize previous
+ enlist_uri_host settings.
+
+ Enlisting to lists named 'BLACK' and 'WHITE' have their shorthand
+ directives blacklist_uri_host and whitelist_uri_host and
+ corresponding default rules, but the names 'BLACK' and 'WHITE' are
+ otherwise not special or reserved.
+
+ delist_uri_host [ (listname) ] host ...
+ Removes one or more specified host names from a named list of URI
+ domains. Removing an unlisted name is ignored (is not an error).
+ Listname is optional, if specified then just the named list is
+ affected, otherwise hosts are removed from all URI host lists
+ created so far. Parenthesis around a list name are a required
+ syntax.
+
+ Note that directives in configuration files are processed in
+ sequence, the delist_uri_host only applies to previously listed
+ entries and has no effect on enlisted entries in yet-to-be-processed
+ directives.
+
+ For convenience (similarity to the enlist_uri_host directive)
+ hostnames may be prefixed by a an exclamation mark, which is
+ stripped off from each name and has no meaning here.
+
+ enlist_addrlist (listname) user@example.com
+ Adds one or more addresses to a named list of addresses. The named
+ list can then be consulted through a check_from_in_list() or a
+ check_to_in_list() eval rule implemented by the WLBLEval plugin,
+ which takes the list name as an argument. Parenthesis around a list
+ name are literal - a required syntax.
+
+ Listed addresses are file-glob-style patterns, so
+ "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all
+ work. Specifically, "*" and "?" are allowed, but all other
+ metacharacters are not. Regular expressions are not used for
+ security reasons. Matching is case-insensitive.
+
+ Multiple addresses per line, separated by spaces, is OK. Multiple
+ "enlist_addrlist" lines are also OK.
+
+ Enlisting an address to the list named blacklist_to is synonymous to
+ using the directive blacklist_to
+
+ Enlisting an address to the list named blacklist_from is synonymous
+ to using the directive blacklist_from
+
+ Enlisting an address to the list named whitelist_to is synonymous to
+ using the directive whitelist_to
+
+ Enlisting an address to the list named whitelist_from is synonymous
+ to using the directive whitelist_from
+
+ e.g.
+
+ enlist_addrlist (PAYPAL_ADDRESS) service@paypal.com
+ enlist_addrlist (PAYPAL_ADDRESS) *@paypal.co.uk
+
+ blacklist_uri_host host-or-domain ...
+ Is a shorthand for a directive: enlist_uri_host (BLACK) host ...
+
+ Please see directives enlist_uri_host and delist_uri_host for
+ details.
+
+ whitelist_uri_host host-or-domain ...
+ Is a shorthand for a directive: enlist_uri_host (BLACK) host ...
+
+ Please see directives enlist_uri_host and delist_uri_host for
+ details.
+
+ BASIC MESSAGE TAGGING OPTIONS
+ rewrite_header { subject | from | to } STRING
+ By default, suspected spam messages will not have the "Subject",
+ "From" or "To" lines tagged to indicate spam. By setting this
+ option, the header will be tagged with "STRING" to indicate that a
+ message is spam. For the From or To headers, this will take the form
+ of an RFC 2822 comment following the address in parentheses. For the
+ Subject header, this will be prepended to the original subject. Note
+ that you should only use the _REQD_ and _SCORE_ tags when rewriting
+ the Subject header if "report_safe" is 0. Otherwise, you may not be
+ able to remove the SpamAssassin markup via the normal methods. More
+ information about tags is explained below in the TEMPLATE TAGS
+ section.
+
+ Parentheses are not permitted in STRING if rewriting the From or To
+ headers. (They will be converted to square brackets.)
+
+ If "rewrite_header subject" is used, but the message being rewritten
+ does not already contain a "Subject" header, one will be created.
+
+ A null value for "STRING" will remove any existing rewrite for the
+ specified header.
+
+ subjprefix
+ Add a prefix in emails Subject if a rule is matched. To enable this
+ option "rewrite_header Subject" config option must be enabled as
+ well.
+
+ The check "if can(Mail::SpamAssassin::Conf::feature_subjprefix)"
+ should be used to silence warnings in previous SpamAssassin
+ versions.
+
+ To be able to use this feature a "add_header all Subjprefix
+ _SUBJPREFIX_" configuration line could be needed on some setups.
+
+ add_header { spam | ham | all } header_name string
+ Customized headers can be added to the specified type of messages
+ (spam, ham, or "all" to add to either). All headers begin with
+ "X-Spam-" (so a "header_name" Foo will generate a header called
+ X-Spam-Foo). header_name is restricted to the character set
+ [A-Za-z0-9_-].
+
+ The order of "add_header" configuration options is preserved,
+ inserted headers will follow this order of declarations. When
+ combining "add_header" with "clear_headers" and "remove_header",
+ keep in mind that "add_header" appends a new header to the current
+ list, after first removing any existing header fields of the same
+ name. Note also that "add_header", "clear_headers" and
+ "remove_header" may appear in multiple .cf files, which are
+ interpreted in alphabetic order.
+
+ "string" can contain tags as explained below in the TEMPLATE TAGS
+ section. You can also use "\n" and "\t" in the header to add
+ newlines and tabulators as desired. A backslash has to be written as
+ \\, any other escaped chars will be silently removed.
+
+ All headers will be folded if fold_headers is set to 1. Note:
+ Manually adding newlines via "\n" disables any further automatic
+ wrapping (ie: long header lines are possible). The lines will still
+ be properly folded (marked as continuing) though.
+
+ You can customize existing headers with add_header (only the
+ specified subset of messages will be changed).
+
+ See also "clear_headers" and "remove_header" for removing headers.
+
+ Here are some examples (these are the defaults, note that
+ Checker-Version can not be changed or removed):
+
+ add_header spam Flag _YESNOCAPS_
+ add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_
+ add_header all Level _STARS(*)_
+ add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_
+
+ remove_header { spam | ham | all } header_name
+ Headers can be removed from the specified type of messages (spam,
+ ham, or "all" to remove from either). All headers begin with
+ "X-Spam-" (so "header_name" will be appended to "X-Spam-").
+
+ See also "clear_headers" for removing all the headers at once.
+
+ Note that X-Spam-Checker-Version is not removable because the
+ version information is needed by mail administrators and developers
+ to debug problems. Without at least one header, it might not even be
+ possible to determine that SpamAssassin is running.
+
+ clear_headers
+ Clear the list of headers to be added to messages. You may use this
+ before any add_header options to prevent the default headers from
+ being added to the message.
+
+ "add_header", "clear_headers" and "remove_header" may appear in
+ multiple .cf files, which are interpreted in alphabetic order, so
+ "clear_headers" in a later file will remove all added headers from
+ previously interpreted configuration files, which may or may not be
+ desired.
+
+ Note that X-Spam-Checker-Version is not removable because the
+ version information is needed by mail administrators and developers
+ to debug problems. Without at least one header, it might not even be
+ possible to determine that SpamAssassin is running.
+
+ report_safe ( 0 | 1 | 2 ) (default: 1)
+ if this option is set to 1, if an incoming message is tagged as
+ spam, instead of modifying the original message, SpamAssassin will
+ create a new report message and attach the original message as a
+ message/rfc822 MIME part (ensuring the original message is
+ completely preserved, not easily opened, and easier to recover).
+
+ If this option is set to 2, then original messages will be attached
+ with a content type of text/plain instead of message/rfc822. This
+ setting may be required for safety reasons on certain broken mail
+ clients that automatically load attachments without any action by
+ the user. This setting may also make it somewhat more difficult to
+ extract or view the original message.
+
+ If this option is set to 0, incoming spam is only modified by adding
+ some "X-Spam-" headers and no changes will be made to the body. In
+ addition, a header named X-Spam-Report will be added to spam. You
+ can use the remove_header option to remove that header after setting
+ report_safe to 0.
+
+ See report_safe_copy_headers if you want to copy headers from the
+ original mail into tagged messages.
+
+ report_wrap_width (default: 70)
+ This option sets the wrap width for description lines in the
+ X-Spam-Report header, not accounting for tab width.
+
+ LANGUAGE OPTIONS
+ ok_locales xx [ yy zz ... ] (default: all)
+ This option is used to specify which locales are considered OK for
+ incoming mail. Mail using the character sets that are allowed by
+ this option will not be marked as possibly being spam in a foreign
+ language.
+
+ If you receive lots of spam in foreign languages, and never get any
+ non-spam in these languages, this may help. Note that all ISO-8859-*
+ character sets, and Windows code page character sets, are always
+ permitted by default.
+
+ Set this to "all" to allow all character sets. This is the default.
+
+ The rules "CHARSET_FARAWAY", "CHARSET_FARAWAY_BODY", and
+ "CHARSET_FARAWAY_HEADERS" are triggered based on how this is set.
+
+ Examples:
+
+ ok_locales all (allow all locales)
+ ok_locales en (only allow English)
+ ok_locales en ja zh (allow English, Japanese, and Chinese)
+
+ Note: if there are multiple ok_locales lines, only the last one is
+ used.
+
+ Select the locales to allow from the list below:
+
+ en - Western character sets in general
+ ja - Japanese character sets
+ ko - Korean character sets
+ ru - Cyrillic character sets
+ th - Thai character sets
+ zh - Chinese (both simplified and traditional) character sets
+
+ normalize_charset ( 0 | 1) (default: 0)
+ Whether to decode non- UTF-8 and non-ASCII textual parts and recode
+ them to UTF-8 before the text is given over to rules processing. The
+ character set used for attempted decoding is primarily based on a
+ declared character set in a Content-Type header, but if the decoding
+ attempt fails a module Encode::Detect::Detector is consulted (if
+ available) to provide a guess based on the actual text, and decoding
+ is re-attempted. Even if the option is enabled no unnecessary
+ decoding and re-encoding work is done when possible (like with an
+ all-ASCII text with a US-ASCII or extended ASCII character set
+ declaration, e.g. UTF-8 or ISO-8859-nn or Windows-nnnn).
+
+ Unicode support in old versions of perl or in a core module Encode
+ is likely to be buggy in places, so if the normalize_charset
+ function is enabled it is advised to stick to more recent versions
+ of perl (preferably 5.12 or later). The module
+ Encode::Detect::Detector is optional, when necessary it will be used
+ if it is available.
+
+ body_part_scan_size (default: 50000)
+ Per mime-part scan size limit in bytes for "body" type rules. The
+ decoded/stripped mime-part is truncated approx to this size. Helps
+ scanning large messages safely, so it's not necessary to skip them
+ completely. Disabled with 0.
+
+ rawbody_part_scan_size (default: 500000)
+ Like body_part_scan_size, for "rawbody" type rules.
+
+ NETWORK TEST OPTIONS
+ trusted_networks IPaddress[/masklen] ... (default: none)
+ What networks or hosts are 'trusted' in your setup. Trusted in this
+ case means that relay hosts on these networks are considered to not
+ be potentially operated by spammers, open relays, or open proxies. A
+ trusted host could conceivably relay spam, but will not originate
+ it, and will not forge header data. DNS blacklist checks will never
+ query for hosts on these networks.
+
+ See "http://wiki.apache.org/spamassassin/TrustPath" for more
+ information.
+
+ MXes for your domain(s) and internal relays should also be specified
+ using the "internal_networks" setting. When there are 'trusted'
+ hosts that are not MXes or internal relays for your domain(s) they
+ should only be specified in "trusted_networks".
+
+ The "IPaddress" can be an IPv4 address (in a dot-quad form), or an
+ IPv6 address optionally enclosed in square brackets. Scoped
+ link-local IPv6 addresses are syntactically recognized but the
+ interface scope is currently ignored (e.g. [fe80::1234%eth0] ) and
+ should be avoided.
+
+ If a "/masklen" is specified, it is considered a CIDR-style
+ 'netmask' length, specified in bits. If it is not specified, but
+ less than 4 octets of an IPv4 address are specified with a trailing
+ dot, an implied netmask length covers all addresses in remaining
+ octets (i.e. implied masklen is /8 or /16 or /24). If masklen is not
+ specified, and there is not trailing dot, then just a single IP
+ address specified is used, as if the masklen were "/32" with an IPv4
+ address, or "/128" in case of an IPv6 address.
+
+ If a network or host address is prefaced by a "!" the matching
+ network or host will be excluded from the list even if a less
+ specific (shorter netmask length) subnet is later specified in the
+ list. This allows a subset of a wider network to be exempt. In case
+ of specifying overlapping subnets, specify more specific subnets
+ first (tighter matching, i.e. with a longer netmask length),
+ followed by less specific (shorter netmask length) subnets to get
+ predictable results regardless of the search algorithm used - when
+ Net::Patricia module is installed the search finds the tightest
+ matching entry in the list, while a sequential search as used in
+ absence of the module Net::Patricia will find the first matching
+ entry in the list.
+
+ Note: 127.0.0.0/8 and ::1 are always included in trusted_networks,
+ regardless of your config.
+
+ Examples:
+
+ trusted_networks 192.168.0.0/16 # all in 192.168.*.*
+ trusted_networks 192.168. # all in 192.168.*.*
+ trusted_networks 212.17.35.15 # just that host
+ trusted_networks !10.0.1.5 10.0.1/24 # all in 10.0.1.* but not 10.0.1.5
+ trusted_networks 2001:db8:1::1 !2001:db8:1::/64 2001:db8::/32
+ # 2001:db8::/32 and 2001:db8:1::1/128, except the rest of 2001:db8:1::/64
+
+ This operates additively, so a "trusted_networks" line after another
+ one will append new entries to the list of trusted networks. To
+ clear out the existing entries, use "clear_trusted_networks".
+
+ If "trusted_networks" is not set and "internal_networks" is, the
+ value of "internal_networks" will be used for this parameter.
+
+ If neither "trusted_networks" or "internal_networks" is set, a basic
+ inference algorithm is applied. This works as follows:
+
+ * If the 'from' host has an IP address in a private (RFC 1918)
+ network range, then it's trusted
+
+ * If there are authentication tokens in the received header, and
+ the previous host was trusted, then this host is also trusted
+
+ * Otherwise this host, and all further hosts, are consider
+ untrusted.
+
+ clear_trusted_networks
+ Empty the list of trusted networks.
+
+ internal_networks IPaddress[/masklen] ... (default: none)
+ What networks or hosts are 'internal' in your setup. Internal means
+ that relay hosts on these networks are considered to be MXes for
+ your domain(s), or internal relays. This uses the same syntax as
+ "trusted_networks", above - see there for details.
+
+ This value is used when checking 'dial-up' or dynamic IP address
+ blocklists, in order to detect direct-to-MX spamming.
+
+ Trusted relays that accept mail directly from dial-up connections
+ (i.e. are also performing a role of mail submission agents - MSA)
+ should not be listed in "internal_networks". List them only in
+ "trusted_networks".
+
+ If "trusted_networks" is set and "internal_networks" is not, the
+ value of "trusted_networks" will be used for this parameter.
+
+ If neither "trusted_networks" nor "internal_networks" is set, no
+ addresses will be considered local; in other words, any relays past
+ the machine where SpamAssassin is running will be considered
+ external.
+
+ Every entry in "internal_networks" must appear in
+ "trusted_networks"; in other words, "internal_networks" is always a
+ subset of the trusted set.
+
+ Note: 127/8 and ::1 are always included in internal_networks,
+ regardless of your config.
+
+ clear_internal_networks
+ Empty the list of internal networks.
+
+ msa_networks IPaddress[/masklen] ... (default: none)
+ The networks or hosts which are acting as MSAs in your setup (but
+ not also as MX relays). This uses the same syntax as
+ "trusted_networks", above - see there for details.
+
+ MSA means that the relay hosts on these networks accept mail from
+ your own users and authenticates them appropriately. These relays
+ will never accept mail from hosts that aren't authenticated in some
+ way. Examples of authentication include, IP lists, SMTP AUTH,
+ POP-before-SMTP, etc.
+
+ All relays found in the message headers after the MSA relay will
+ take on the same trusted and internal classifications as the MSA
+ relay itself, as defined by your *trusted_networks* and
+ *internal_networks* configuration.
+
+ For example, if the MSA relay is trusted and internal so will all of
+ the relays that precede it.
+
+ When using msa_networks to identify an MSA it is recommended that
+ you treat that MSA as both trusted and internal. When an MSA is not
+ included in msa_networks you should treat the MSA as trusted but not
+ internal, however if the MSA is also acting as an MX or intermediate
+ relay you must always treat it as both trusted and internal and
+ ensure that the MSA includes visible auth tokens in its Received
+ header to identify submission clients.
+
+ Warning: Never include an MSA that also acts as an MX (or is also an
+ intermediate relay for an MX) or otherwise accepts mail from
+ non-authenticated users in msa_networks. Doing so will result in
+ unknown external relays being trusted.
+
+ clear_msa_networks
+ Empty the list of msa networks.
+
+ originating_ip_headers header ... (default: X-Yahoo-Post-IP
+ X-Originating-IP X-Apparently-From X-SenderIP)
+ A list of header field names from which an originating IP address
+ can be obtained. For example, webmail servers may record a client IP
+ address in X-Originating-IP.
+
+ These IP addresses are virtually appended into the Received: chain,
+ so they are used in RBL checks where appropriate.
+
+ Currently the IP addresses are not added into X-Spam-Relays-* header
+ fields, but they may be in the future.
+
+ clear_originating_ip_headers
+ Empty the list of 'originating IP address' header field names.
+
+ always_trust_envelope_sender ( 0 | 1 ) (default: 0)
+ Trust the envelope sender even if the message has been passed
+ through one or more trusted relays. See also
+ "envelope_sender_header".
+
+ skip_rbl_checks ( 0 | 1 ) (default: 0)
+ Turning on the skip_rbl_checks setting will disable the DNSEval
+ plugin, which implements Real-time Block List (or: Blackhole List)
+ (RBL) lookups.
+
+ By default, SpamAssassin will run RBL checks. Individual blocklists
+ may be disabled selectively by setting a score of a corresponding
+ rule to 0.
+
+ See also a related configuration parameter skip_uribl_checks, which
+ controls the URIDNSBL plugin (documented in the URIDNSBL man page).
+
+ dns_available { yes | no | test[: domain1 domain2...] } (default: yes)
+ Tells SpamAssassin whether DNS resolving is available or not. A
+ value *yes* indicates DNS resolving is available, a value *no*
+ indicates DNS resolving is not available - both of these values
+ apply unconditionally and skip initial DNS tests, which can be slow
+ or unreliable.
+
+ When the option value is a *test* (with or without arguments),
+ SpamAssassin will query some domain names on the internet during
+ initialization, attempting to determine if DNS resolving is working
+ or not. A space-separated list of domain names may be specified
+ explicitly, or left to a built-in default of a dozen or so domain
+ names. From an explicit or a default list a subset of three domain
+ names is picked randomly for checking. The test queries for NS
+ records of these domain: if at least one query returns a success
+ then SpamAssassin considers DNS resolving as available, otherwise
+ not.
+
+ The problem is that the test can introduce some startup delay if a
+ network connection is down, and in some cases it can wrongly guess
+ that DNS is unavailable because a test connection failed, what
+ causes disabling several DNS-dependent tests.
+
+ Please note, the DNS test queries for NS records, so specify domain
+ names, not host names.
+
+ Since version 3.4.0 of SpamAssassin a default setting for option
+ *dns_available* is *yes*. A default in older versions was *test*.
+
+ dns_server ip-addr-port (default: entries provided by Net::DNS)
+ Specifies an IP address of a DNS server, and optionally its port
+ number. The *dns_server* directive may be specified multiple times,
+ each entry adding to a list of available resolving name servers. The
+ *ip-addr-port* argument can either be an IPv4 or IPv6 address,
+ optionally enclosed in brackets, and optionally followed by a colon
+ and a port number. In absence of a port number a standard port
+ number 53 is assumed. When an IPv6 address is specified along with a
+ port number, the address must be enclosed in brackets to avoid
+ parsing ambiguity regarding a colon separator. A scoped link-local
+ IP address is allowed (assuming underlying modules allow it).
+
+ Examples : dns_server 127.0.0.1 dns_server 127.0.0.1:53 dns_server
+ [127.0.0.1]:53 dns_server [::1]:53 dns_server fe80::1%lo0 dns_server
+ [fe80::1%lo0]:53
+
+ In absence of *dns_server* directives, the list of name servers is
+ provided by Net::DNS module, which typically obtains the list from
+ /etc/resolv.conf, but this may be platform dependent. Please consult
+ the Net::DNS::Resolver documentation for details.
+
+ clear_dns_servers
+ Empty the list of explicitly configured DNS servers through a
+ *dns_server* directive, falling back to Net::DNS -supplied defaults.
+
+ dns_local_ports_permit ranges...
+ Add the specified ports or ports ranges to the set of allowed port
+ numbers that can be used as local port numbers when sending DNS
+ queries to a resolver.
+
+ The argument is a whitespace-separated or a comma-separated list of
+ single port numbers n, or port number pairs (i.e. m-n) delimited by
+ a '-', representing a range. Allowed port numbers are between 1 and
+ 65535.
+
+ Directives *dns_local_ports_permit* and *dns_local_ports_avoid* are
+ processed in order in which they appear in configuration files. Each
+ directive adds (or subtracts) its subsets of ports to a current set
+ of available ports. Whatever is left in the set by the end of
+ configuration processing is made available to a DNS resolving client
+ code.
+
+ If the resulting set of port numbers is empty (see also the
+ directive *dns_local_ports_none*), then SpamAssassin does not apply
+ its ports randomization logic, but instead leaves the operating
+ system to choose a suitable free local port number.
+
+ The initial set consists of all port numbers in the range
+ 1024-65535. Note that system config files already modify the set and
+ remove all the IANA registered port numbers and some other ranges,
+ so there is rarely a need to adjust the ranges by site-specific
+ directives.
+
+ See also directives *dns_local_ports_permit* and
+ *dns_local_ports_none*.
+
+ dns_local_ports_avoid ranges...
+ Remove specified ports or ports ranges from the set of allowed port
+ numbers that can be used as local port numbers when sending DNS
+ queries to a resolver.
+
+ Please see directive *dns_local_ports_permit* for details.
+
+ dns_local_ports_none
+ Is a fast shorthand for:
+
+ dns_local_ports_avoid 1-65535
+
+ leaving the set of available DNS query local port numbers empty. In
+ all respects (apart from speed) it is equivalent to the shown
+ directive, and can be freely mixed with *dns_local_ports_permit* and
+ *dns_local_ports_avoid*.
+
+ If the resulting set of port numbers is empty, then SpamAssassin
+ does not apply its ports randomization logic, but instead leaves the
+ operating system to choose a suitable free local port number.
+
+ See also directives *dns_local_ports_permit* and
+ *dns_local_ports_avoid*.
+
+ dns_test_interval n (default: 600 seconds)
+ If dns_available is set to *test*, the dns_test_interval time in
+ number of seconds will tell SpamAssassin how often to retest for
+ working DNS. A numeric value is optionally suffixed by a time unit
+ (s, m, h, d, w, indicating seconds (default), minutes, hours, days,
+ weeks).
+
+ dns_options opts (default: norotate, nodns0x20, edns=4096)
+ Provides a (whitespace or comma -separated) list of options applying
+ to DNS resolving. Available options are: *rotate*, *dns0x20* and
+ *edns* (or *edns0*). Option name may be negated by prepending a *no*
+ (e.g. *norotate*, *NoEDNS*) to counteract a previously enabled
+ option. Option names are not case-sensitive. The *dns_options*
+ directive may appear in configuration files multiple times, the last
+ setting prevails.
+
+ Option *edns* (or *edsn0*) may take a value which specifies a
+ requestor's acceptable UDP payload size according to EDNS0
+ specifications (RFC 6891, ex RFC 2671) e.g. *edns=4096*. When EDNS0
+ is off (*noedns* or *edns=512*) a traditional implied UDP payload
+ size is 512 bytes, which is also a minimum allowed value for this
+ option. When the option is specified but a value is not provided, a
+ conservative default of 1220 bytes is implied. It is recommended to
+ keep *edns* enabled when using a local recursive DNS server which
+ supports EDNS0 (like most modern DNS servers do), a suitable setting
+ in this case is *edns=4096*, which is also a default. Allowing UDP
+ payload size larger than 512 bytes can avoid truncation of resource
+ records in large DNS responses (like in TXT records of some SPF and
+ DKIM responses, or when an unreasonable number of A records is
+ published by some domain). The option should be disabled when a
+ recursive DNS server is only reachable through non- RFC 6891
+ compliant middleboxes (such as some old-fashioned firewall) which
+ bans DNS UDP payload sizes larger than 512 bytes. A suitable value
+ when a non-local recursive DNS server is used and a middlebox does
+ allow EDNS0 but blocks fragmented IP packets is perhaps 1220 bytes,
+ allowing a DNS UDP packet to fit within a single IP packet in most
+ cases (a slightly less conservative range would be 1280-1410 bytes).
+
+ Option *rotate* causes SpamAssassin to choose a DNS server at random
+ from all servers listed in "/etc/resolv.conf" every
+ *dns_test_interval* seconds, effectively spreading the load over all
+ currently available DNS servers when there are many spamd workers.
+
+ Option *dns0x20* enables randomization of letters in a DNS query
+ label according to draft-vixie-dnsext-dns0x20, decreasing a chance
+ of collisions of responses (by chance or by a malicious intent) by
+ increasing spread as provided by a 16-bit query ID and up to 16 bits
+ of a port number, with additional bits as encoded by flipping case
+ (upper/lower) of letters in a query. The number of additional random
+ bits corresponds to the number of letters in a query label. Should
+ work reliably with all mainstream DNS servers - do not turn on if
+ you see frequent info messages "dns: no callback for id:" in the
+ log, or if RBL or URIDNS lookups do not work for no apparent reason.
+
+ dns_query_restriction (allow|deny) domain1 domain2 ...
+ Option allows disabling of rules which would result in a DNS query
+ to one of the listed domains. The first argument must be a literal
+ "allow" or "deny", remaining arguments are domains names.
+
+ Most DNS queries (with some exceptions) are subject to
+ dns_query_restriction. A domain to be queried is successively
+ stripped-off of its leading labels (thus yielding a series of its
+ parent domains), and on each iteration a check is made against an
+ associative array generated by dns_query_restriction options. Search
+ stops at the first match (i.e. the tightest match), and the matching
+ entry with its "allow" or "deny" value then controls whether a DNS
+ query is allowed to be launched.
+
+ If no match is found an implicit default is to allow a query. The
+ purpose of an explicit "allow" entry is to be able to override a
+ previously configured "deny" on the same domain or to override an
+ entry (possibly yet to be configured in subsequent config
+ directives) on one of its parent domains. Thus an 'allow
+ zen.spamhaus.org' with a 'deny spamhaus.org' would permit DNS
+ queries on a specific DNS BL zone but deny queries to other zones
+ under the same parent domain.
+
+ Domains are matched case-insensitively, no wildcards are recognized,
+ there should be no leading or trailing dot.
+
+ Specifying a block on querying a domain name has a similar effect as
+ setting a score of corresponding DNSBL and URIBL rules to zero, and
+ can be a handy alternative to hunting for such rules when a site
+ policy does not allow certain DNS block lists to be queried.
+
+ Example: dns_query_restriction deny dnswl.org surbl.org
+ dns_query_restriction allow zen.spamhaus.org dns_query_restriction
+ deny spamhaus.org mailspike.net spamcop.net
+
+ clear_dns_query_restriction
+ The option removes any entries entered by previous
+ 'dns_query_restriction' options, leaving the list empty, i.e.
+ allowing DNS queries for any domain (including any DNS BL zone).
+
+ LEARNING OPTIONS
+ use_learner ( 0 | 1 ) (default: 1)
+ Whether to use any machine-learning classifiers with SpamAssassin,
+ such as the default 'BAYES_*' rules. Setting this to 0 will disable
+ use of any and all human-trained classifiers.
+
+ use_bayes ( 0 | 1 ) (default: 1)
+ Whether to use the naive-Bayesian-style classifier built into
+ SpamAssassin. This is a master on/off switch for all Bayes-related
+ operations.
+
+ use_bayes_rules ( 0 | 1 ) (default: 1)
+ Whether to use rules using the naive-Bayesian-style classifier built
+ into SpamAssassin. This allows you to disable the rules while
+ leaving auto and manual learning enabled.
+
+ bayes_auto_learn ( 0 | 1 ) (default: 1)
+ Whether SpamAssassin should automatically feed high-scoring mails
+ (or low-scoring mails, for non-spam) into its learning systems. The
+ only learning system supported currently is a naive-Bayesian-style
+ classifier.
+
+ See the documentation for the
+ "Mail::SpamAssassin::Plugin::AutoLearnThreshold" plugin module for
+ details on how Bayes auto-learning is implemented by default.
+
+ bayes_token_sources (default: header visible invisible uri)
+ Controls which sources in a mail message can contribute tokens (e.g.
+ words, phrases, etc.) to a Bayes classifier. The argument is a
+ space-separated list of keywords: *header*, *visible*, *invisible*,
+ *uri*, *mimepart*), each of which may be prefixed by a *no* to
+ indicate its exclusion. Additionally two reserved keywords are
+ allowed: *all* and *none* (or: *noall*). The list of keywords is
+ processed sequentially: a keyword *all* adds all available keywords
+ to a set being built, a *none* or *noall* clears the set, other
+ non-negated keywords are added to the set, and negated keywords are
+ removed from the set. Keywords are case-insensitive.
+
+ The default set is: *header* *visible* *invisible* *uri*, which is
+ equivalent for example to: *All* *NoMIMEpart*. The reason why
+ *mimepart* is not currently in a default set is that it is a newer
+ source (introduced with SpamAssassin version 3.4.1) and not much
+ experience has yet been gathered regarding its usefulness.
+
+ See also option "bayes_ignore_header" for a fine-grained control on
+ individual header fields under the umbrella of a more general
+ keyword *header* here.
+
+ Keywords imply the following data sources:
+
+ *header* - tokens collected from a message header section
+ *visible* - words from visible text (plain or HTML) in a message
+ body
+ *invisible* - hidden/invisible text in HTML parts of a message body
+ *uri* - URIs collected from a message body
+ *mimepart* - digests (hashes) of all MIME parts (textual or
+ non-textual) of a message, computed after Base64 and
+ quoted-printable decoding, suffixed by their Content-Type
+ *all* - adds all the above keywords to the set being assembled
+ *none* or *noall* - removes all keywords from the set
+
+ The "bayes_token_sources" directive may appear multiple times, its
+ keywords are interpreted sequentially, adding or removing items from
+ the final set as they appear in their order in "bayes_token_sources"
+ directive(s).
+
+ bayes_ignore_header header_name
+ If you receive mail filtered by upstream mail systems, like a
+ spam-filtering ISP or mailing list, and that service adds new
+ headers (as most of them do), these headers may provide
+ inappropriate cues to the Bayesian classifier, allowing it to take a
+ "short cut". To avoid this, list the headers using this setting.
+ Example:
+
+ bayes_ignore_header X-Upstream-Spamfilter
+ bayes_ignore_header X-Upstream-SomethingElse
+
+ bayes_ignore_from user@example.com
+ Bayesian classification and autolearning will not be performed on
+ mail from the listed addresses. Program "sa-learn" will also ignore
+ the listed addresses if it is invoked using the "--use-ignores"
+ option. One or more addresses can be listed, see "whitelist_from".
+
+ Spam messages from certain senders may contain many words that
+ frequently occur in ham. For example, one might read messages from a
+ preferred bookstore but also get unwanted spam messages from other
+ bookstores. If the unwanted messages are learned as spam then any
+ messages discussing books, including the preferred bookstore and
+ antiquarian messages would be in danger of being marked as spam. The
+ addresses of the annoying bookstores would be listed. (Assuming they
+ were halfway legitimate and didn't send you mail through myriad
+ affiliates.)
+
+ Those who have pieces of spam in legitimate messages or otherwise
+ receive ham messages containing potentially spammy words might fear
+ that some spam messages might be in danger of being marked as ham.
+ The addresses of the spam mailing lists, correspondents, etc. would
+ be listed.
+
+ bayes_ignore_to user@example.com
+ Bayesian classification and autolearning will not be performed on
+ mail to the listed addresses. See "bayes_ignore_from" for details.
+
+ bayes_min_ham_num (Default: 200)
+ bayes_min_spam_num (Default: 200)
+ To be accurate, the Bayes system does not activate until a certain
+ number of ham (non-spam) and spam have been learned. The default is
+ 200 of each ham and spam, but you can tune these up or down with
+ these two settings.
+
+ bayes_learn_during_report (Default: 1)
+ The Bayes system will, by default, learn any reported messages
+ ("spamassassin -r") as spam. If you do not want this to happen, set
+ this option to 0.
+
+ bayes_sql_override_username
+ Used by BayesStore::SQL storage implementation.
+
+ If this options is set the BayesStore::SQL module will override the
+ set username with the value given. This could be useful for
+ implementing global or group bayes databases.
+
+ bayes_use_hapaxes (default: 1)
+ Should the Bayesian classifier use hapaxes (words/tokens that occur
+ only once) when classifying? This produces significantly better
+ hit-rates.
+
+ bayes_journal_max_size (default: 102400)
+ SpamAssassin will opportunistically sync the journal and the
+ database. It will do so once a day, but will sync more often if the
+ journal file size goes above this setting, in bytes. If set to 0,
+ opportunistic syncing will not occur.
+
+ bayes_expiry_max_db_size (default: 150000)
+ What should be the maximum size of the Bayes tokens database? When
+ expiry occurs, the Bayes system will keep either 75% of the maximum
+ value, or 100,000 tokens, whichever has a larger value. 150,000
+ tokens is roughly equivalent to a 8Mb database file.
+
+ bayes_auto_expire (default: 1)
+ If enabled, the Bayes system will try to automatically expire old
+ tokens from the database. Auto-expiry occurs when the number of
+ tokens in the database surpasses the bayes_expiry_max_db_size value.
+ If a bayes datastore backend does not implement individual key/value
+ expirations, the setting is silently ignored.
+
+ bayes_token_ttl (default: 3w, i.e. 3 weeks)
+ Time-to-live / expiration time in seconds for tokens kept in a Bayes
+ database. A numeric value is optionally suffixed by a time unit (s,
+ m, h, d, w, indicating seconds (default), minutes, hours, days,
+ weeks).
+
+ If bayes_auto_expire is true and a Bayes datastore backend supports
+ it (currently only Redis), this setting controls deletion of expired
+ tokens from a bayes database. The value is observed on a best-effort
+ basis, exact timing promises are not necessarily kept. If a bayes
+ datastore backend does not implement individual key/value
+ expirations, the setting is silently ignored.
+
+ bayes_seen_ttl (default: 8d, i.e. 8 days)
+ Time-to-live / expiration time in seconds for 'seen' entries (i.e.
+ mail message digests with their status) kept in a Bayes database. A
+ numeric value is optionally suffixed by a time unit (s, m, h, d, w,
+ indicating seconds (default), minutes, hours, days, weeks).
+
+ If bayes_auto_expire is true and a Bayes datastore backend supports
+ it (currently only Redis), this setting controls deletion of expired
+ 'seen' entries from a bayes database. The value is observed on a
+ best-effort basis, exact timing promises are not necessarily kept.
+ If a bayes datastore backend does not implement individual key/value
+ expirations, the setting is silently ignored.
+
+ bayes_learn_to_journal (default: 0)
+ If this option is set, whenever SpamAssassin does Bayes learning, it
+ will put the information into the journal instead of directly into
+ the database. This lowers contention for locking the database to
+ execute an update, but will also cause more access to the journal
+ and cause a delay before the updates are actually committed to the
+ Bayes database.
+
+ MISCELLANEOUS OPTIONS
+ time_limit n (default: 300)
+ Specifies a limit on elapsed time in seconds that SpamAssassin is
+ allowed to spend before providing a result. The value may be
+ fractional and must not be negative, zero is interpreted as
+ unlimited. The default is 300 seconds for consistency with the spamd
+ default setting of --timeout-child .
+
+ This is a best-effort advisory setting, processing will not be
+ abruptly aborted at an arbitrary point in processing when the time
+ limit is exceeded, but only on reaching one of locations in the
+ program flow equipped with a time test. Currently equipped with the
+ test are the main checking loop, asynchronous DNS lookups, plugins
+ which are calling external programs. Rule evaluation is guarded by
+ starting a timer (alarm) on each set of compiled rules.
+
+ When a message is passed to Mail::SpamAssassin::parse, a deadline
+ time is established as a sum of current time and the "time_limit"
+ setting.
+
+ This deadline may also be specified by a caller through an option
+ 'master_deadline' in $suppl_attrib on a call to parse(), possibly
+ providing a more accurate deadline taking into account past and
+ expected future processing of a message in a mail filtering setup.
+ If both the config option as well as a 'master_deadline' option in a
+ call are provided, the shorter time limit of the two is used (since
+ version 3.3.2). Note that spamd (and possibly third-party callers of
+ SpamAssassin) will supply the 'master_deadline' option in a call
+ based on its --timeout-child option (or equivalent), unlike the
+ command line "spamassassin", which has no such command line option.
+
+ When a time limit is exceeded, most of the remaining tests will be
+ skipped, as well as auto-learning. Whatever tests fired so far will
+ determine the final score. The behaviour is similar to
+ short-circuiting with attribute 'on', as implemented by a
+ Shortcircuit plugin. A synthetic hit on a rule named
+ TIME_LIMIT_EXCEEDED with a near-zero default score is generated, so
+ that the report will reflect the event. A score for
+ TIME_LIMIT_EXCEEDED may be provided explicitly in a configuration
+ file, for example to achieve whitelisting or blacklisting effect for
+ messages with long processing times.
+
+ The "time_limit" option is a useful protection against excessive
+ processing time on certain degenerate or unusually long or complex
+ mail messages, as well as against some DoS attacks. It is also
+ needed in time-critical pre-queue filtering setups (e.g. milter,
+ proxy, integration with MTA), where message processing must finish
+ before a SMTP client times out. RFC 5321 prescribes in section
+ 4.5.3.2.6 the 'DATA Termination' time limit of 10 minutes, although
+ it is not unusual to see some SMTP clients abort sooner on waiting
+ for a response. A sensible "time_limit" for a pre-queue filtering
+ setup is maybe 50 seconds, assuming that clients are willing to wait
+ at least a minute.
+
+ lock_method type
+ Select the file-locking method used to protect database files
+ on-disk. By default, SpamAssassin uses an NFS-safe locking method on
+ UNIX; however, if you are sure that the database files you'll be
+ using for Bayes and AWL storage will never be accessed over NFS, a
+ non-NFS-safe locking system can be selected.
+
+ This will be quite a bit faster, but may risk file corruption if the
+ files are ever accessed by multiple clients at once, and one or more
+ of them is accessing them through an NFS filesystem.
+
+ Note that different platforms require different locking systems.
+
+ The supported locking systems for "type" are as follows:
+
+ *nfssafe* - an NFS-safe locking system
+ *flock* - simple UNIX "flock()" locking
+ *win32* - Win32 locking using "sysopen (..., O_CREAT|O_EXCL)".
+
+ nfssafe and flock are only available on UNIX, and win32 is only
+ available on Windows. By default, SpamAssassin will choose either
+ nfssafe or win32 depending on the platform in use.
+
+ fold_headers ( 0 | 1 ) (default: 1)
+ By default, headers added by SpamAssassin will be whitespace folded.
+ In other words, they will be broken up into multiple lines instead
+ of one very long one and each continuation line will have a
+ tabulator prepended to mark it as a continuation of the preceding
+ one.
+
+ The automatic wrapping can be disabled here. Note that this can
+ generate very long lines. RFC 2822 required that header lines do not
+ exceed 998 characters (not counting the final CRLF).
+
+ report_safe_copy_headers header_name ...
+ If using "report_safe", a few of the headers from the original
+ message are copied into the wrapper header (From, To, Cc, Subject,
+ Date, etc.) If you want to have other headers copied as well, you
+ can add them using this option. You can specify multiple headers on
+ the same line, separated by spaces, or you can just use multiple
+ lines.
+
+ envelope_sender_header Name-Of-Header
+ SpamAssassin will attempt to discover the address used in the 'MAIL
+ FROM:' phase of the SMTP transaction that delivered this message, if
+ this data has been made available by the SMTP server. This is used
+ in the "EnvelopeFrom" pseudo-header, and for various rules such as
+ SPF checking.
+
+ By default, various MTAs will use different headers, such as the
+ following:
+
+ X-Envelope-From
+ Envelope-Sender
+ X-Sender
+ Return-Path
+
+ SpamAssassin will attempt to use these, if some heuristics (such as
+ the header placement in the message, or the absence of fetchmail
+ signatures) appear to indicate that they are safe to use. However,
+ it may choose the wrong headers in some mailserver configurations.
+ (More discussion of this can be found in bug 2142 and bug 4747 in
+ the SpamAssassin BugZilla.)
+
+ To avoid this heuristic failure, the "envelope_sender_header"
+ setting may be helpful. Name the header that your MTA or MDA adds to
+ messages containing the address used at the MAIL FROM step of the
+ SMTP transaction.
+
+ If the header in question contains "<" or ">" characters at the
+ start and end of the email address in the right-hand side, as in the
+ SMTP transaction, these will be stripped.
+
+ If the header is not found in a message, or if it's value does not
+ contain an "@" sign, SpamAssassin will issue a warning in the logs
+ and fall back to its default heuristics.
+
+ (Note for MTA developers: we would prefer if the use of a single
+ header be avoided in future, since that precludes 'downstream' spam
+ scanning.
+ "http://wiki.apache.org/spamassassin/EnvelopeSenderInReceived"
+ details a better proposal, storing the envelope sender at each hop
+ in the "Received" header.)
+
+ example:
+
+ envelope_sender_header X-SA-Exim-Mail-From
+
+ describe SYMBOLIC_TEST_NAME description ...
+ Used to describe a test. This text is shown to users in the detailed
+ report.
+
+ Note that test names which begin with '__' are reserved for
+ meta-match sub-rules, and are not scored or listed in the 'tests
+ hit' reports.
+
+ Also note that by convention, rule descriptions should be limited in
+ length to no more than 50 characters.
+
+ report_charset CHARSET (default: unset)
+ Set the MIME Content-Type charset used for the text/plain report
+ which is attached to spam mail messages.
+
+ report ...some text for a report...
+ Set the report template which is attached to spam mail messages. See
+ the "10_default_prefs.cf" configuration file in
+ "/usr/share/spamassassin" for an example.
+
+ If you change this, try to keep it under 78 columns. Each "report"
+ line appends to the existing template, so use
+ "clear_report_template" to restart.
+
+ Tags can be included as explained above.
+
+ clear_report_template
+ Clear the report template.
+
+ report_contact ...text of contact address...
+ Set what _CONTACTADDRESS_ is replaced with in the above report text.
+ By default, this is 'the administrator of that system', since the
+ hostname of the system the scanner is running on is also included.
+
+ report_hostname ...hostname to use...
+ Set what _HOSTNAME_ is replaced with in the above report text. By
+ default, this is determined dynamically as whatever the host running
+ SpamAssassin calls itself.
+
+ unsafe_report ...some text for a report...
+ Set the report template which is attached to spam mail messages
+ which contain a non-text/plain part. See the "10_default_prefs.cf"
+ configuration file in "/usr/share/spamassassin" for an example.
+
+ Each "unsafe-report" line appends to the existing template, so use
+ "clear_unsafe_report_template" to restart.
+
+ Tags can be used in this template (see above for details).
+
+ clear_unsafe_report_template
+ Clear the unsafe_report template.
+
+ mbox_format_from_regex
+ Set a specific regular expression to be used for mbox file From
+ separators.
+
+ For example, this setting will allow sa-learn to process emails
+ stored in a kmail 2 mbox:
+
+ mbox_format_from_regex /^From \S+ ?[[:upper:]][[:lower:]]{2}(?:,
+ \d\d [[:upper:]][[:lower:]]{2} \d{4} [0-2]\d:\d\d:\d\d [+-]\d{4}|
+ [[:upper:]][[:lower:]]{2} [ 1-3]\d [ 0-2]\d:\d\d:\d\d \d{4})/
+
+ parse_dkim_uris ( 0 | 1 ) (default: 1)
+ If this option is set to 1 and the message contains DKIM headers,
+ the headers will be parsed for URIs to process alongside URIs found
+ in the body with some rules and modules (ex. URIDNSBL)
+
+RULE DEFINITIONS AND PRIVILEGED SETTINGS
+ These settings differ from the ones above, in that they are considered
+ 'privileged'. Only users running "spamassassin" from their procmailrc's
+ or forward files, or sysadmins editing a file in
+ "/etc/mail/spamassassin", can use them. "spamd" users cannot use them in
+ their "user_prefs" files, for security and efficiency reasons, unless
+ "allow_user_rules" is enabled (and then, they may only add rules from
+ below).
+
+ allow_user_rules ( 0 | 1 ) (default: 0)
+ This setting allows users to create rules (and only rules) in their
+ "user_prefs" files for use with "spamd". It defaults to off, because
+ this could be a severe security hole. It may be possible for users
+ to gain root level access if "spamd" is run as root. It is NOT a
+ good idea, unless you have some other way of ensuring that users'
+ tests are safe. Don't use this unless you are certain you know what
+ you are doing. Furthermore, this option causes spamassassin to
+ recompile all the tests each time it processes a message for a user
+ with a rule in his/her "user_prefs" file, which could have a
+ significant effect on server load. It is not recommended.
+
+ Note that it is not currently possible to use "allow_user_rules" to
+ modify an existing system rule from a "user_prefs" file with
+ "spamd".
+
+ redirector_pattern /pattern/modifiers
+ A regex pattern that matches both the redirector site portion, and
+ the target site portion of a URI.
+
+ Note: The target URI portion must be surrounded in parentheses and
+ no other part of the pattern may create a backreference.
+
+ Example:
+ http://chkpt.zdnet.com/chkpt/whatever/spammer.domain/yo/dude
+
+ redirector_pattern /^https?:\/\/(?:opt\.)?chkpt\.zdnet\.com\/chkpt\/\w+\/(.*)$/i
+
+ header SYMBOLIC_TEST_NAME header op /pattern/modifiers [if-unset:
+ STRING]
+ Define a test. "SYMBOLIC_TEST_NAME" is a symbolic test name, such as
+ 'FROM_ENDS_IN_NUMS'. "header" is the name of a mail header field,
+ such as 'Subject', 'To', 'From', etc. Header field names are matched
+ case-insensitively (conforming to RFC 5322 section 1.2.2), except
+ for all-capitals metaheader fields such as ALL, MESSAGEID,
+ ALL-TRUSTED.
+
+ Appending a modifier ":raw" to a header field name will inhibit
+ decoding of quoted-printable or base-64 encoded strings, and will
+ preserve all whitespace inside the header string. The ":raw" may
+ also be applied to pseudo-headers e.g. "ALL:raw" will return a
+ pristine (unmodified) header section.
+
+ Appending a modifier ":addr" to a header field name will cause
+ everything except the first email address to be removed from the
+ header field. It is mainly applicable to header fields 'From',
+ 'Sender', 'To', 'Cc' along with their 'Resent-*' counterparts, and
+ the 'Return-Path'.
+
+ Appending a modifier ":name" to a header field name will cause
+ everything except the first display name to be removed from the
+ header field. It is mainly applicable to header fields containing a
+ single mail address: 'From', 'Sender', along with their
+ 'Resent-From' and 'Resent-Sender' counterparts.
+
+ It is syntactically permitted to append more than one modifier to a
+ header field name, although currently most combinations achieve no
+ additional effect, for example "From:addr:raw" or "From:raw:addr" is
+ currently the same as "From:addr" .
+
+ For example, appending ":addr" to a header name will result in
+ example@foo in all of the following cases:
+
+ example@foo
+ example@foo (Foo Blah)
+ example@foo, example@bar
+ display: example@foo (Foo Blah), example@bar ;
+ Foo Blah <example@foo>
+ "Foo Blah" <example@foo>
+ "'Foo Blah'" <example@foo>
+
+ For example, appending ":name" to a header name will result in "Foo
+ Blah" (without quotes) in all of the following cases:
+
+ example@foo (Foo Blah)
+ example@foo (Foo Blah), example@bar
+ display: example@foo (Foo Blah), example@bar ;
+ Foo Blah <example@foo>
+ "Foo Blah" <example@foo>
+ "'Foo Blah'" <example@foo>
+
+ There are several special pseudo-headers that can be specified:
+
+ "ALL" can be used to mean the text of all the message's headers.
+ Note that all whitespace inside the headers, at line folds, is
+ currently compressed into a single space (' ') character. To obtain
+ a pristine (unmodified) header section, use "ALL:raw" - the :raw
+ modifier is documented above. Also similar that return headers added
+ by specific relays: ALL-TRUSTED, ALL-INTERNAL, ALL-UNTRUSTED,
+ ALL-EXTERNAL.
+ "ToCc" can be used to mean the contents of both the 'To' and 'Cc'
+ headers.
+ "EnvelopeFrom" is the address used in the 'MAIL FROM:' phase of the
+ SMTP transaction that delivered this message, if this data has been
+ made available by the SMTP server. See "envelope_sender_header" for
+ more information on how to set this.
+ "MESSAGEID" is a symbol meaning all Message-Id's found in the
+ message; some mailing list software moves the real 'Message-Id' to
+ 'Resent-Message-Id' or to 'X-Message-Id', then uses its own one in
+ the 'Message-Id' header. The value returned for this symbol is the
+ text from all 3 headers, separated by newlines.
+ "X-Spam-Relays-Untrusted", "X-Spam-Relays-Trusted",
+ "X-Spam-Relays-Internal" and "X-Spam-Relays-External" represent a
+ portable, pre-parsed representation of the message's network path,
+ as recorded in the Received headers, divided into 'trusted' vs
+ 'untrusted' and 'internal' vs 'external' sets. See
+ "http://wiki.apache.org/spamassassin/TrustedRelays" for more
+ details.
+
+ "op" is either "=~" (contains regular expression) or "!~" (does not
+ contain regular expression), and "pattern" is a valid Perl regular
+ expression, with "modifiers" as regexp modifiers in the usual style.
+ Note that multi-line rules are not supported, even if you use "x" as
+ a modifier. Also note that the "#" character must be escaped ("\#")
+ or else it will be considered to be the start of a comment and not
+ part of the regexp.
+
+ If the header specified matches multiple headers, their text will be
+ concatenated with embedded \n's. Therefore you may wish to use "/m"
+ if you use "^" or "$" in your regular expression.
+
+ If the "[if-unset: STRING]" tag is present, then "STRING" will be
+ used if the header is not found in the mail message.
+
+ Test names must not start with a number, and must contain only
+ alphanumerics and underscores. It is suggested that lower-case
+ characters not be used, and names have a length of no more than 22
+ characters, as an informal convention. Dashes are not allowed.
+
+ Note that test names which begin with '__' are reserved for
+ meta-match sub-rules, and are not scored or listed in the 'tests
+ hit' reports. Test names which begin with 'T_' are reserved for
+ tests which are undergoing QA, and these are given a very low score.
+
+ If you add or modify a test, please be sure to run a sanity check
+ afterwards by running "spamassassin --lint". This will avoid
+ confusing error messages, or other tests being skipped as a
+ side-effect.
+
+ header SYMBOLIC_TEST_NAME exists:header_field_name
+ Define a header field existence test. "header_field_name" is the
+ name of a header field to test for existence. Not to be confused
+ with a test for a nonempty header field body, which can be
+ implemented by a "header SYMBOLIC_TEST_NAME header =~ /\S/" rule as
+ described above.
+
+ header SYMBOLIC_TEST_NAME eval:name_of_eval_method([arguments])
+ Define a header eval test. "name_of_eval_method" is the name of a
+ method registered by a "Mail::SpamAssassin::Plugin" object.
+ "arguments" are optional arguments to the function call.
+
+ header SYMBOLIC_TEST_NAME eval:check_rbl('set', 'zone' [, 'sub-test'])
+ Check a DNSBL (a DNS blacklist or whitelist). This will retrieve
+ Received: headers from the message, extract the IP addresses, select
+ which ones are 'untrusted' based on the "trusted_networks" logic,
+ and query that DNSBL zone. There's a few things to note:
+
+ duplicated or private IPs
+ Duplicated IPs are only queried once and reserved IPs are not
+ queried. Private IPs are those listed in
+ <https://www.iana.org/assignments/ipv4-address-space>,
+ <http://duxcw.com/faq/network/privip.htm>,
+ <http://duxcw.com/faq/network/autoip.htm>, or
+ <https://tools.ietf.org/html/rfc5735> as private.
+
+ the 'set' argument
+ This is used as a 'zone ID'. If you want to look up a
+ multiple-meaning zone like SORBS, you can then query the results
+ from that zone using it; but all check_rbl_sub() calls must use
+ that zone ID.
+
+ Also, if more than one IP address gets a DNSBL hit for a
+ particular rule, it does not affect the score because rules only
+ trigger once per message.
+
+ the 'zone' argument
+ This is the root zone of the DNSBL.
+
+ The domain name is considered to be a fully qualified domain
+ name (i.e. not subject to DNS resolver's search or default
+ domain options). No trailing period is needed, and will be
+ removed if specified.
+
+ the 'sub-test' argument
+ This optional argument behaves the same as the sub-test argument
+ in "check_rbl_sub()" below.
+
+ selecting all IPs except for the originating one
+ This is accomplished by placing '-notfirsthop' at the end of the
+ set name. This is useful for querying against DNS lists which
+ list dialup IP addresses; the first hop may be a dialup, but as
+ long as there is at least one more hop, via their outgoing SMTP
+ server, that's legitimate, and so should not gain points. If
+ there is only one hop, that will be queried anyway, as it should
+ be relaying via its outgoing SMTP server instead of sending
+ directly to your MX (mail exchange).
+
+ selecting IPs by whether they are trusted
+ When checking a 'nice' DNSBL (a DNS whitelist), you cannot trust
+ the IP addresses in Received headers that were not added by
+ trusted relays. To test the first IP address that can be
+ trusted, place '-firsttrusted' at the end of the set name. That
+ should test the IP address of the relay that connected to the
+ most remote trusted relay.
+
+ Note that this requires that SpamAssassin know which relays are
+ trusted. For simple cases, SpamAssassin can make a good
+ estimate. For complex cases, you may get better results by
+ setting "trusted_networks" manually.
+
+ In addition, you can test all untrusted IP addresses by placing
+ '-untrusted' at the end of the set name. Important note -- this
+ does NOT include the IP address from the most recent 'untrusted
+ line', as used in '-firsttrusted' above. That's because we're
+ talking about the trustworthiness of the IP address data, not
+ the source header line, here; and in the case of the most recent
+ header (the 'firsttrusted'), that data can be trusted. See the
+ Wiki page at "http://wiki.apache.org/spamassassin/TrustedRelays"
+ for more information on this.
+
+ Selecting just the last external IP
+ By using '-lastexternal' at the end of the set name, you can
+ select only the external host that connected to your internal
+ network, or at least the last external host with a public IP.
+
+ header SYMBOLIC_TEST_NAME eval:check_rbl_txt('set', 'zone')
+ Same as check_rbl(), except querying using IN TXT instead of IN A
+ records. If the zone supports it, it will result in a line of text
+ describing why the IP is listed, typically a hyperlink to a database
+ entry.
+
+ header SYMBOLIC_TEST_NAME eval:check_rbl_sub('set', 'sub-test')
+ Create a sub-test for 'set'. If you want to look up a multi-meaning
+ zone like relays.osirusoft.com, you can then query the results from
+ that zone using the zone ID from the original query. The sub-test
+ may either be an IPv4 dotted address for RBLs that return multiple A
+ records, or a non-negative decimal number to specify a bitmask for
+ RBLs that return a single A record containing a bitmask of results,
+ or a regular expression.
+
+ Note: the set name must be exactly the same for as the main query
+ rule, including selections like '-notfirsthop' appearing at the end
+ of the set name.
+
+ body SYMBOLIC_TEST_NAME /pattern/modifiers
+ Define a body pattern test. "pattern" is a Perl regular expression.
+ Note: as per the header tests, "#" must be escaped ("\#") or else it
+ is considered the beginning of a comment.
+
+ The 'body' in this case is the textual parts of the message body;
+ any non-text MIME parts are stripped, and the message decoded from
+ Quoted-Printable or Base-64-encoded format if necessary. Parts
+ declared as text/html will be rendered from HTML to text.
+
+ All body paragraphs (double-newline-separated blocks text) are
+ turned into a line breaks removed, whitespace normalized single
+ line. Any lines longer than 2kB are split into shorter separate
+ lines (from a boundary when possible), this may unexpectedly prevent
+ pattern from matching. Patterns are matched independently against
+ each of these lines.
+
+ Note that by default the message Subject header is considered part
+ of the body and becomes the first line when running the rules. If
+ you don't want to match Subject along with body text, use "tflags
+ RULENAME nosubject".
+
+ body SYMBOLIC_TEST_NAME eval:name_of_eval_method([args])
+ Define a body eval test. See above.
+
+ uri SYMBOLIC_TEST_NAME /pattern/modifiers
+ Define a uri pattern test. "pattern" is a Perl regular expression.
+ Note: as per the header tests, "#" must be escaped ("\#") or else it
+ is considered the beginning of a comment.
+
+ The 'uri' in this case is a list of all the URIs in the body of the
+ email, and the test will be run on each and every one of those URIs,
+ adjusting the score if a match is found. Use this test instead of
+ one of the body tests when you need to match a URI, as it is more
+ accurately bound to the start/end points of the URI, and will also
+ be faster.
+
+ rawbody SYMBOLIC_TEST_NAME /pattern/modifiers
+ Define a raw-body pattern test. "pattern" is a Perl regular
+ expression. Note: as per the header tests, "#" must be escaped
+ ("\#") or else it is considered the beginning of a comment.
+
+ The 'raw body' of a message is the raw data inside all textual
+ parts. The text will be decoded from base64 or quoted-printable
+ encoding, but HTML tags and line breaks will still be present.
+ Multiline expressions will need to be used to match strings that are
+ broken by line breaks.
+
+ Note that the text is split into 2-4kB chunks (from a word boundary
+ when possible), this may unexpectedly prevent pattern from matching.
+ Patterns are matched independently against each of these chunks.
+
+ rawbody SYMBOLIC_TEST_NAME eval:name_of_eval_method([args])
+ Define a raw-body eval test. See above.
+
+ full SYMBOLIC_TEST_NAME /pattern/modifiers
+ Define a full message pattern test. "pattern" is a Perl regular
+ expression. Note: as per the header tests, "#" must be escaped
+ ("\#") or else it is considered the beginning of a comment.
+
+ The full message is the pristine message headers plus the pristine
+ message body, including all MIME data such as images, other
+ attachments, MIME boundaries, etc.
+
+ full SYMBOLIC_TEST_NAME eval:name_of_eval_method([args])
+ Define a full message eval test. See above.
+
+ meta SYMBOLIC_TEST_NAME boolean expression
+ Define a boolean expression test in terms of other tests that have
+ been hit or not hit. For example:
+
+ meta META1 TEST1 && !(TEST2 || TEST3)
+
+ Note that English language operators ("and", "or") will be treated
+ as rule names, and that there is no "XOR" operator.
+
+ meta SYMBOLIC_TEST_NAME boolean arithmetic expression
+ Can also define an arithmetic expression in terms of other tests,
+ with an unhit test having the value "0" and a hit test having a
+ nonzero value. The value of a hit meta test is that of its
+ arithmetic expression. The value of a hit eval test is that returned
+ by its method. The value of a hit header, body, rawbody, uri, or
+ full test which has the "multiple" tflag is the number of times the
+ test hit. The value of any other type of hit test is "1".
+
+ For example:
+
+ meta META2 (3 * TEST1 - 2 * TEST2) > 0
+
+ Note that Perl builtins and functions, like "abs()", can't be used,
+ and will be treated as rule names.
+
+ If you want to define a meta-rule, but do not want its individual
+ sub-rules to count towards the final score unless the entire
+ meta-rule matches, give the sub-rules names that start with '__'
+ (two underscores). SpamAssassin will ignore these for scoring.
+
+ meta SYMBOLIC_TEST_NAME ... rules_matching(RULEGLOB) ...
+ Special function that will expand to list of matching rulenames. Can
+ be used anywhere in expressions. Argument supports glob style

[... 654 lines stripped ...]