Provided by: spamassassin_4.0.0-8ubuntu5_all bug

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/spamassassin" directories.

       The following web page lists the most important configuration settings used to configure SpamAssassin;
       novices are encouraged to read it first:

         https://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.

   WELCOMELIST AND BLOCKLIST OPTIONS
       welcomelist_from user@example.com
           Previously whitelist_from which will work interchangeably until 4.1.

           Used to welcomelist 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
           "welcomelist_auth" or other authenticated welcomelisting methods, or "welcomelist_from_rcvd".

           Welcomelist  and  blocklist  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 "welcomelist_from" lines are  also
           OK.

           The  headers  checked  for  welcomelist  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.

             welcomelist_from joe@example.com fred@example.com
             welcomelist_from *@example.com

       unwelcomelist_from user@example.com
           Previously unwelcomelist_from which will work interchangeably until 4.1.

           Used  to  remove a default welcomelist_from entry, so for example a distribution welcomelist_from can
           be overridden in a local.cf file, or an individual user can  override  a  welcomelist_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 welcomelist_from line, which implies that a  wildcard
           only matches literally the same wildcard (not 'any' address).

           e.g.

             unwelcomelist_from joe@example.com fred@example.com
             unwelcomelist_from *@example.com

       welcomelist_from_rcvd addr@lists.sourceforge.net sourceforge.net
           Previously whitelist_from_rcvd which will work interchangeably until 4.1.

           Works  similarly to welcomelist_from, except that in addition to matching a sender address, a relay's
           rDNS name or its IP address must match too for the welcomelisting rule to fire. The  first  parameter
           is a sender's e-mail address to welcomelist, 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.

             welcomelist_from_rcvd joe@example.com  example.com
             welcomelist_from_rcvd *@*              mail.example.org
             welcomelist_from_rcvd *@axkit.org      [192.0.2.123]
             welcomelist_from_rcvd *@axkit.org      [192.0.2.0/24]
             welcomelist_from_rcvd *@axkit.org      [192.0.2.0]/24
             welcomelist_from_rcvd *@axkit.org      [2001:db8:1234::/48]
             welcomelist_from_rcvd *@axkit.org      [2001:db8:1234::]/48

       def_welcomelist_from_rcvd addr@lists.sourceforge.net sourceforge.net
           Previously def_whitelist_from_rcvd which will work interchangeably until 4.1.

           Same as "welcomelist_from_rcvd", but used for the default welcomelist  entries  in  the  SpamAssassin
           distribution.  The welcomelist score is lower, because these are often targets for spammer spoofing.

       welcomelist_allows_relays user@example.com
           Previously whitelist_allows_relays which will work interchangeably until 4.1.

           Specify addresses which are in "welcomelist_from_rcvd" that sometimes send through a mail relay other
           than  the  listed  ones.  By default mail with a From address that is in "welcomelist_from_rcvd" that
           does  not  match  the   relay   will   trigger   a   forgery   rule.   Including   the   address   in
           "welcomelist_allows_relay" prevents that.

           Welcomelist  and  blocklist  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 "welcomelist_allows_relays"  lines
           are also OK.

           The  specified  email  address  does  not  have  to  match  exactly  the address previously used in a
           welcomelist_from_rcvd line as it is compared to the address in the header.

           e.g.

             welcomelist_allows_relays joe@example.com fred@example.com
             welcomelist_allows_relays *@example.com

       unwelcomelist_from_rcvd user@example.com
           Previously unwhitelist_from_rcvd which will work interchangeably until 4.1.

           Used to remove a default welcomelist_from_rcvd or def_welcomelist_from_rcvd entry, so for  example  a
           distribution  welcomelist_from_rcvd  can  be overridden in a local.cf file, or an individual user can
           override a welcomelist_from_rcvd entry in their own "user_prefs" file.

           The  specified  email  address  has  to  match   exactly   the   address   previously   used   in   a
           welcomelist_from_rcvd line.

           e.g.

             unwelcomelist_from_rcvd joe@example.com fred@example.com
             unwelcomelist_from_rcvd *@axkit.org

       blocklist_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 "welcomelist_from".

       unblocklist_from user@example.com
           Previously unblacklist_from which will work interchangeably until 4.1.

           Used to remove a default blocklist_from entry, so for example a distribution  blocklist_from  can  be
           overridden in a local.cf file, or an individual user can override a blocklist_from entry in their own
           "user_prefs"  file. The specified email address has to match exactly the address previously used in a
           blocklist_from line.

           e.g.

             unblocklist_from joe@example.com fred@example.com
             unblocklist_from *@spammer.com

       welcomelist_to user@example.com
           Previously whitelist_to which will work interchangeably until 4.1.

           If the given address appears as a recipient in  the  message  headers  (Resent-To,  To,  Cc,  obvious
           envelope  recipient,  etc.)  the  mail  will  be  listed  as  allowed.   Useful  if  you're deploying
           SpamAssassin system-wide, and don't want some users to have their  mail  filtered.   Same  format  as
           "welcomelist_from".

           There  are  three  levels  of  To-welcomelisting, "welcomelist_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 welcomelist 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.

       blocklist_to user@example.com
           Previously blacklist_auth which will work interchangeably until 4.1.

           If  the  given  address  appears  as  a  recipient in the message headers (Resent-To, To, Cc, obvious
           envelope recipient, etc.) the mail will be blocklisted.  Same format as "blocklist_from".

       welcomelist_auth user@example.com
           Previously whitelist_auth which will work interchangeably until 4.1.

           Used to specify addresses which send mail that is  often  tagged  (incorrectly)  as  spam.   This  is
           different  from  "welcomelist_from"  and  "welcomelist_from_rcvd"  in that it first verifies that the
           message was sent by an authorized sender for the address, before welcomelisting.

           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 "welcomelist_auth"  is  roughly  equivalent  to  specifying  duplicate  "welcomelist_from_spf",
           "welcomelist_from_dk", and "welcomelist_from_dkim" lines for each of the addresses specified.

           e.g.

             welcomelist_auth joe@example.com fred@example.com
             welcomelist_auth *@example.com

       def_welcomelist_auth user@example.com
           Previously def_whitelist_auth which will work interchangeably until 4.1.

           Same  as  "welcomelist_auth",  but  used  for  the  default  welcomelist  entries in the SpamAssassin
           distribution.  The welcomelist score is lower, because these are often targets for spammer spoofing.

       unwelcomelist_auth user@example.com
           Previously unwhitelist_auth which will work interchangeably until 4.1.

           Used to remove a "welcomelist_auth" or "def_welcomelist_auth" entry. The specified email address  has
           to match exactly the address previously used.

           e.g.

             unwelcomelist_auth joe@example.com fred@example.com
             unwelcomelist_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 'BLOCK' and 'WELCOME' have their shorthand directives blocklist_uri_host and
           welcomelist_uri_host and corresponding default  rules,  but  the  names  'BLOCK'  and  'WELCOME'  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  blocklist_to  is  synonymous  to  using  the  directive
           blocklist_to.

           Enlisting  an  address  to  the  list  named  blocklist_from  is  synonymous  to  using the directive
           blocklist_from.

           Enlisting an address  to  the  list  named  welcomelist_to  is  synonymous  to  using  the  directive
           welcomelist_to.

           Enlisting  an  address  to  the  list  named  welcomelist_from  is  synonymous to using the directive
           welcomelist_from.

           e.g.

             enlist_addrlist (PAYPAL_ADDRESS) service@paypal.com
             enlist_addrlist (PAYPAL_ADDRESS) *@paypal.co.uk

       blocklist_uri_host host-or-domain ...
           Previously blacklist_uri_host which will work interchangeably until 4.1.

           Is a shorthand for a directive:  enlist_uri_host (BLOCK) host ...

           Please see directives enlist_uri_host and delist_uri_host for details.

       welcomelist_uri_host host-or-domain ...
           Previously whitelist_uri_host which will work interchangeably until 4.1.

           Is a shorthand for a directive:  enlist_uri_host (WELCOME) 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 when the glue between the MTA and SpamAssassin rewrites the email content.

           Here is an example on how to use this feature:

                   rewrite_header Subject *****SPAM*****
                   add_header all Subjprefix _SUBJPREFIX_
                   body     OLEMACRO_MALICE eval:check_olemacro_malice()
                   describe OLEMACRO_MALICE Dangerous Office Macro
                   score    OLEMACRO_MALICE 5.0
                   if can(Mail::SpamAssassin::Conf::feature_subjprefix)
                     subjprefix OLEMACRO_MALICE [VIRUS]
                   endif

       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: 75)
           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: 1)
           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.

   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 blocklist checks will never query for hosts on these networks.

           See "https://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 module Net::CIDR::Lite is installed, it's also possible to use  dash  separated  IP  range  format
           (e.g. 192.168.1.1-192.168.255.255).

           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: Blockhole 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: v4, v6, norotate, nodns0x20, edns=4096)
           Provides  a  (whitespace  or  comma -separated) list of options applying to DNS resolving.  Available
           options are: v4, v6, 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 v4 declares resolver capable of returning IPv4  (A)  records.   Option  v6  declares  resolver
           capable  of  returning  IPv6  (AAAA)  records.   One would set nov6 if the resolver is filtering AAAA
           responses.  NOTE: these options only refer to resolving capabilies, there is no  other  meaning  like
           whether the IP address of resolver itself is IPv4 or IPv6.

           Option  edns  (or  edns0)  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.

           Special  wildcard  "dns_query_restriction  deny  *"  is supported to block all queries except allowed
           ones.

           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).

       dns_block_rule RULE domain
           If  rule  named  RULE is hit, DNS queries to specified domain are temporarily blocked. Intended to be
           used with rules that check RBL return codes for specific blocked status.  For example:

             urirhssub URIBL_BLOCKED multi.uribl.com. A 1
             dns_block_rule URIBL_BLOCKED multi.uribl.com

           Block status is maintained across all processes by empty statefile  named  "dnsblock_multi.uribl.com"
           in  global  state dir: home_dir_for_helpers/.spamassassin, $HOME/.spamassassin, /var/lib/spamassassin
           (localstate), depending which is found and writable.

       dns_block_time   (default: 300)
           dns_block_rule query blockage will last this many seconds.

   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. Header matching is case-insensitive.  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 "welcomelist_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 welcomelisting or blocklisting 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.
           "https://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: UTF-8)
           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/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 "https://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  blocklist  or  welcomelist).  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",           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 welcomelist), 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
               "https://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.

           Body is processed as a raw byte string, which means Unicode-specific regex features like \p{} can NOT
           be used for matching.  The normalize_charset setting will also affect how raw  bytes  are  presented.
           Rules  in  .cf  files  should be written portably - to match "a with umlaut" character, look for both
           LATIN1 and UTF8 raw byte variants: /(?:\xE4|\xC3\xA4)/

           All body paragraphs (double-newline-separated blocks text)  are  turned  into  a  linebreaks-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".

           See "https://wiki.apache.org/SpamAssassin/WritingRules" for more information.

       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.

           Note that CRLF/LF line endings are matched as the original message has them.  For any full rules that
           match newlines, it's recommended to use \r?$ instead of plain $, so it works on all systems.

       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 rulename matching (*  =  anything,  ?  =  one  character).
           Matching is case-sensitive.

           For example, this will hit if at least two __FOO_* rule hits:

            body __FOO_1  /xxx/
            body __FOO_2  /yyy/
            body __FOO_3  /zzz/
            meta FOO_META  rules_matching(__FOO_*) >= 2

           Which would be the same as:

            meta FOO_META  (__FOO_1 + __FOO_2 + __FOO_3) >= 2

       reuse SYMBOLIC_TEST_NAME [ OLD_SYMBOLIC_TEST_NAME_1 ... ]
           Defines  the  name  of a test that should be "reused" during the scoring process. If a message has an
           X-Spam-Status header that shows a hit for this rule or any of the old rule names given, a hit will be
           added for this rule when mass-check --reuse is used. Examples:

           "reuse SPF_PASS"

           "reuse MY_NET_RULE_V2 MY_NET_RULE_V1"

           The actual logic for reuse tests is done by Mail::SpamAssassin::Plugin::Reuse.

       tflags SYMBOLIC_TEST_NAME flags
           Used to set flags on a test. Parameter is a space-separated list of flag names or flag name  =  value
           pairs.   These  flags  are  used in the score-determination back end system for details of the test's
           behaviour.  Please see "bayes_auto_learn" for more information about  tflag  interaction  with  those
           systems. The following flags can be set:

           net The  test  is  a  network test, and will not be run in the mass checking system or if -L is used,
               therefore its score should not be modified.

           nice
               The test is intended to compensate for common false positives, and should be assigned a  negative
               score.

           userconf
               The test requires user configuration before it can be used (like language-specific tests).

           learn
               The test requires training before it can be used.

           noautolearn
               The test will explicitly be ignored when calculating the score for learning systems.

           autolearn_force
               The test will be subject to less stringent autolearn thresholds.

               Normally,  SpamAssassin  will  require  3 points from the header and 3 points from the body to be
               auto-learned as spam. This option keeps the threshold at 6 points total but changes it to have no
               regard to the source of the points.

           noawl
               This flag is specific when using AWL plugin.

               Normally, AWL plugin normalizes scores via auto-welcomelist. In some scenarios it  works  against
               the system administrator when trying to add some rules to correct miss-classified email. When AWL
               plugin searches the email and finds the noawl flag it will exit without normalizing the score nor
               storing the value in db.

           multiple
               The  test  will be evaluated multiple times, for use with meta rules.  Only affects header, body,
               rawbody, uri, and full tests.

           maxhits=N
               If multiple is specified, limit the number of hits found to N.  If the rule is  used  in  a  meta
               that counts the hits (e.g. __RULENAME > 5), this is a way to avoid wasted extra work (use "tflags
               multiple maxhits=6").

               For example:

                 uri      __KAM_COUNT_URIS /^./
                 tflags   __KAM_COUNT_URIS multiple maxhits=16
                 describe __KAM_COUNT_URIS A multiple match used to count URIs in a message

                 meta __KAM_HAS_0_URIS (__KAM_COUNT_URIS == 0)
                 meta __KAM_HAS_1_URIS (__KAM_COUNT_URIS >= 1)
                 meta __KAM_HAS_2_URIS (__KAM_COUNT_URIS >= 2)
                 meta __KAM_HAS_3_URIS (__KAM_COUNT_URIS >= 3)
                 meta __KAM_HAS_4_URIS (__KAM_COUNT_URIS >= 4)
                 meta __KAM_HAS_5_URIS (__KAM_COUNT_URIS >= 5)
                 meta __KAM_HAS_10_URIS (__KAM_COUNT_URIS >= 10)
                 meta __KAM_HAS_15_URIS (__KAM_COUNT_URIS >= 15)

           nosubject
               Used  only  for  body rules.  If specified, Subject header will not be a part of the matched body
               text.  See body for more info.

           ips_only
               This flag is specific to rules invoking an URIDNSBL plugin, it is documented there.

           domains_only
               This flag is specific to rules invoking an URIDNSBL plugin, it is documented there.

           ns  This flag is specific to rules invoking an URIDNSBL plugin, it is documented there.

           a   This flag is specific to rules invoking an URIDNSBL plugin, it is documented there.

           notrim
               This flag is specific to rules invoking an URIDNSBL plugin, it is documented there.

           nolog
               This flag will hide (sensitive) rule informations from reports

       priority SYMBOLIC_TEST_NAME n
           Assign a specific priority to a test.  All  tests,  except  for  DNS  and  Meta  tests,  are  run  in
           increasing  priority  value order (negative priority values are run before positive priority values).
           The default test priority is 0 (zero).

           The values -99999999999999 and -99999999999998 have a special meaning internally, and should  not  be
           used.

   CAPTURING TAGS USING REGEX NAMED CAPTURE GROUPS
       SpamAssassin  4.0 supports capturing template tags from regex rules.  The captured tags, along with other
       standard template tags, can be used in other rules as a matching string.  See TEMPLATE TAGS  section  for
       more info on tags.

       Capturing  can  be done in any body/rawbody/header/uri/full rule that uses a regex for matching (not eval
       rules).  Standard Perl named capture group format  "(?<NAME>pattern)"  must  be  used,  as  described  in
       <https://perldoc.perl.org/perlre#(?%3CNAME%3Epattern)>.

       Example, capturing a tag named "BODY_HELLO_NAME":

        body __HELLO_NAME /\bHello, (?<BODY_HELLO_NAME>\w+)\b/

       The  tag  can  then be used in another rule for matching, using a %{TAGNAME} template.  This would search
       the captured name in From-header:

        header HELLO_NAME_IN_FROM From =~ /\b%{BODY_HELLO_NAME}\b/i

       If any tag that a rule depends on is not found, then the rule is not run at all.  To  prevent  a  literal
       %{NAME} string from being parsed as a template, it can be escaped with a backslash: \%{NAME}.

       Captured  tags  can  also  be  used  in  reports  and  in  other  plugins  like AskDNS, with the standard
       "_BODY_HELLO_NAME_" notation.

       Note that at this time there is no automatic dependency tracking for rule running order.  All rules  that
       use  named  capture  groups  are  automatically set to priority -10000, so that the tags should always be
       ready for any normal rules to use.  When rule depends on a tag that might be set  at  later  stage  by  a
       plugin for example, it's priority should be set manually to a higher value.

ADMINISTRATOR SETTINGS

       These  settings  differ  from  the ones above, in that they are considered 'more privileged' -- even more
       than the ones in the PRIVILEGED SETTINGS section.  No matter what "allow_user_rules" is set to, these can
       never be set from a user's "user_prefs" file when spamc/spamd is being used.  However, all  settings  can
       be used by local programs run directly by the user.

       version_tag string
           This  tag  is  appended to the SA version in the X-Spam-Status header. You should include it when you
           modify your ruleset, especially if you plan to distribute it.  A good choice for string is your  last
           name or your initials followed by a number which you increase with each change.

           The  version_tag will be lowercased, and any non-alphanumeric or period character will be replaced by
           an underscore.

           e.g.

             version_tag myrules1    # version=2.41-myrules1

       test SYMBOLIC_TEST_NAME (ok|fail) Some string to test against
           Define a regression testing string. You can have more than one regression test  string  per  symbolic
           test name. Simply specify a string that you wish the test to match.

           These  tests  are  only run as part of the test suite - they should not affect the general running of
           SpamAssassin.

       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.

       rbl_timeout t [t_min] [zone]       (default: 15 3)
           All DNS queries are made at the beginning of a check and we try to read the results at the end.  This
           value specifies the maximum period of time (in seconds) to wait for a DNS query.  If most of the  DNS
           queries  have succeeded for a particular message, then SpamAssassin will not wait for the full period
           to avoid wasting time on  unresponsive  server(s),  but  will  shrink  the  timeout  according  to  a
           percentage  of  queries  already  completed.   As  the  number of queries remaining approaches 0, the
           timeout value will gradually approach a t_min value,  which  is  an  optional  second  parameter  and
           defaults  to  0.2  *  t.  If t is smaller than t_min, the initial timeout is set to t_min.  Here is a
           chart of queries remaining versus the timeout in seconds, for  the  default  15  second  /  3  second
           timeout setting:

             queries left  100%  90%  80%  70%  60%  50%  40%  30%  20%  10%   0%
             timeout        15   14.9 14.5 13.9 13.1 12.0 10.7  9.1  7.3  5.3  3

           For  example, if 20 queries are made at the beginning of a message check and 16 queries have returned
           (leaving 20%), the remaining 4 queries should finish within 7.3 seconds since their query started  or
           they will be timed out.  Note that timed out queries are only aborted when there is nothing else left
           for SpamAssassin to do - long evaluation of other rules may grant queries additional time.

           If  a  parameter  'zone'  is  specified (it must end with a letter, which distinguishes it from other
           numeric parametrs), then the setting only applies to DNS queries against  the  specified  DNS  domain
           (host,  domain or RBL (sub)zone).  Matching is case-insensitive, the actual domain may be a subdomain
           of the specified zone.

       util_rb_tld tld1 tld2 ...
           This option maintains a list of valid TLDs in the RegistryBoundaries code.  Top level  domains  (TLD)
           include  things like com, net, org, xn--p1ai, рф, ...  International domain names may be specified in
           ASCII-compatible encoding (ACE), e.g. xn--p1ai, xn--qxam, or with Unicode  labels  encoded  as  UTF-8
           octets, e.g. рф, ελ.

       util_rb_2tld 2tld-1.tld 2tld-2.tld ...
           This  option  maintains  list  of valid 2nd-level TLDs in the RegistryBoundaries code.  2TLDs include
           things like co.uk, fed.us, etc.  International domain names  may  be  specified  in  ASCII-compatible
           encoding (ACE), or with Unicode labels encoded as UTF-8 octets.

       util_rb_3tld 3tld1.some.tld 3tld2.other.tld ...
           This  option  maintains  list  of valid 3rd-level TLDs in the RegistryBoundaries code.  3TLDs include
           things like demon.co.uk, plc.co.im, etc.  International domain  names  may  be  specified  in  ASCII-
           compatible encoding (ACE), or with Unicode labels encoded as UTF-8 octets.

       clear_util_rb
           Empty  internal  list of valid TLDs (including 2nd and 3rd level) which RegistryBoundaries code uses.
           Only useful if you want to override the standard lists supplied by sa-update.

       bayes_path /path/filename     (default: ~/.spamassassin/bayes)
           This is the directory and filename for Bayes databases.  Several databases will be created, with this
           as the base directory and filename, with "_toks", "_seen", etc. appended to the  base.   The  default
           setting results in files called "~/.spamassassin/bayes_seen", "~/.spamassassin/bayes_toks", etc.

           By  default,  each  user has their own in their "~/.spamassassin" directory with mode 0700/0600.  For
           system-wide SpamAssassin use, you may want to reduce disk space usage  by  sharing  this  across  all
           users.  However, Bayes appears to be more effective with individual user databases.

       bayes_file_mode          (default: 0700)
           The file mode bits used for the Bayesian filtering database files.

           Make sure you specify this using the 'x' mode bits set, as it may also be used to create directories.
           However,  if  a  file is created, the resulting file will not have any execute bits set (the umask is
           set to 111). The argument is a string of octal digits, it is converted to a numeric value internally.

       bayes_store_module Name::Of::BayesStore::Module
           If this option is set, the module given will be used as an alternate to  the  default  bayes  storage
           mechanism.      It     must     conform    to    the    published    storage    specification    (see
           Mail::SpamAssassin::BayesStore). For example, set this to Mail::SpamAssassin::BayesStore::SQL to  use
           the generic SQL storage module.

       bayes_sql_dsn DBI::databasetype:databasename:hostname:port
           Used for BayesStore::SQL storage implementation.

           This option give the connect string used to connect to the SQL based Bayes storage.

       bayes_sql_username
           Used by BayesStore::SQL storage implementation.

           This option gives the username used by the above DSN.

       bayes_sql_password
           Used by BayesStore::SQL storage implementation.

           This option gives the password used by the above DSN.

       bayes_sql_username_authorized ( 0 | 1 )  (default: 0)
           Whether  to  call the services_authorized_for_username plugin hook in BayesSQL.  If the hook does not
           determine that the user is allowed to use  bayes  or  is  invalid  then  the  database  will  not  be
           initialized.

           NOTE:  By  default the user is considered invalid until a plugin returns a true value.  If you enable
           this, but do not have a proper plugin loaded, all users will turn up as invalid.

           The username passed into the plugin can be affected by the bayes_sql_override_username config option.

       user_scores_dsn DBI:databasetype:databasename:hostname:port
           If you load user scores from an SQL database, this will  set  the  DSN  used  to  connect.   Example:
           "DBI:mysql:spamassassin:localhost"

           If  you  load  user scores from an LDAP directory, this will set the DSN used to connect. You have to
           write the DSN as an LDAP URL, the components being the host and port to connect to, the base  DN  for
           the  search,  the  scope of the search (base, one or sub), the single attribute being the multivalued
           attribute used to hold the configuration data (space separated pairs of key and value, just as  in  a
           file)  and  finally the filter being the expression used to filter out the wanted username. Note that
           the filter expression is being used in a sprintf statement with the username as the  only  parameter,
           thus is can hold a single __USERNAME__ expression. This will be replaced with the username.

           Example: "ldap://localhost:389/dc=koehntopp,dc=de?saconfig?uid=__USERNAME__"

       user_scores_sql_username username
           The authorized username to connect to the above DSN.

       user_scores_sql_password password
           The password for the database username, for the above DSN.

       user_scores_sql_custom_query query
           This  option  gives  you  the  ability  to  create  a  custom  SQL  query to retrieve user scores and
           preferences.  In order to work correctly your query should return two values, the preference name and
           value, in that order.  In addition, there are several "variables" that you can use as  part  of  your
           query, these variables will be substituted for the current values right before the query is run.  The
           current allowed variables are:

           _TABLE_
               The  name  of  the  table  where  user  scores and preferences are stored. Currently hardcoded to
               userpref, to change this value you need to create a new custom query with the new table name.

           _USERNAME_
               The current user's username.

           _MAILBOX_
               The portion before the @ as derived from the current user's username.

           _DOMAIN_
               The portion after the @ as derived from the current user's username, this value may be null.

           The query must be one continuous line in order to parse correctly.

           Here are several example queries, please note that these are broken up  for  easy  reading,  in  your
           config it should be one continuous line.

           Current default query:
               "SELECT  preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '@GLOBAL' ORDER
               BY username ASC"

           Use global and then domain level defaults:
               "SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR  username  =  '@GLOBAL'  OR
               username = '@~'||_DOMAIN_ ORDER BY username ASC"

           Maybe global prefs should override user prefs:
               "SELECT  preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '@GLOBAL' ORDER
               BY username DESC"

       user_scores_ldap_username
           This is the Bind DN used to connect to the LDAP server.   It  defaults  to  the  empty  string  (""),
           allowing anonymous binding to work.

           Example: "cn=master,dc=koehntopp,dc=de"

       user_scores_ldap_password
           This is the password used to connect to the LDAP server.  It defaults to the empty string ("").

       user_scores_fallback_to_global        (default: 1)
           Fall  back  to  global  scores and settings if userprefs can't be loaded from SQL or LDAP, instead of
           passing the message through unprocessed.

       loadplugin [Mail::SpamAssassin::Plugin::]ModuleName [/path/module.pm]
           Load a SpamAssassin plugin module.  The "ModuleName" is the perl module  name,  used  to  create  the
           plugin object itself.

           Module  naming  is  strict, name must only contain alphanumeric characters or underscores.  File must
           have .pm extension.

           "/path/module.pm" is the file to load, containing the module's perl code;  if  it's  specified  as  a
           relative  path,  it's considered to be relative to the current configuration file.  If it is omitted,
           the module will be loaded using perl's search path (the @INC array).

           See "Mail::SpamAssassin::Plugin" for more details on writing plugins.

       tryplugin ModuleName [/path/module.pm]
           Same as "loadplugin", but silently ignored if the .pm file cannot be found in the filesystem.

       ignore_always_matching_regexps         (Default: 0)
           Ignore any rule which contains a regexp which always matches.  Currently only catches  regexps  which
           contain  '||',  or  which  begin  or  end  with  a  '|'.  Also ignore rules with "some" combinatorial
           explosions.

       geodb_module STRING
           This option tells SpamAssassin which geolocation module to use.  If not specified, all supported ones
           are tried in this order:

           Plugins can override this internally if required.

            MaxMind::DB::Reader  (same as GeoIP2::Database::Reader)
            Geo::IP
            IP::Country::DB_File  (not used unless geodb_options path set)
            IP::Country::Fast

       geodb_options dbtype:/path/to/db ...
           Supported dbtypes:

           city - use City database country - use Country database isp - try loading  ISP  database  asn  -  try
           loading ASN database

           Append full database path with colon, for example: isp:/opt/geoip/isp.mmdb

           Plugins  can  internally  request all types they require, geodb_options is only needed if the default
           location search (described below) does not work.

           GeoIP/GeoIP2 searches these files/directories:

            country:
              GeoIP2-Country.mmdb, GeoLite2-Country.mmdb
              GeoIP.dat (and v6 version)
            city:
              GeoIP2-City.mmdb, GeoLite2-City.mmdb
              GeoIPCity.dat, GeoLiteCity.dat (and v6 versions)
            isp:
              GeoIP2-ISP.mmdb
              GeoIPISP.dat, GeoLiteISP.dat (and v6 versions)
            directories:
              /usr/local/share/GeoIP
              /usr/share/GeoIP
              /var/lib/GeoIP
              /opt/share/GeoIP

       geodb_search_path /path/to/GeoIP ...
           Alternative to geodb_options. Overrides the  default  list  of  directories  to  search  for  default
           filenames.

PREPROCESSING OPTIONS

       include filename
           Include  configuration lines from "filename".   Relative paths are considered relative to the current
           configuration file or user preferences file.

       if (boolean perl expression)
           Used to support conditional interpretation of the  configuration  file.  Lines  between  this  and  a
           corresponding  "else" or "endif" line will be ignored unless the expression evaluates as true (in the
           perl sense; that is, defined and non-0 and non-empty string).

           The conditional accepts a limited subset of perl  for  security  --  just  enough  to  perform  basic
           arithmetic comparisons.  The following input is accepted:

           numbers, whitespace, arithmetic operations and grouping
               Namely these characters and ranges:

                 ( ) - + * / _ . , < = > ! ~ 0-9 whitespace

           version
               This  will  be  replaced  with  the  version number of the currently-running SpamAssassin engine.
               Note: The version used is in the internal SpamAssassin version format which is "x.yyyzzz",  where
               x  is major version, y is minor version, and z is maintenance version.  So 3.0.0 is 3.000000, and
               3.4.80 is 3.004080.

           perl_version
               (Introduced in 3.4.1)  This will be replaced with the version  number  of  the  currently-running
               perl  engine.  Note: The version used is in the $] version format which is "x.yyyzzz", where x is
               major version, y is minor version, and z is maintenance  version.   So  5.8.8  is  5.008008,  and
               5.10.0  is 5.010000. Use to protect rules that incorporate RE syntax elements introduced in later
               versions of perl, such as the "++" non-backtracking match introduced in perl 5.10. For example:

                 # Avoid lint error on older perl installs
                 # Check SA version first to avoid warnings on checking perl_version on older SA
                 if version > 3.004001 && perl_version >= 5.018000
                   body  INVALID_RE_SYNTAX_IN_PERL_BEFORE_5_18  /(?[ \p{Thai} & \p{Digit} ])/
                 endif

               Note that the above will still generate a warning on  perl  older  than  5.10.0;  to  avoid  that
               warning do this instead:

                 # Avoid lint error on older perl installs
                 if can(Mail::SpamAssassin::Conf::perl_min_version_5010000)
                   body  INVALID_RE_SYNTAX_IN_PERL_5_8  /\w++/
                 endif

               Warning: a can() test is only defined for perl 5.10.0!

           plugin(Name::Of::Plugin)
               This  is  a  function  call  that  returns 1 if the plugin named "Name::Of::Plugin" is loaded, or
               "undef" otherwise.

           has(Name::Of::Package::function_name)
               This is a function call that returns 1 if the perl package named "Name::Of::Package"  includes  a
               function  called  "function_name",  or "undef" otherwise.  Note that packages can be SpamAssassin
               plugins or built-in classes, there's no difference in  this  respect.   Internally  this  invokes
               UNIVERSAL::can.

           can(Name::Of::Package::function_name)
               This  is  a function call that returns 1 if the perl package named "Name::Of::Package" includes a
               function called "function_name" and that function returns  a  true  value  when  called  with  no
               arguments, otherwise "undef" is returned.

               Is  similar  to  "has",  except  that  it also calls the named function, testing its return value
               (unlike the perl function UNIVERSAL::can).  This makes it possible for a  'feature'  function  to
               determine its result value at run time.

           If  the  end  of  a  configuration file is reached while still inside a "if" scope, a warning will be
           issued, but parsing will restart on the next file.

           For example:

                   if (version > 3.000000)
                     header MY_FOO ...
                   endif

                   loadplugin MyPlugin plugintest.pm

                   if plugin (MyPlugin)
                     header MY_PLUGIN_FOO  eval:check_for_foo()
                     score  MY_PLUGIN_FOO  0.1
                   endif

       ifplugin PluginModuleName
           An alias for "if plugin(PluginModuleName)".

       else
           Used to support conditional interpretation of the  configuration  file.  Lines  between  this  and  a
           corresponding  "endif" line, will be ignored unless the conditional expression evaluates as false (in
           the perl sense; that is, not defined and not 0 and non-empty string).

       require_version n.nnnnnn
           Indicates that the entire file, from this line on, requires a certain version of SpamAssassin to run.
           If a different (older or newer) version of SpamAssassin tries to read  the  configuration  from  this
           file, it will output a warning instead, and ignore it.

           Note: The version used is in the internal SpamAssassin version format which is "x.yyyzzz", where x is
           major version, y is minor version, and z is maintenance version.  So 3.0.0 is 3.000000, and 3.4.80 is
           3.004080.

       enable_compat xxxxxx
           Define a version compatibility flag.

           This  creates a function named "Mail::SpamAssassin::Conf::compat_xxxxxx", which returns true.  It can
           be used for example in cf-files, similarly as existing "feature_" checks:

             if can(Mail::SpamAssassin::Conf::compat_xxxxxx)

           Name can only consist of [a-zA-Z0-9_] characters.

           Mainly used by SpamAssassin distribution to handle backwards compatibility issues.

