继续 VPS 搭建邮件服务器的系列。
这次是内容过滤。当这个系列还在第二篇的时候,我就开启了 Spamassassin 来过滤垃圾邮件。当时的设置是
smtp inet n - n - - smtpd -o content_filter=spamassassin
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/vendor_perl/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
现在我有了一个新的需求,我需要在 spamassassin 之后再进行一个内容过滤。
写脚本的部分很简单,postfix 的文档中有详细介绍。
简单来说,就是创建一个这样的脚本
#!/bin/sh
# Simple shell-based filter. It is meant to be invoked as follows:
# /path/to/script -f sender recipients...
# Localize these. The -G option does nothing before Postfix 2.3.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here.
# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15
# Start processing.
cd $INSPECT_DIR || {
echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
cat >in.$$ || {
echo Cannot save mail to file; exit $EX_TEMPFAIL; }
# Specify your content filter here.
# filter <in.$$ || {
# echo Message content rejected; exit $EX_UNAVAILABLE; }
$SENDMAIL "$@" <in.$$
exit $?
并建立一个/var/spool/filter
目录,并改为spamd
用户可读写。
之后将/etc/postfix/master.cf
中spamassassin
的那一行改为spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/vendor_perl/spamc -f -e /path/to/script -f ${sender} ${recipient}
然而,经过测试,postfix 会给出Exec format error
的错误,并且停止邮件投递。
最后尝试各种解决方法后发现,如果需要由 spamassassin 来执行下一个内容过滤器,那么必须使用可执行二进制文件。也就是说,需要把上面那个脚本转换成可执行二进制文件。最终用shc
转换后搞定。