實際上很簡單:我想將所有傳入的電子郵件傳遞給 PHP 腳本,但僅作為副本,原始電子郵件仍應像往常一樣發送到郵箱。
我似乎無法讓它發揮作用。我嘗試過以下方法
(1)創建了一個包羅萬象的別名(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.conf 中:編輯完成後執行“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,然後您的所有電子郵件都會複製到您的腳本中並傳送到原始收件者地址。