# SpamAssassin rules file: default whitelists
#
# 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>

###########################################################################
# Whitelist rules
#
# Note that most of these get 'noautolearn'.  They should not be
# considered when deciding whether to auto-learn a message, as a
# user slip-up could result in scribbling side-effects in the bayes
# db as a result -- which is hard to remedy.

ifplugin Mail::SpamAssassin::Plugin::WLBLEval

header USER_IN_BLACKLIST	eval:check_from_in_blacklist()
describe USER_IN_BLACKLIST	From: address is in the user's black-list
tflags USER_IN_BLACKLIST	userconf noautolearn

header USER_IN_WHITELIST	eval:check_from_in_whitelist()
describe USER_IN_WHITELIST	From: address is in the user's white-list
tflags USER_IN_WHITELIST	userconf nice noautolearn

header USER_IN_DEF_WHITELIST	eval:check_from_in_default_whitelist()
describe USER_IN_DEF_WHITELIST	From: address is in the default white-list
tflags USER_IN_DEF_WHITELIST	userconf nice noautolearn

header USER_IN_BLACKLIST_TO     eval:check_to_in_blacklist()
describe USER_IN_BLACKLIST_TO   User is listed in 'blacklist_to'
tflags USER_IN_BLACKLIST_TO     userconf noautolearn

header USER_IN_WHITELIST_TO     eval:check_to_in_whitelist()
describe USER_IN_WHITELIST_TO   User is listed in 'whitelist_to'
tflags USER_IN_WHITELIST_TO     userconf nice noautolearn

header USER_IN_MORE_SPAM_TO     eval:check_to_in_more_spam()
describe USER_IN_MORE_SPAM_TO   User is listed in 'more_spam_to'
tflags USER_IN_MORE_SPAM_TO     userconf nice noautolearn

header USER_IN_ALL_SPAM_TO      eval:check_to_in_all_spam()
describe USER_IN_ALL_SPAM_TO    User is listed in 'all_spam_to'
tflags USER_IN_ALL_SPAM_TO      userconf nice noautolearn

if (version >= 3.004000)
body      URI_HOST_IN_BLACKLIST eval:check_uri_host_in_blacklist()
describe  URI_HOST_IN_BLACKLIST host or domain listed in the URI black-list
tflags    URI_HOST_IN_BLACKLIST userconf noautolearn

body      URI_HOST_IN_WHITELIST eval:check_uri_host_in_whitelist()
describe  URI_HOST_IN_WHITELIST host or domain listed in the URI white-list
tflags    URI_HOST_IN_WHITELIST userconf nice noautolearn

header 	  HEADER_HOST_IN_BLACKLIST eval:check_uri_host_listed('BLACK')
describe  HEADER_HOST_IN_BLACKLIST Blacklisted header host or domain
tflags    HEADER_HOST_IN_BLACKLIST userconf noautolearn

header 	  HEADER_HOST_IN_WHITELIST eval:check_uri_host_listed('WHITE')
describe  HEADER_HOST_IN_WHITELIST Whitelisted header host or domain
tflags    HEADER_HOST_IN_WHITELIST userconf nice noautolearn
endif

###########################################################################
# Default whitelists.  These should be addresses which send mail that is often
# tagged (incorrectly) as spam; it also helps that they be addresses of big
# companies with lots of lawyers, so if spammers impersonate them, they'll get
# into big trouble, so it doesn't provide a shortcut around SpamAssassin.
#
# Whitelist and blacklist addresses are now file-glob-style patterns, so
# "friend@somewhere.com", "*@isp.com", or "*.domain.net" will all work.
#
# Please do not add unmoderated public mailing lists here.  They are
# too easily abused by spammers.

def_whitelist_from_rcvd  billing@networksolutions.com           networksolutions.com
def_whitelist_from_rcvd  outbound-response@networksolutions.com networksolutions.com
def_whitelist_from_rcvd  hostmaster@internic.net                internic.net
def_whitelist_from_rcvd  support@register.com                   register.com

def_whitelist_from_rcvd  petitions@petitiononline.com           petitiononline.com
def_whitelist_from_rcvd  *@online.telstra.com.au                telstra.com.au
def_whitelist_from_rcvd  *@yahoo-inc.com                        yahoo-inc.com
def_whitelist_from_rcvd  *@yahoo-inc.com                        yahoo.com
def_whitelist_from_rcvd  *@orbitz.com                           orbitz.com

def_whitelist_from_rcvd  *@LISTSERV.NTBUGTRAQ.COM                  lsoft.com
def_whitelist_from_rcvd  freshmeat-news-admin@lists.freshmeat.net  freshmeat.net
def_whitelist_from_rcvd  *@mailer.whitehat.com                     whitehat.com
def_whitelist_from_rcvd  *@spamex.com                              spamex.com
def_whitelist_from_rcvd  *enotify@usenix.org                       voyager.usenix.org

# internet.com lists
def_whitelist_from_rcvd  listsupport@internet.com               lyris.net

# FT.com newsletters
def_whitelist_from_rcvd  *@newsbyemail.ft.com                   lodo.exactis.com

# Friends re-united (popular UK old-school-network)
def_whitelist_from_rcvd  *@friendsreunited.co.uk                friendsreunited.co.uk

# RFC Editor mails
def_whitelist_from_rcvd  rfc-editor@rfc-editor.org              isi.edu
def_whitelist_from_rcvd  *@*.nsi-direct.com                     e-dialog.com

endif
