# SpamAssassin - SPF rules
#
# Please don't modify this file as your changes will be overwritten with
# the next update. Use @@LOCAL_RULES_DIR@@/local.cf instead.
# See 'perldoc Mail::SpamAssassin::Conf' for details.
#
# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at:
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>
#
###########################################################################

# Requires the Mail::SpamAssassin::Plugin::SPF plugin be loaded.

ifplugin Mail::SpamAssassin::Plugin::SPF

# SPF support:
#   "pass" is nice
#   "neutral" is somewhat bad
#   "fail" is bad
#   "softfail" is bad, but not as bad as "fail"
#   "permerror" is very bad, and means the domain doesn't have a valid spf record
# These are more trustworthy results than the SPF_HELO rules.

# some are "userconf" so that scores are set by hand?

header   SPF_PASS	eval:check_for_spf_pass()
describe SPF_PASS	SPF: sender matches SPF record
tflags   SPF_PASS	nice userconf net
reuse    SPF_PASS

header   SPF_NEUTRAL	eval:check_for_spf_neutral()
describe SPF_NEUTRAL	SPF: sender does not match SPF record (neutral)
tflags   SPF_NEUTRAL	net
reuse    SPF_NEUTRAL

header   SPF_FAIL	eval:check_for_spf_fail()
describe SPF_FAIL	SPF: sender does not match SPF record (fail)
tflags   SPF_FAIL	net
reuse    SPF_FAIL

header   SPF_SOFTFAIL	eval:check_for_spf_softfail()
describe SPF_SOFTFAIL	SPF: sender does not match SPF record (softfail)
tflags   SPF_SOFTFAIL	net
reuse    SPF_SOFTFAIL


# NOTE: SPF_HELO_PASS is not incredibly hard to fake, so shouldn't
# provide much in the way of points compared to SPF_PASS et al.
# However, a *failure* is still a very good spamsign.

header   SPF_HELO_PASS		eval:check_for_spf_helo_pass()
describe SPF_HELO_PASS		SPF: HELO matches SPF record
tflags   SPF_HELO_PASS		nice userconf net
reuse    SPF_HELO_PASS

header   SPF_HELO_NEUTRAL	eval:check_for_spf_helo_neutral()
describe SPF_HELO_NEUTRAL	SPF: HELO does not match SPF record (neutral)
tflags   SPF_HELO_NEUTRAL	net
reuse    SPF_HELO_NEUTRAL

header   SPF_HELO_FAIL		eval:check_for_spf_helo_fail()
describe SPF_HELO_FAIL		SPF: HELO does not match SPF record (fail)
tflags   SPF_HELO_FAIL		net
reuse    SPF_HELO_FAIL

header   SPF_HELO_SOFTFAIL	eval:check_for_spf_helo_softfail()
describe SPF_HELO_SOFTFAIL	SPF: HELO does not match SPF record (softfail)
tflags   SPF_HELO_SOFTFAIL	net
reuse    SPF_HELO_SOFTFAIL

# Implementing the Sender Check for No SPF REcord defaulting to disabled so Admins can override
header   SPF_NONE		eval:check_for_spf_none()
describe SPF_NONE		SPF: sender does not publish an SPF Record
tflags   SPF_NONE		net
reuse    SPF_NONE

header   SPF_HELO_NONE		eval:check_for_spf_helo_none()
describe SPF_HELO_NONE		SPF: HELO does not publish an SPF Record
tflags   SPF_HELO_NONE		net
reuse    SPF_HELO_NONE



if can(Mail::SpamAssassin::Plugin::SPF::has_check_for_spf_errors)

header   T_SPF_PERMERROR	eval:check_for_spf_permerror()
describe T_SPF_PERMERROR	SPF: test of record failed (permerror)
tflags   T_SPF_PERMERROR	net
reuse    T_SPF_PERMERROR

header   T_SPF_TEMPERROR	eval:check_for_spf_temperror()
describe T_SPF_TEMPERROR	SPF: test of record failed (temperror)
tflags   T_SPF_TEMPERROR	net
reuse    T_SPF_TEMPERROR

header   T_SPF_HELO_PERMERROR	eval:check_for_spf_helo_permerror()
describe T_SPF_HELO_PERMERROR	SPF: test of HELO record failed (permerror)
tflags   T_SPF_HELO_PERMERROR	net
reuse    T_SPF_HELO_PERMERROR

header   T_SPF_HELO_TEMPERROR	eval:check_for_spf_helo_temperror()
describe T_SPF_HELO_TEMPERROR	SPF: test of HELO record failed (temperror)
tflags   T_SPF_HELO_TEMPERROR	net
reuse    T_SPF_HELO_TEMPERROR

endif



endif   # Mail::SpamAssassin::Plugin::SPF
