<@LICENSE>
Copyright 2004 Apache Software Foundation

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

=head1 NAME

spamassassin - simple front-end filtering script for SpamAssassin

=head1 SYNOPSIS

B<spamassassin> [options] [ < I<mailmessage> | I<path> ... ]

B<spamassassin> B<-d> [ < I<mailmessage> | I<path> ... ]

B<spamassassin> B<-r> [ < I<mailmessage> | I<path> ... ]

B<spamassassin> B<-k> [ < I<mailmessage> | I<path> ... ]

B<spamassassin> B<-W>|B<-R> [ < I<mailmessage> | I<path> ... ]

Options:

 -L, --local                       Local tests only (no online tests)
 -r, --report                      Report message as spam
 -k, --revoke                      Revoke message as spam
 -d, --remove-markup               Remove spam reports from a message
 -C path, --configpath=path, --config-file=path
                                   Path to standard configuration dir
 -p prefs, --prefspath=file, --prefs-file=file
                                   Set user preferences file
 --siteconfigpath=path             Path for site configs
                                   (def: /etc/mail/spamassassin)
 --cf='config line'                Additional line of configuration
 --pre='config line'               Additional line of ".pre" (prepended to configuration)
 -x, --nocreate-prefs              Don't create user preferences file
 -e, --exit-code                   Exit with a non-zero exit code if the
                                   tested message was spam
 --mbox                            read in messages in mbox format
 --mbx                             read in messages in UW mbx format
 -t, --test-mode                   Pipe message through and add extra
                                   report to the bottom
 --lint                            Lint the rule set: report syntax errors
 -W, --add-to-whitelist            Add addresses in mail to persistent address whitelist
 --add-to-blacklist                Add addresses in mail to persistent address blacklist
 -R, --remove-from-whitelist       Remove all addresses found in mail from
                                   persistent address list
 --add-addr-to-whitelist=addr      Add addr to persistent address whitelist
 --add-addr-to-blacklist=addr      Add addr to persistent address blacklist
 --remove-addr-from-whitelist=addr Remove addr from persistent address list
 -4 --ipv4only, --ipv4-only, --ipv4 Use IPv4, disable use of IPv6 for DNS etc.
 -6                                Use IPv6, disable use of IPv4 where possible
 --progress                        Print progress bar
 -D, --debug [area=n,...]          Print debugging messages
 -V, --version                     Print version
 -h, --help                        Print usage message

=head1 DESCRIPTION

spamassassin is a simple front-end filter for SpamAssassin.

Using the SpamAssassin rule base, it uses a wide range of heuristic
tests on mail headers and body text to identify "spam", also known as
unsolicited bulk email.  Once identified, the mail is then tagged as
spam for later filtering using the user's own mail user-agent
application.

The default tagging operations that take place are detailed in L<spamassassin/"TAGGING">.

By default, message(s) are read in from STDIN (< I<mailmessage>), or
from specified files and directories (I<path> ...)  STDIN and files
are assumed to be in I<file> format, with a single message per file.
Directories are assumed to be in a format where each file in the directory
contains only one message (directories are not recursed and filenames
containing whitespace or beginning with "." or "," are skipped).
The options I<--mbox> and I<--mbx> can override the assumed format,
see the appropriate OPTION information below.

Files compressed with gzip/bzip2/xz/lz4/lzip/lzo are uncompressed
automatically.  See C<Mail::SpamAssassin::ArchiveIterator> for more details.

Please note that SpamAssassin is not designed to scan huge messages. 
Messages larger than ~10-20MB should not be fed to SpamAssassin, as memory
consumption will increase rapidly.

=head1 OPTIONS

=over 4

=item B<-e>, B<--error-code>, B<--exit-code>

Exit with a non-zero error code, if the message is determined to be
spam.

=item B<-h>, B<--help>

Print help message and exit.

=item B<-V>, B<--version>

Print version and exit.

=item B<-t>, B<--test-mode>

