#### 5.6.1 Built-in Tests ¶

Test: false ¶

  This test always evaluates to “false”.

Test: true ¶

  This test always evaluates to “true”.

Test: address `[address-part] [comparator] [match-type] header-names key-list` ¶

  Tagged arguments:

  address-part

    Selects the address part to compare. Default is the whole email address (`:all`).

  comparator

    Specifies the comparator to be used instead of the default `i;ascii-casemap`.

  match-type

    Specifies the match type to be used instead of the default `:is`.

  Required arguments:

  header-names

    A list of header names.

  key-list

    A list of address values.

  The `address` test matches Internet addresses in structured headers that contain addresses. It returns `true` if any header contains any key in the specified part of the address, as modified by comparator and match-type optional arguments.

  This test returns `true` if any combination of the header-names and key-list arguments match.

  The `address` primitive never acts on the phrase part of an email address, nor on comments within that address. Use the `header` test instead. It also never acts on group names, although it does act on the addresses within the group construct.

  Example:

      if address :is :all "from" "tim@example.com"
        {
           discard;
        }

Test: size `[:over | :under] limit(number)` ¶

  The `size` test deals with the size of a message. The required argument limit represents the size of the message in bytes. It may be suffixed with the following quantifiers:

  ‘`k`’
  ‘`K`’

    The number is expressed in kilobytes.

  ‘`m`’
  ‘`M`’

    The number is expressed in megabytes.

  ‘`g`’
  ‘`G`’

    The number is expressed in gigabytes.

  If the tagged argument is ‘`:over`’, and the size of the message is greater than number, the test is true; otherwise, it is false.

  If the argument is ‘`:under`’, and the size of the message is less than the number, the test is true; otherwise, it is false.

  Otherwise, the test is true only if the size of the message equals exactly number. This is a GNU extension.

  The size of a message is defined to be the number of octets from the initial header until the last character in the message body.

Test: envelope `[address-part] [comparator] [match-type] envelope-part(string-list) key-list(string-list)` ¶

  Tagged arguments:

  address-part

    Selects the address part to compare. Default is the whole email address (`:all`).

  comparator

    Specifies the comparator to be used instead of the default `i;ascii-casemap`.

  match-type

    Specifies the match type to be used instead of the default `:is`.

  Required arguments:

  envelope-parts

    A list of envelope parts to operate upon.

  key-list

    A list of address values.

  The `envelope` test is true if the specified part of the SMTP envelope matches the specified key.

  If the envelope-part strings is (case insensitive) ‘`from`’, then matching occurs against the FROM address used in the `SMTP MAIL` command.

  Notice, that due to the limitations imposed by SMTP envelope structure the use of any other values in envelope-parts header is meaningless.

Test: exists `header-names(string-list)` ¶

  Required arguments:

  header-names

    List of message header names.

  The `exists` test is `true` if the headers listed in header-names argument exist within the message. All of the headers must exist or the test is false.

  The following example throws out mail that doesn’t have a From header and a Date header:

      if not exists ["From","Date"]
        {
           discard;
        }

Test: header `[comparator] [match-type] [:mime] header-names(string-list) key-list(string-list)` ¶

  Tagged arguments:

  comparator

    Specifies the comparator to be used instead of the default `i;ascii-casemap`.

  match-type

    Specifies the match type to be used instead of the default `:is`.

  :mime ¶

    This tag instructs `header` to search through the mime headers in multipart messages as well.

  Required arguments:

  header-names

    A list of header names.

  key-list

    A list of header values.

  The `header` test evaluates to true if any header name matches any key. The type of match is specified by the optional match argument, which defaults to ":is" if not explicitly given.

  The test returns `true` if any combination of the header-names and key-list arguments match.

  If a header listed in header-names exists, it contains the null key (‘`""`’). However, if the named header is not present, it does not contain the null key. So if a message contained the header

      X-Caffeine: C8H10N4O2

  these tests on that header evaluate as follows:

      header :is ["X-Caffeine"] [""] ⇒ false
      header :contains ["X-Caffeine"] [""] ⇒ true