.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Mail::SpamAssassin::Plugin::SPF 3pm" .TH Mail::SpamAssassin::Plugin::SPF 3pm "2022-09-10" "perl v5.34.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Mail::SpamAssassin::Plugin::SPF \- perform SPF verification tests .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& loadplugin Mail::SpamAssassin::Plugin::SPF .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This plugin checks a message against Sender Policy Framework (\s-1SPF\s0) records published by the domain owners in \s-1DNS\s0 to fight email address forgery and make it easier to identify spams. .PP It's recommended to use \s-1MTA\s0 filter (pypolicyd-spf / spf-engine etc), so this plugin can reuse the Received-SPF and/or Authentication-Results header results as is. Otherwise throughput could suffer, \s-1DNS\s0 lookups done by this plugin are not asynchronous. Those headers will also help when SpamAssassin is not able to correctly detect EnvelopeFrom. .SH "USER SETTINGS" .IX Header "USER SETTINGS" .IP "welcomelist_from_spf user@example.com" 4 .IX Item "welcomelist_from_spf user@example.com" Previously whitelist_from_spf which will work interchangeably until 4.1. .Sp Works similarly to welcomelist_from, except that in addition to matching a sender address, a check against the domain's \s-1SPF\s0 record must pass. The first parameter is an address to welcomelist, and the second is a string to match the relay's rDNS. .Sp Just like welcomelist_from, multiple addresses per line, separated by spaces, are \s-1OK.\s0 Multiple \f(CW\*(C`welcomelist_from_spf\*(C'\fR lines are also \s-1OK.\s0 .Sp The headers checked for welcomelist_from_spf addresses are the same headers used for \s-1SPF\s0 checks (Envelope-From, Return-Path, X\-Envelope-From, etc). .Sp Since this welcomelist requires an \s-1SPF\s0 check to be made, network tests must be enabled. It is also required that your trust path be correctly configured. See the section on \f(CW\*(C`trusted_networks\*(C'\fR for more info on trust paths. .Sp e.g. .Sp .Vb 2 \& welcomelist_from_spf joe@example.com fred@example.com \& welcomelist_from_spf *@example.com .Ve .IP "def_welcomelist_from_spf user@example.com" 4 .IX Item "def_welcomelist_from_spf user@example.com" Previously def_whitelist_from_spf which will work interchangeably until 4.1. .Sp Same as \f(CW\*(C`welcomelist_from_spf\*(C'\fR, but used for the default welcomelist entries in the SpamAssassin distribution. The welcomelist score is lower, because these are often targets for spammer spoofing. .IP "unwelcomelist_from_spf user@example.com" 4 .IX Item "unwelcomelist_from_spf user@example.com" Previously unwhitelist_from_spf which will work interchangeably until 4.1. .Sp Used to remove a \f(CW\*(C`welcomelist_from_spf\*(C'\fR or \f(CW\*(C`def_welcomelist_from_spf\*(C'\fR entry. The specified email address has to match exactly the address previously used. .Sp Useful for removing undesired default entries from a distributed configuration by a local or site-specific configuration or by \f(CW\*(C`user_prefs\*(C'\fR. .SH "ADMINISTRATOR OPTIONS" .IX Header "ADMINISTRATOR OPTIONS" .IP "spf_timeout n (default: 5)" 4 .IX Item "spf_timeout n (default: 5)" How many seconds to wait for an \s-1SPF\s0 query to complete, before scanning continues without the \s-1SPF\s0 result. A numeric value is optionally suffixed by a time unit (s, m, h, d, w, indicating seconds (default), minutes, hours, days, weeks). .IP "ignore_received_spf_header (0|1) (default: 0)" 4 .IX Item "ignore_received_spf_header (0|1) (default: 0)" By default, to avoid unnecessary \s-1DNS\s0 lookups, the plugin will try to use the \&\s-1SPF\s0 results found in any \f(CW\*(C`Received\-SPF\*(C'\fR headers it finds in the message that could only have been added by an internal relay. .Sp Set this option to 1 to ignore any \f(CW\*(C`Received\-SPF\*(C'\fR headers present and to have the plugin perform the \s-1SPF\s0 check itself. .Sp Note that unless the plugin finds an \f(CW\*(C`identity=helo\*(C'\fR, or some unsupported identity, it will assume that the result is a mfrom \s-1SPF\s0 check result. The only identities supported are \f(CW\*(C`mfrom\*(C'\fR, \f(CW\*(C`mailfrom\*(C'\fR and \f(CW\*(C`helo\*(C'\fR. .IP "use_newest_received_spf_header (0|1) (default: 0)" 4 .IX Item "use_newest_received_spf_header (0|1) (default: 0)" By default, when using \f(CW\*(C`Received\-SPF\*(C'\fR headers, the plugin will attempt to use the oldest (bottom most) \f(CW\*(C`Received\-SPF\*(C'\fR headers, that were added by internal relays, that it can parse results from since they are the most likely to be accurate. This is done so that if you have an incoming mail setup where one of your primary MXes doesn't know about a secondary \s-1MX\s0 (or your MXes don't know about some sort of forwarding relay that \s-1SA\s0 considers trusted+internal) but \s-1SA\s0 is aware of the actual domain boundary (internal_networks setting) \s-1SA\s0 will use the results that are most accurate. .Sp Use this option to start with the newest (top most) \f(CW\*(C`Received\-SPF\*(C'\fR headers, working downwards until results are successfully parsed. .IP "has_check_for_spf_errors" 4 .IX Item "has_check_for_spf_errors" Adds capability check for \*(L"if \fBcan()\fR\*(R" for check_for_spf_permerror, check_for_spf_temperror, check_for_spf_helo_permerror and check_for_spf_helo_permerror .IP "has_check_spf_skipped_noenvfrom" 4 .IX Item "has_check_spf_skipped_noenvfrom" Adds capability check for \*(L"if \fBcan()\fR\*(R" for check_spf_skipped_noenvfrom .RS 4 .IP "check_spf_skipped_noenvfrom" 4 .IX Item "check_spf_skipped_noenvfrom" Checks if \s-1SPF\s0 checks have been skipped because EnvelopeFrom cannot be determined. .RE .RS 4 .RE