Procmail - 用电子邮件中的文本替换“发件人”

Procmail - 用电子邮件中的文本替换“发件人”

我正在尝试使用 Procmail 过滤发送到 WHMCS 中的票务频道的邮件。就管道而言,它工作正常。但来自网站上的 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

现在,它工作正常,它正在查找字段From并将其替换为[email protected]。问题是我想以某种方式从电子邮件内部获取文本,其中显示:

From: Visitor xxxxxx <[email protected]>

并将其放在标题上方From,因此本质上它将来自访问者而不是 zopim。这就是我的问题所在,我无法弄清楚如何使用 sed 或其他程序将该行设置为变量并替换上面,或者只是使用 sed 来移动行。

答案1

假设这些电子邮件确实有规律,因此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
}

传统上,正则表达式应该涵盖空白中的制表符和空格,但我想如果您的输入是机器生成的,它将全部是空格(或全部是制表符,在这种情况下您需要进行必要的编辑)。

答案2

在 procmail 示例中,有一个工具可以做到这一点:它是formail。请参阅procmail 的手册页。我从来没有用过它,但它看起来确实很强大。它只会在邮件的标题中发生变化,而不会在正文中发生变化。

相关内容