Test mode.  Pipe message through and add extra report.  Note that the report
text assumes that the message is spam, since in normal use it is only visible
in this case.  Pay attention to the score instead.

If you run this with B<-d>, the message will first have SpamAssassin
markup removed before being tested.

=item B<-r>, B<--report>

Report this message as manually-verified spam.  This will submit the mail
message read from STDIN to various spam-blocker databases.  Currently,
these are the Distributed Checksum Clearinghouse
C<https://www.dcc-servers.net/dcc/>, Pyzor
C<https://www.pyzor.org/>, Vipul's Razor
C<http://razor.sourceforge.net/>, and SpamCop C<https://www.spamcop.net/>.

If the message contains SpamAssassin markup, the markup will be stripped
out automatically before submission.  The support modules for DCC, Pyzor,
and Razor must be installed for spam to be reported to each service.
SpamCop reports will have greater effect if you register and set the
C<spamcop_to_address> option.

The message will also be submitted to SpamAssassin's learning systems;
currently this is the internal Bayesian statistical-filtering system (the
BAYES rules).  (Note that if you I<only> want to perform statistical
learning, and do not want to report mail to third-parties, you should use
the C<sa-learn> command directly instead.)

=item B<-k>, B<--revoke>

Revoke this message.  This will revoke the mail message read from STDIN from
various spam-blocker databases.  Currently, these are Vipul's Razor.

Revocation support for the Distributed Checksum Clearinghouse, Pyzor, and
SpamCop is not currently available.

If the message contains SpamAssassin markup, the markup will be stripped
out automatically before submission.  The support modules for Razor must
be installed for spam to be revoked from the service.

The message will also be submitted as 'ham' (non-spam) to SpamAssassin's
learning systems; currently this is the internal Bayesian
statistical-filtering system (the BAYES rules).  (Note that if you I<only>
want to perform statistical learning, and do not want to report mail to
third-parties, you should use the C<sa-learn> command directly instead.)

=item B<--lint>

Syntax check (lint) the rule set and configuration files, reporting
typos and rules that do not compile correctly.  Exits with 0 if there
are no errors, or greater than 0 if any errors are found.

=item B<-W>, B<--add-to-whitelist>

Add all email addresses, in the headers and body of the mail message read
from STDIN, to a persistent address whitelist.  Note that you must be running
C<spamassassin> or C<spamd> with a persistent address list plugin enabled for
this to work.

=item B<--add-to-blacklist>

Add all email addresses, in the headers and body of the mail message read
from STDIN, to the persistent address blacklist.  Note that you must be
running C<spamassassin> or C<spamd> with a persistent address list plugin
enabled for this to work.

=item B<-R>, B<--remove-from-whitelist>

Remove all email addresses, in the headers and body of the mail message read
from STDIN, from a persistent address list. STDIN must contain a full email
message, so to remove a single address you should use
B<--remove-addr-from-whitelist> instead.

Note that you must be running C<spamassassin> or C<spamd> with a persistent
address list plugin enabled for this to work.

=item B<--add-addr-to-whitelist>

Add the named email address to a persistent address whitelist.  Note that you
must be running C<spamassassin> or C<spamd> with a persistent address list
plugin enabled for this to work.

=item B<--add-addr-to-blacklist>

Add the named email address to a persistent address blacklist.  Note that you
must be running C<spamassassin> or C<spamd> with a persistent address list
plugin enabled for this to work.

=item B<--remove-addr-from-whitelist>

Remove the named email address from a persistent address whitelist.  Note that
you must be running C<spamassassin> or C<spamd> with a persistent address
list plugin enabled for this to work.

=item B< --ipv4only>, B<--ipv4-only>, B<--ipv4>

Do not use IPv6 for DNS tests. Normally, SpamAssassin will try to detect if
IPv6 is available, using only IPv4 if it is not. Use if the existing tests
for IPv6 availability produce incorrect results or crashes.

