Mail::SpamAssassin::Spamd::Apache2
==================================

This distribution contains a mod_perl2 module, implementing the spamd
protocol from the SpamAssassin (http://spamassassin.apache.org/) project
in Apache2.  It's mostly compatible with the original spamd.

The apache-spamd.pl script is included to help you configuring Apache.

It has been tested on Linux with perl 5.8.8 (with threads), Apache 2.2.2,
and mod_perl 2.0.2 (DSO).  Success / failure reports for other platforms
and configurations are most welcome.

Right now, consider this an alpha version.

Refer to apache-spamd.pl and Mail::SpamAssassin::Spamd::Apache2::Config
documentation (read with perldoc or man) for configuration instructions.


TODO

Hmm... done?


INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install


DEPENDENCIES

  Apache version 2
  mod_perl

If you want to use SSL, you'll also need mod_ssl.  mod_identd is required
for --auth-ident.

Tests use the Apache::Test framework, distributed with mod_perl and
available separately on CPAN.


BUGS
  
See <http://issues.apache.org/SpamAssassin/> to report a bug.

Please include perl, Apache and mod_perl versions. 

`httpd -V` shouldn't hurt (unless you know it doesn't matter in your case).  
`httpd -l` might also be handy, if you're reporting an apache-spamd.pl issue.
Don't forget relevant lines from logs/error_log.

Known bugs: 

Worker (and other threading MPMs) probably will cause
problems.  SA isn't really thread-safe; one example is using umask().
Some helpers like Razor / Pyzor / DCC probably do chdir().  I consider
this a problem of SA, not this code.

# vim: encoding=utf8
