我正在尝试使用Procmail来过滤通过WHMCS中我的票务信道的邮件。 就pipe道而言,它工作得很好。 但是,网站上的Zopim实时聊天模块的电子邮件在进入WHMCS脚本之前需要过滤和编辑。
他们进来的电子邮件是这样的:
To: [email protected] From: Zopim <[email protected]> Subject: Offline Message from Visitor xxxx: xxx From: Visitor xxxxxx <[email protected]> URL: http://www.domain.com xxxxxxx ---- Zopim http://www.zopim.com
这里是我的procmail rc文件设置:
:0H * ^From: Zopim.*[email protected] | sed -e 's/^From: Zopim.*/From: me@me\.com/' | /usr/bin/php -q /var/www/pipe/pipe.php
现在,工作正常,findFrom字段,并用[email protected]replace它。 问题是我想以某种方式从电子邮件里面的文字说:
From: Visitor xxxxxx <[email protected]>
把上面的标题放在“ From的标题中,实际上它将来自访问者而不是Zopim。 这是我的问题所在,我不知道如何使用sed或其他程序如何将该行设置为variables并将其replace为上面的内容,或者只是使用sed来移动行。
假设这些电子邮件是非常有规律的,所以第一个From:在主体中总是包含你想要提取的地址,尝试如下所示:
:0 # The H flag is the default, so not specifying it explicitly * ^From: Zopim.*<noreply@zopim\.com> { :0B # examine body only, capture From: * ^From: \/[^ ].*$ { VISITOR=$MATCH } :0 | formail -I "From: $VISITOR" \ | /usr/bin/php -q /var/www/pipe/pipe.php }
传统上,正则expression式应该覆盖制表符和空格中的空格,但是我想如果你的input是机器生成的,它将是所有的空格(或者所有的制表符,在这种情况下你需要进行必要的编辑)。
在procmail的例子中,有一个工具可以做到这一点:它是formail 。 请参阅procmail的手册页 。 我从来没有使用它,但它看起来非常强大。 它只会在邮件的标题中更改,而不会在邮件正文中更改。