项目中遇到一个问题,就是题目中提到的问题。中文的说明文章好像没有,所以找了一篇英文的文章了解了一下。链接如下:http://blog.thecodingmachine.com/content/triggering-php-script-when-your-postfix-server-receives-mail如果我写的文字有哪些地方难以理解大家可以参照英文原版。
以下是我在个人理解的基础之上整理的,请大家指正。(原文章是触发调用PHP脚本,此处改为Sheel脚本)
1. 打开 master.cf 追加以下一行文本。
myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/postfix.sh ${sender} ${size} ${recipient}
这里创建一个filter(过滤器),别名myhook是管道(pipe)模式的,这一点要注意,一旦配置成功,邮件将直接以标准输入(stdin)转给argv指定的脚本。
另外,稍微说明一下user,这个用户我们试了root,出错!postfix以及postfix组用户,出错!没时间调查原因。后来新建了一个用户,没有设定用户组,却执行成功了,哎……悲剧。这里搞不懂,请高手知道原因的指点迷津!还有后面的参数,其实pipe有好多,这三个是原文章给出来的,我没变直接用了,好像我们的处理脚本也不需要。
2. 继续修改 master.cf 找到下面的文本
smtp inet n - - - - smtpd
追加
-o content_filter=myhook:dummy
这里的意思是将smtp收到的邮件转给filter。
再找到一下文本内容
pickup fifo n - - 60 1 pickup
同样追加一下内容
-o content_filter=myhook:dummy
和上面一样的,这里是将通过命令行sendmail的邮件转给filte。如果不需要不加也行。
到这里我们reload一下postfix
postfix reload
如果你已经准备好了shell那么就可以直接测试一下,看是否有任意邮件被收到postfix就默认调用shell。说实话我没试过,原文这样说的。我一口气配置到底的。
3. 给出shell接收脚本
MAILDIR=/home/mailtest2/MAILDIR/new/
FILENAME=""
email=""
while read line ; do
email+=${line}"\n"
done
echo -e $email > /home/postfix/postfix.log
DATE=`date +"%Y%m%d%H%M%S"`
#echo ${1}+${DATE} > /home/postfix/postfix.log
4. 下面指定过滤
找到 access 并修改,没有新建。追加如下内容:
[email protected] FILTER myhook:dummy
当然,收件人地址你可以随便指定,这里是个例子。
别动,还没完人家说 access 文件必须被Hash化,所以我们要执行命令行。
postmap /etc/postfix/access
就是上面的命令了,路径自己确认一下,可以修改的。
5. 最后我们要把对 access 的参照加到 main.cf 中。
如果文件中存在key
smtpd_recipient_restrictions
在key值的最开头追加
check_recipient_access hash:/etc/postfix/access
如果key值根本不存在就直接追加下面的内容
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination
追后, postfix reload
试试看,发送一封邮件到你定义过滤的邮箱能否启动shell输出一个文件到制定的目录下。
哦!对了,由于Postfix直接将输入以管道(pipe)标准输入(stdin)的形式转给脚本了,所以在postfix的收件文件夹下就不会再生成邮件文件了。
以下是测试后针对出现问题的修正:
这对上面的第2步,如果要求针对,特定的地址启动过滤的话,需要删除掉该步骤追加在 master.cf中的内容。因为该设定内容会针对所有的smtp和pickup方式发送的邮件,在被postfix收到后启动特定的脚本处理。在第1步设定以后直接跳到第4步设定就可以了。