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

Qua*_*unk 3 email scripting postfix pipe sieve

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

我似乎无法让它工作。我试过以下

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

@mydomain.tld   pipe@mydomain.tld
Run Code Online (Sandbox Code Playgroud)

(2)在/etc/postfix/mailpipe.cf中创建regex-transport映射(基本意思是:适用于mydomain.tld的所有邮件)

/.*@mydomain\.tld/   mailpipe:
Run Code Online (Sandbox Code Playgroud)

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

transport_maps = ... regexp:/etc/postfix/mailpipe.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/....
Run Code Online (Sandbox Code Playgroud)

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

mailpipe   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.php
  ${nexthop} ${user}
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/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);
Run Code Online (Sandbox Code Playgroud)

所以设置似乎有效,脚本在传入的电子邮件中被命中,但它$input是空的(尽管适用于任何其他字符串)。正在处理电子邮件,然后将其删除/丢弃。所以这是我的两个问题:

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

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

小智 8

这可以通过使用 receiver_bcc_maps 将所有电子邮件密件抄送到一个配置为路由到您的脚本的本地地址来实现。

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

@yourdomain.tld  robotscript@localhost
Run Code Online (Sandbox Code Playgroud)

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

robotscript@localhost :
Run Code Online (Sandbox Code Playgroud)

将以下行添加到 /etc/postfix/main.cf 以便 Postfix 将使用上面输入的配置。

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
transport_maps = hash:/etc/postfix/transport
Run Code Online (Sandbox Code Playgroud)

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

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

robotscript: "|/path/to/your/php_script.php"
Run Code Online (Sandbox Code Playgroud)

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