Postfix在收到指定地址的邮件时触发启动一个shell脚本

项目中遇到一个问题,就是题目中提到的问题。中文的说明文章好像没有,所以找了一篇英文的文章了解了一下。链接如下: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接收脚本

#!/bin/sh
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步设定就可以了。

猜你喜欢

转载自dimaomao.iteye.com/blog/1961824
今日推荐