# 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

###########################################################################
# 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

# bug 1348
def_whitelist_from_rcvd  *@warehouse.com                        warehouse.com
def_whitelist_from_rcvd  *@*.efax.com                           efax.com

endif
