如何将一些文本放入procmail转发的电子邮件中?

时间:2018-05-09 07:58:54

标签: email forward procmail

几天来,我一直在尝试编写procmail脚本。

我想转发消息,并将一些文本注入消息内容。

我想要完成的事情:

  • 有人给我发电子邮件,上面写着"天气"在主题中
  • 电子邮件转发至地址" mymail@somedomain.com"
  • 每个转发的电子邮件都会在内容中添加一些文字

但到目前为止,没有成功。

.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
*********************************************************

应放置注入文本,内容为。现在它高于......

1 个答案:

答案 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库更新后)稍微麻烦和笨拙。