Postfix:将电子邮件的副本传递给脚本,但将原始邮件传递给邮箱

其实很简单:我想把所有收到的电子邮件都传递给一个PHP脚本,但是只能作为一个副本,原始邮件仍然照常传递到邮箱。

我似乎无法得到它的工作。 我试过以下

(1)创build一个catchall-alias(mysql):

@mydomain.tld [email protected] 

(2)在/etc/postfix/mailpipe.cf中创build了正则expression式传输映射(基本意思是:应用于mydomain.tld的所有邮件)

 /.*@mydomain\.tld/ mailpipe: 

(3)全部集成在/etc/postfix/main.cf中:

 transport_maps = ... regexp:/etc/postfix/mailpipe.cf virtual_alias_maps = proxy:mysql:/etc/postfix/.... 

(4)将传输添加到/etc/postfix/master.cf中:

 mailpipe unix - nn - - pipe flags=FR user=localuser argv=/path/to/my/script.php ${nexthop} ${user} 

剧本:

 #!/usr/bin/php -q <?php $file = '/home/localuser/pipe/log.log'; $input = file_get_contents('php://input'); file_put_contents($file, $input, FILE_APPEND | LOCK_EX); 

所以设置似乎工作,脚本被打到传入的电子邮件,但$input是空的(尽pipe与任何其他string)。 电子邮件正在处理,然后删除/丢弃。 所以这里是我的两个问题:

  1. 我如何从脚本访问电子邮件的内容?

  2. 如何防止邮件在处理后被丢弃? 有没有办法像平时一样传递一个副本到收件箱,另一个副本到脚本进行处理?

这可以通过使用recipient_bcc_maps BCC将所有电子邮件发送到configuration为路由到您的脚本的仅本地地址来完成。

将以下行添加到/ etc / postfix / recipient_bcc。 编辑完成后运行“postmap / etc / postfix / recipient_bcc”。 这告诉Postfix BCC所有的域名匹配“@ yourdomain.tld”到“robotscript @ localhost”地址的邮件。

 @yourdomain.tld robotscript@localhost 

将以下行添加到/ etc / postfix / transport。 编辑完成后运行“postmap / etc / postfix / transport”。 这告诉Postfix,发往“robotscript @ localhost”地址的邮件将直接在这台服务器上传送,而不会在其他地方传送。

 robotscript@localhost : 

将以下行添加到/etc/postfix/main.cf,以便Postfix将使用上面input的configuration。

 recipient_bcc_maps = hash:/etc/postfix/recipient_bcc transport_maps = hash:/etc/postfix/transport 

确保/etc/postfix/main.cf中的“mydestination”参数包含“localhost”值。

将以下行添加到/ etc / aliases。 编辑完成后运行“postalias / etc / aliases”。 这实际上是将发往“robotscript @ localhost”的邮件传递给您的PHP脚本。 您的脚本应设置为从STDIN读取电子邮件的内容。

 robotscript: "|/path/to/your/php_script.php" 

重新启动Postfix,然后所有的电子邮件都应该被复制到你的脚本中,并传送到原来的收件人地址。