其实很简单:我想把所有收到的电子邮件都传递给一个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)。 电子邮件正在处理,然后删除/丢弃。 所以这里是我的两个问题:
我如何从脚本访问电子邮件的内容?
如何防止邮件在处理后被丢弃? 有没有办法像平时一样传递一个副本到收件箱,另一个副本到脚本进行处理?
这可以通过使用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,然后所有的电子邮件都应该被复制到你的脚本中,并传送到原来的收件人地址。