TEMPLATE TAGS

       The following "tags" can be used as placeholders in certain  options.   They  will  be  replaced  by  the
       corresponding value when they are used.

       Some  tags  can  take  an  argument  (in parentheses). The argument is optional, and the default is shown
       below.

        _YESNO_           "Yes" for spam, "No" for nonspam (=ham)
        _YESNO(spam_str,ham_str)_  returns the first argument ("Yes" if missing)
                          for spam, and the second argument ("No" if missing) for ham
        _YESNOCAPS_       "YES" for spam, "NO" for nonspam (=ham)
        _YESNOCAPS(spam_str,ham_str)_  same as _YESNO(...)_, but uppercased
        _SCORE(PAD)_      message score, if PAD is included and is either spaces or
                          zeroes, then pad scores with that many spaces or zeroes
                          (default, none)  ie: _SCORE(0)_ makes 2.4 become 02.4,
                          _SCORE(00)_ is 002.4.  12.3 would be 12.3 and 012.3
                          respectively.
        _REQD_            message threshold
        _VERSION_         version (eg. 3.0.0 or 3.1.0-r26142-foo1)
        _SUBVERSION_      sub-version/code revision date (eg. 2004-01-10)
        _RULESVERSION_    comma-separated list of rules versions, retrieved from
                          an '# UPDATE version' comment in rules files; if there is
                          more than one set of rules (update channels) the order
                          is unspecified (currently sorted by names of files);
        _HOSTNAME_        hostname of the machine the mail was processed on
        _REMOTEHOSTNAME_  hostname of the machine the mail was sent from, only
                          available with spamd
        _REMOTEHOSTADDR_  ip address of the machine the mail was sent from, only
                          available with spamd
        _BAYES_           bayes score
        _TOKENSUMMARY_    number of new, neutral, spammy, and hammy tokens found
        _BAYESTC_         number of new tokens found
        _BAYESTCLEARNED_  number of seen tokens found
        _BAYESTCSPAMMY_   number of spammy tokens found
        _BAYESTCHAMMY_    number of hammy tokens found
        _HAMMYTOKENS(N)_  the N most significant hammy tokens (default, 5)
        _SPAMMYTOKENS(N)_ the N most significant spammy tokens (default, 5)
        _DATE_            rfc-2822 date of scan
        _STARS(*)_        one "*" (use any character) for each full score point
                          (note: limited to 50 'stars')
        _SENDERDOMAIN_    a domain name of the envelope sender address, lowercased
        _AUTHORDOMAIN_    a domain name of the author address (the From header
                          field), lowercased;  note that RFC 5322 allows a mail
                          message to have multiple authors - currently only the
                          domain name of the first email address is returned
        _RELAYSTRUSTED_   relays used and deemed to be trusted (see the
                          'X-Spam-Relays-Trusted' pseudo-header)
        _RELAYSUNTRUSTED_ relays used that can not be trusted (see the
                          'X-Spam-Relays-Untrusted' pseudo-header)
        _RELAYSINTERNAL_  relays used and deemed to be internal (see the
                          'X-Spam-Relays-Internal' pseudo-header)
        _RELAYSEXTERNAL_  relays used and deemed to be external (see the
                          'X-Spam-Relays-External' pseudo-header)
        _FIRSTTRUSTEDIP_  IP address of first trusted client (see RELAYSTRUSTED)
        _FIRSTTRUSTEDREVIP_  IP address of first trusted client (in reversed
                          format suitable for RBL queries)
        _LASTEXTERNALIP_  IP address of client in the external-to-internal
                          SMTP handover
        _LASTEXTERNALREVIP_  IP address of client in the external-to-internal
                          SMTP handover (in reversed format suitable for RBL
                          queries)
        _LASTEXTERNALRDNS_ reverse-DNS of client in the external-to-internal
                          SMTP handover
        _LASTEXTERNALHELO_ HELO string used by client in the external-to-internal
                          SMTP handover
        _AUTOLEARN_       autolearn status ("ham", "no", "spam", "disabled",
                          "failed", "unavailable")
        _AUTOLEARNSCORE_  portion of message score used by autolearn
        _TESTS(,)_        tests hit separated by "," (or other separator)
        _TESTSSCORES(,)_  as above, except with scores appended (eg. AWL=-3.0,...)
        _SUBTESTS(,)_     subtests (start with "__") hit separated by ","
                          (or other separator)
        _SUBTESTSCOLLAPSED(,)_ subtests (start with "__") hit separated by ","
                          (or other separator) with duplicated rules collapsed
        _DCCB_            DCC's "Brand"
        _DCCR_            DCC's results
        _PYZOR_           Pyzor results
        _RBL_             full results for positive RBL queries in DNS URI format
        _LANGUAGES_       possible languages of mail
        _PREVIEW_         content preview
        _REPORT_          terse report of tests hit (for header reports)
        _SUBJPREFIX_      subject prefix based on rules, to be prepended to Subject
                          header by SpamAssassin caller
        _SUMMARY_         summary of tests hit for standard report (for body reports)
        _CONTACTADDRESS_  contents of the 'report_contact' setting
        _HEADER(NAME)_    includes the value of a message header.  value is the same
                          as is found for header rules (see elsewhere in this doc)
        _TIMING_          timing breakdown report
        _ADDEDHEADERHAM_  resulting header fields as requested by add_header for spam
        _ADDEDHEADERSPAM_ resulting header fields as requested by add_header for ham
        _ADDEDHEADER_     same as ADDEDHEADERHAM for ham or ADDEDHEADERSPAM for spam

       If a tag reference uses the name of a tag which is not in this list or defined by a  loaded  plugin,  the
       reference will be left intact and not replaced by any value.

       All template tag names must consist of only uppercase character set [A-Z0-9_] and not contain consecutive
       underscores (__).

       Additional, plugin specific, template tags can be found in the documentation for the following plugins:

        L<Mail::SpamAssassin::Plugin::ASN>
        L<Mail::SpamAssassin::Plugin::AWL>
        L<Mail::SpamAssassin::Plugin::TxRep>

       The "HAMMYTOKENS" and "SPAMMYTOKENS" tags have an optional second argument which specifies a format.  See
       the HAMMYTOKENS/SPAMMYTOKENS TAG FORMAT section, below, for details.

   HAMMYTOKENS/SPAMMYTOKENS TAG FORMAT
       The  "HAMMYTOKENS"  and  "SPAMMYTOKENS"  tags  have an optional second argument which specifies a format:
       "_SPAMMYTOKENS(N,FMT)_", "_HAMMYTOKENS(N,FMT)_" The following formats are available:

       short
           Only the tokens themselves are listed.  For example, preference file entry:

           "add_header all Spammy _SPAMMYTOKENS(2,short)_"

           Results in message header:

           "X-Spam-Spammy: remove.php, UD:jpg"

           Indicating that the top two spammy tokens found are "remove.php" and  "UD:jpg".   (The  token  itself
           follows  the  last  colon, the text before the colon indicates something about the token.  "UD" means
           the token looks like it might be part of a domain name.)

       compact
           The token probability, an abbreviated declassification distance (see  example),  and  the  token  are
           listed.  For example, preference file entry:

           "add_header all Spammy _SPAMMYTOKENS(2,compact)_"

           Results in message header:

           "0.989-6--remove.php, 0.988-+--UD:jpg"

           Indicating that the probabilities of the top two tokens are 0.989 and 0.988, respectively.  The first
           token has a declassification distance of 6, meaning that if the token had appeared in at least 6 more
           ham  messages  it  would  not  be  considered  spammy.   The  "+"  for  the  second token indicates a
           declassification distance greater than 9.

       long
           Probability, declassification distance, number of times seen in a ham message, number of  times  seen
           in a spam message, age and the token are listed.

           For example, preference file entry:

           "add_header all Spammy _SPAMMYTOKENS(2,long)_"

           Results in message header:

           "X-Spam-Spammy: 0.989-6--0h-4s--4d--remove.php, 0.988-33--2h-25s--1d--UD:jpg"

           In  addition  to the information provided by the compact option, the long option shows that the first
           token appeared in zero ham messages and four spam messages, and that it was last seen four days  ago.
           The  second  token  appeared  in  two  ham  messages, 25 spam messages and was last seen one day ago.
           (Unlike the "compact" option, the long option shows declassification distances that are greater  than
           9.)

LOCALISATION

       A  line  starting  with  the  text  "lang xx" will only be interpreted if SpamAssassin is running in that
       locale, allowing test descriptions and templates to be set for that language.

       Current locale is determined from LANGUAGE, LC_ALL, LC_MESSAGES  or  LANG  environment  variables,  first
       found is used.

       The  locales  string should specify either both the language and country, e.g.  "lang pt_BR", or just the
       language, e.g. "lang de".

       Example:

        lang de describe EXAMPLE_RULE Beispielregel

SEE ALSO

       Mail::SpamAssassin(3) spamassassin(1) spamd(1)

perl v5.38.2                                       2024-04-12                      Mail::SpamAssassin::Conf(3pm)