几天来,我一直在尝试编写procmail脚本。
我想转发消息,并将一些文本注入消息内容。
我想要完成的事情:
但到目前为止,没有成功。
在.procmail.log
中,有一条消息" procmail:缺少操作"
SHELL=/bin/bash
VERBOSE=off
LOGFILE=/home/test/.procmail.log
LOGDATE_=`/bin/date +%Y-%m-%d`
:0
* ^Subject:.*weather
:0 bfw
| echo "This is injected text" ; echo "" ; cat
:0 c
! mymail@somedomain.com
当我查看电子邮件来源时,我看到文本被注入。 但这个地方错了......
看看:
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="------------148F3F0AD3D65DD3F3498ACA"
Content-Language: pl
Status:
X-EsetId: 37303A29AA1D9F60667466
This is injected text
This is a multi-part message in MIME format.
--------------148F3F0AD3D65DD3F3498ACA
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
CONTENT CONTENT CONTENT
*********************************************************
应放置注入文本,内容为。现在它高于......
答案 0 :(得分:0)
您没有解释您的代码,但看起来您尝试在单一条件下使用多个操作。 Use braces for that.
:0
* ^Subject:.*weather
{
:0 bfw
| echo "This is injected text" ; echo "" ; cat
:0 c
! mymail@somedomain.com
}
总而言之,每个食谱必须有一个标题行(:0
和可能的标志)和一个动作。条件是可选的,可以有多个。进一步配方块是一种操作形式,以满足这些要求(其他操作类型保存到文件夹,管道输入命令或转发到电子邮件地址)。
要在多部分邮件的第一个MIME正文部分的顶部插入文本,您需要进行一些MIME解析。遗憾的是,Procmail没有对MIME的明确支持,但是如果你知道传入的消息将始终具有特定的结构,那么你可能会得到一些相当简单的东西。
:0
* ^Subject:.*weather
{
:0fbw
* ^Mime-version: 1\.0
* ^Content-type: multipart/
| awk '/^Content-type: text/plain;/&&!s {n=s=1} \
n&&/^$/{n=0; p=1} \
1; \
p{ print "This is injected text.\n"; p=0 }'
:0 c
! mymail@somedomain.com
}
主体(包含所有MIME主体部分及其标题和所有内容)被传递给一个简单的Awk脚本,该脚本在(我们乐观地认为是)第一个text/plain
MIME之后找到第一个空行正文部分标题,并在那里注入文本。 (awk区分大小写,因此正则表达式文本可能需要进行调整或推广,我假设输入消息中的空格是完全正规的。对于生产系统,这些简化的假设是不现实的。)
如果您需要完整的MIME支持(例如,输入消息可能是多部分,也可能不是多部分,或包含嵌套的多部分),我的建议是使用适当的MIME支持库以一些现代脚本语言编写注入代码; Python将是我的选择,尽管它仍然(即使在3.6中的email
库更新后)稍微麻烦和笨拙。