![Procmail - 用电子邮件中的文本替换“发件人”](https://linux22.com/image/803030/Procmail%20-%20%E7%94%A8%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%96%87%E6%9C%AC%E6%9B%BF%E6%8D%A2%E2%80%9C%E5%8F%91%E4%BB%B6%E4%BA%BA%E2%80%9D.png)
我正在尝试使用 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 的手册页。我从来没有用过它,但它看起来确实很强大。它只会在邮件的标题中发生变化,而不会在正文中发生变化。