Integrating SpamAssassin into Postfix using spamd
The easiest way to integrate postfix and spamassassin is to use spamd.
First, edit /etc/postfix/master.cf, find the
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (50) # ========================================================================== ... smtp inet n - n - - smtpd ...
line and just add " -o content_filter=spamassassin" to the end of the line:
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (50) # ========================================================================== ... smtp inet n - n - - smtpd -o content_filter=spamassassin ...
Then, go to the end of the file, and add this:
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (50) # ========================================================================== ... spamassassin unix - n n - - pipe user=nobody argv=/path/to/spamc -f -e /path/to/postfix/sendmail -oi -f ${sender} ${recipient} # make sure it's all on one line or # start the consecutive lines with a whitespace # like I did here
Make sure that you have adjusted the path to the spamc and sendmail commands above! Then, setup spamd to start with the system, and you are ready to go. If you wish to provide spamassassin preferences, change "user=nobody" to a valid system user (except for root, since Postfix will NOT call external programs as root), and add .spamassassin into that user's home directory.
If you use user preferences stored in SQL, you should change "spamassassin" service in master.cf to following:
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (50) # ========================================================================== ... spamassassin unix - n n - - pipe user=nobody argv=/path/to/spamc -f -u ${recipient} -e /path/to/postfix/sendmail -oi -f ${sender} ${recipient}
Notice "-u ${recipient}" added. Otherwise "username" field in database will always appear as user which postfix is invoking spamc(in this example it is 'nobody').
Note that this exact method of invoking SpamAssassin is not very robust. Should spamc for some reason fail to start, Postfix will start bouncing mail. A more robust but also more I/O-intensive solution is the one proposed in the [http://www.postfix.org/FILTER_README.html FILTER_README file] that comes with the Postfix distribution. See [IntegratePosfixViaSpampd] for one approach.
Only mail received by SMTP will be scanned with this method, i.e. mail injected with sendmail(1) will not be fed to SpamAssassin.