Using SpamAssassin on a Sendmail relay

Using SpamAssassin with Sendmail on a mail relay (i.e. a mail server that is not the final destination of the email) may be accomplished through the use of a "milter" plugin or by procmail.

Milter solutions:

1. MIMEdefang
2. milter-spamc
3. spamass-milt

Procmail solutions:

1. How to Filter All Incoming (and/or Outgoing) Mail with procmail

The following document details the procmail solution on a Solaris 8 system running Sendmail 8.12.11 and SpamAssassin 2.63. Please read the above link in its entirety before attempting this solution.

Step-by-step instructions

1. Install procmail.

I chose to download and install the procmail package from Sunfreeware.

2. Install Perl 5.8.0.

The version of Perl supplied with Solaris 8 is 5.005_03. Newer versions of SpamAssassin will not include support for versions of Perl earlier than 5.6.0.

I chose to download and install the Perl 5.8.0 package from Sunfreeware.

3. Install SpamAssassin and all prerequisites using the CPAN module.

su -
/usr/local/bin/perl -MCPAN -e shell
install  Mail::SpamAssassin

4. Configure the Sendmail macro configuration file.

Add the following lines toward the top of (below the MAILER lines):

define(`PROCMAIL_MAILER_ARGS', `procmail -m $h $g $u')dnl
define(`PROCMAIL_MAILER_FLAGS', `mSDFMhun')dnl

Add the following to the bottom of



R$* < @ $=w > $*        $#procmail $@ /etc/mail/procmailrc $: $1<@$2.procmail.>$3
R$* < @ $=w. > $*       $#procmail $@ /etc/mail/procmailrc $: $1<@$2.procmail.>$3
R$* < @ $=R > $*        $#procmail $@ /etc/mail/procmailrc $: $1<@$2.procmail.>$3
R$* < @ $=R. > $*       $#procmail $@ /etc/mail/procmailrc $: $1<@$2.procmail.>$3
R$* < @$* .procmail. > $*       $1<@$2.>$3      Already filtered, map to original address

Note: it is essential to use tabs between $*/$#,  $*/$1, and $3/Already in the lines above!

5. Create the site-wide /etc/mail/procmailrc file. The file must end with:

:0 w
! -oi -f "$@"

Here are the contents of my /etc/mail/procmailrc file:

* < 256000
| /usr/local/bin/spamc

:0 w
! -oi -f "$@"

6. Configure the site-wide /etc/mail/spamassassin/ file, if applicable. I chose to add required_hits 10 and report_safe 0 when testing out SpamAssassin on a Sendmail relay.

7. Backup the Sendmail configuration file; build and install the new Sendmail configuration file.
cp /etc/mail/ /etc/mail/`date +%m.%d.%y`
cd Sendmail_source/cf/cf
su root -c 'PATH=$PATH:/usr/ccs/bin ./Build install-cf'

8. Create a spamd startup/shutdown script.

cat << SCRIPT > /etc/init.d/spamd

case \$1 in

'start' )
   /usr/local/bin/spamd -d -u nobody
'stop' )
   pkill spamd
   echo "usage: \`basename \$0\` {start|stop}"

chown root:sys /etc/init.d/spamd
chmod 744 /etc/init.d/spamd

9. Start the SpamAssassin daemon.
/etc/init.d/spamd start

10. Send Sendmail a SIGHUP to reread the new configuration file.
kill -HUP `head -1 /var/run/`

Back to
Last modified: 10/06/2004