![Postfix:将电子邮件副本传递给脚本,但将原始电子邮件发送到邮箱](https://linux22.com/image/617490/Postfix%EF%BC%9A%E5%B0%86%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%89%AF%E6%9C%AC%E4%BC%A0%E9%80%92%E7%BB%99%E8%84%9A%E6%9C%AC%EF%BC%8C%E4%BD%86%E5%B0%86%E5%8E%9F%E5%A7%8B%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%8F%91%E9%80%81%E5%88%B0%E9%82%AE%E7%AE%B1.png)
其实很简单:我想将所有收到的电子邮件传递给 PHP 脚本,但仅作为副本,原始电子邮件仍将照常传送到邮箱。
我似乎无法让它工作。我尝试了以下方法
(1)创建了一个 catchall-alias (mysql):
@mydomain.tld [email protected]
(2)在 /etc/postfix/mailpipe.cf 中创建了正则表达式传输映射(基本上意味着:应用于 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 - n n - - 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
空(尽管可以与任何其他字符串一起使用)。电子邮件正在被处理,然后被删除/丢弃。这是我的两个问题:
如何从脚本访问电子邮件的内容?
如何防止电子邮件在处理后被丢弃?有没有办法像往常一样将一份副本传递到收件箱,将另一份副本传递到脚本进行处理?
答案1
这可以通过使用recipient_bcc_maps将所有电子邮件密件抄送到配置为路由到您的脚本的本地地址来实现。
将以下行添加到 /etc/postfix/recipient_bcc。编辑完成后,运行“postmap /etc/postfix/recipient_bcc”。这会告诉 Postfix 将所有域名与“@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 使用上面输入的配置。
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,然后您的所有电子邮件都将被复制到您的脚本并传送到原始收件人地址。