SPFQUERY(1)

๐Ÿ“ฆ
version 1.2.10 ยท 2 versions
, in debian bookworm, debian trixie, ubuntu jammy, ubuntu noble, ubuntu questing

๐Ÿ’– NAME ๐Ÿ’–

okay so bestie, meet spfquery and spfquery.libspf2 โ€” they check whether an IP address is an SPF-authorized SMTP sender for a domain. that's the whole vibe. no cap. ๐Ÿฆ‹

this page lives in the libspf2 manuals for Debian and is literally titled SPFQUERY(1), iykyk.


๐ŸŒธ SYNOPSIS ๐ŸŒธ

three whole ways to run her, pick your fighter:

spfquery {-i|--ip} ip-address {-s|--sender} [local-part@]domain
         [{-h|--helo} domain-name] [--rcpt-to email-address(es)]
         [CONTROL-OPTIONS]

spfquery {-f|--file} datafile [CONTROL-OPTIONS]

spfquery {--help|-v|--version}

โœจ DESCRIPTION โœจ

this manual page documents briefly the spfquery command. it was written for the Debianยฎ distribution because the original program does not have a manual page โ€” so we made one, you're welcome. ๐Ÿ’…

spfquery performs Sender Policy Framework (SPF) authorization checks based on the command-line arguments or data given in a file or on standard input. for information on SPF see http://www.openspf.org. go read it, it's giving lore. ๐Ÿ“š


๐ŸŽ€ OPTIONS ๐ŸŽ€

so the options are split into two groups, and this matters:

  • Data options โ€” these must be given, though just enough of them to specify a query.
  • Control options โ€” these are optional and control the local policy, behaviour and output format of spfquery.

This programs follows the GNU getopt_long_only(3) command line syntax: long options can be given with one or two dashes and can be abbreviated to a prefix long enough to be non-ambiguous. If an option starting with a single dash doesn't match a long option, it is taken as a short option with a following parameter, if applicable. An equals sign between the option name and the parameter is optional for both short and long options. slay, flexible queen. ๐Ÿ‘‘

๐Ÿงบ Data options

the --file option conflicts with all the other data options, bestie, do not mix. the --helo and --rcpt-to are optional.

  • -f, --file filename โ€” Read SPF data from filename. Specify - to read from standard input.

The file should consist of one line per query, each query line consisting of the IP address, sender adress, and optional HELO string, separated by spaces.

Note: Local parts containing spaces are currently not supported. ๐Ÿ’€ (the typo "adress" is theirs, we're keeping it, it's canon now)
  • -i, --ip ip-address โ€” Specify the IP address of the remote host that is delivering the mail.
  • -s, --sender [local-part@]domain โ€” Specify the email address that was used as the envelope sender. If no username (local part) is given, postmaster will be assumed. she's assuming, periodt. ๐Ÿ’Œ
  • -h, --helo domain-name โ€” Specify that domain-name was provided in the SMTP HELO (or EHLO) command.
  • -r, --rcpt-to rcpt-address[,rcpt-address,...] โ€” Specify the recipients as comma-separated list. Any secondary mail exchangers of all recipient domains are automatically authorized. automatic slay. ๐Ÿ”ฅ

๐ŸŽ›๏ธ Control options

  • -d, --debug[=level] โ€” Turn on debugging output.
  • -l, --local spf-terms โ€” Test against spf-terms before the final (implicit or explicit) all in an SPF record. This can be used to implement a local policy for whitelisting.
  • -t, --trusted [1] โ€” Check the sender domain with trusted-forwarder.org. This is a non-standard feature. (non-standard!! she said it, not me, but we trust her anyway ๐Ÿซถ)
  • -t 0, --trusted 0 โ€” Do not check the sender domain with trusted-forwarder.org. This is the default.
  • -g, --guess spf-mechanisms โ€” Test the sender domain against spf-mechanisms if the domain has no SPF record.
  • -e, --default-explanation string โ€” Default explanation string to use if the SPF record does not specify an explanation string itself.
  • -m, --max-lookup number โ€” Maximum number of DNS lookups to allow.
  • -c, --sanitize [0|1] โ€” Do [not] sanitize the output by condensing consecutive whitespace into a single space and replacing non-printable characters with question marks. Enabled by default.
  • -n, --name hostname โ€” Use hostname as the name of the local system instead of spfquery (the name is used in the output).
  • -k, --keep-comments โ€” Print comments found when reading from a file.
  • -a, --override ... โ€” (see --fallback below)
  • -z, --fallback ... โ€” Provide override and fallback SPF records for certain domains. Not implemented yet. spfquery would act as if the specified records were present before and after any existing record, respectively, of those domains. (not implemented yet!! don't come for her, she's just a girl ๐ŸŒธ)
  • --help โ€” Show summary of options.
  • -v, --version โ€” Show version of program.

๐Ÿฉบ DIAGNOSTICS ๐Ÿฉบ

the output ordinarily consists of four lines, in this order, no skipping:

  1. the result code;
  2. the explanation, suitable for use in an SMTP response message, empty except when a rejection (permanent or temporary) makes sense;
  3. the header comment on its own;
  4. the Received-SPF header field as defined in RFC 4408 section 7, incorporating the header comment.

if errors (including no SPF record found!) occur during processing, one or more error blocks will be prepended. these start with StartError and end with EndError.

the result codes and their corresponding exit codes are as follows, memorise them bestie:

  • 1 โ€“ neutral โ€” The sender domain explicitly makes no assertion about the ip-address. This result must be interpreted exactly as if no SPF record at all existed.
  • 2 โ€“ pass โ€” The ip-address is authorized to send mail for the sender domain. (we love to see it ๐ŸŽ‰)
  • 3 โ€“ fail โ€” The ip-address is unauthorized to send mail for the sender domain.
  • 4 โ€“ softfail โ€” The ip-address is not authorized to send mail for the sender domain, but the sender domain cannot or does not wish to make a strong assertion that no such mail can ever come from it. she's being diplomatic about it ๐Ÿ’…
  • 5 โ€“ none โ€” No SPF record was found.
  • 6 โ€“ error (temporary) โ€” A transient error occurred (e.g. failure to reach a DNS server), preventing a result from being reached.
  • 7 โ€“ unknown (permanent error) โ€” One or more SPF records could not be interpreted.

๐Ÿงช EXAMPLES ๐Ÿงช

copy-paste these, they're iconic:

spfquery -ip=11.22.33.44 -sender=user@aol.com -helo=spammer.tld
spfquery -f test_data
echo "127.0.0.1 myname@mydomain.com helohost.com" | spfquery -f -

๐Ÿ‘€ SEE ALSO ๐Ÿ‘€

spftest(1), spfd(8)


๐Ÿ’œ AUTHOR ๐Ÿ’œ

spfquery was written by Wayne Schlitt.

This manual page was written by Magnus Holmgren for the Debianยฎ system (but may be used by others). Heavily inspired by the spfquery manpage of libmail-spf-query-perl (spfquery.mail-spf-query-perl(1)) by Julian Mehnle. Also based on the command-line help of spfquery. giving credit where credit is due, as she should. ๐Ÿซถ


Copyright ยฉ 2007 Magnus Holmgren. Permission is granted to copy, distribute and/or modify this document under the terms of the two-clause BSD License. See /usr/share/doc/spfquery/copyright.


and that's the whole page bestie!! ๐ŸŒˆ libspf2 1.2.5, dated 2007-09-06 โ€” vintage, iconic, still serving. mwah ๐Ÿ’‹โœจ

๐Ÿ“ฆ where this page comes from