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

# character set used in the following texts
#lang it report_charset iso-8859-1

#                     ........................................................................
#lang it clear_unsafe_report_template
#lang it unsafe_report Attenzione: il messaggio originale non testo puro, e potrebbe essere
#lang it unsafe_report pericoloso da aprire con alcuni programmi di posta.  Ad esempio, potrebbe
#lang it unsafe_report contenere un virus, o confermare ad un mittente di spam che il messaggio
#lang it unsafe_report stato letto.  Un modo sicuro per visualizzarne il testo (ma non le
#lang it unsafe_report immagini o gli allegati) salvarlo in un file e aprirlo con un editor.
#                     ........................................................................