=item B<-L>, B<--local>

Do only the ''local'' tests, ones that do not require an internet connection to
operate.  Normally, SpamAssassin will try to detect whether you are connected
to the net before doing these tests anyway, but for faster checks you may wish
to use this.

Note that SpamAssassin's network rules are run in parallel.  This can cause
overhead in terms of the number of file descriptors required if B<--local> is
not used; it is recommended that the minimum limit on fds be raised to at least
256 for safety.

=item B<-d>, B<--remove-markup>

Remove SpamAssassin markup (the "SpamAssassin results" report, X-Spam-Status
headers, etc.) from the mail message.  The resulting message, which will be
more or less identical to the original, pre-SpamAssassin input, will be output
to STDOUT.

(Note: the message will not be exactly identical; some headers will be
reformatted due to some features of the Mail::Internet package, but the body
text will be.)

=item B<-C> I<path>, B<--configpath>=I<path>, B<--config-file>=I<path>

Use the specified path for locating the distributed configuration files.
Ignore the default directories (usually C</usr/share/spamassassin> or similar).

=item B<--siteconfigpath>=I<path>

Use the specified path for locating site-specific configuration files.  Ignore
the default directories (usually C</etc/mail/spamassassin> or similar).

=item B<--cf='config line'>

Add additional lines of configuration directly from the command-line, parsed
after the configuration files are read.   Multiple B<--cf> arguments can be
used, and each will be considered a separate line of configuration.  For
example:

        spamassassin -t --cf="body NEWRULE /text/" --cf="score NEWRULE 3.0"

=item B<--pre='config line'>

Add additional lines of .pre configuration directly from the command-line,
parsed before the configuration files are read.  Multiple B<--pre> arguments
can be used, and each will be considered a separate line of configuration. 
For example:

        spamassassin -t --pre="loadplugin Mail::SpamAssassin::Plugin::Foobar"

=item B<-p> I<prefs>, B<--prefspath>=I<prefs>, B<--prefs-file>=I<prefs>

Read user score preferences from I<prefs> (usually C<$HOME/.spamassassin/user_prefs>).

=item B<--progress>

Prints a progress bar (to STDERR) showing the current progress.  This option
will only be useful if you are redirecting STDOUT (and not STDERR).  In the
case where no valid terminal is found this option will behave very much like
the --showdots option in other SpamAssassin programs.

=item B<-D> [I<area,...>], B<--debug> [I<area,...>]

Produce debugging output. If no areas are listed, all debugging information is
printed. Diagnostic output can also be enabled for each area individually;
I<area> is the area of the code to instrument. For example, to produce
diagnostic output on bayes, learn, and dns, use:

        spamassassin -D bayes,learn,dns

Higher priority informational messages that are suitable for logging in normal
circumstances are available with an area of "info".

For more information about which areas (also known as channels) are available,
please see the documentation at:

	L<https://wiki.apache.org/spamassassin/DebugChannels>

=item B<-x>, B<--nocreate-prefs>

Disable creation of user preferences file.

=item B<--mbox>

Specify that the input message(s) are in mbox format.  mbox is a standard
Unix message folder format.

=item B<--mbx>

Specify that the input message(s) are in UW .mbx format.  mbx is
the mailbox format used within the University of Washington's IMAP
implementation; see C<https://en.wikipedia.org/wiki/UW_IMAP>.

=back

=head1 SEE ALSO

sa-learn(1)
spamd(1)
spamc(1)
Mail::SpamAssassin::Conf(3)
Mail::SpamAssassin(3)

=head1 PREREQUISITES

C<Mail::SpamAssassin>

=head1 BUGS

See <https://issues.apache.org/SpamAssassin/>

=head1 AUTHORS

The SpamAssassin(tm) Project <https://spamassassin.apache.org/>

=head1 COPYRIGHT

SpamAssassin is distributed under the Apache License, Version 2.0, as
described in the file C<LICENSE> included with the distribution.

=cut

