Email

後綴:將電子郵件副本傳遞給腳本,但將原始郵件傳遞到郵箱

  • September 5, 2013

這實際上很簡單:我想將所有收到的電子郵件傳遞給 PHP 腳本,但僅作為副本,原始電子郵件仍應照常發送到郵箱。

我似乎無法讓它工作。我試過以下

**(1)**創建了一個包羅萬象的別名(mysql):

@mydomain.tld   pipe@mydomain.tld

**(2)**在/etc/postfix/mailpipe.cf中創建了一個regex-transport映射(基本意思是:適用於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. 如何從腳本訪問電子郵件的內容?
  2. 如何防止電子郵件在處理後被丟棄?有沒有辦法像往常一樣將一份副本傳遞到收件箱,另一份傳遞給腳本進行處理?

這可以通過使用 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,然後您的所有電子郵件都應複製到您的腳本中,並發送到原始收件人地址。

引用自:https://serverfault.com/questions/536648