【问题标题】:How to put some text into procmail forwarded e-mail?如何将一些文本放入 procmail 转发电子邮件?
【发布时间】:2018-05-09 07:58:53
【问题描述】:

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

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

我想要完成的事情:

  • 有人给我发电子邮件,主题中包含“天气”一词
  • 电子邮件被转发到地址“mymail@somedomain.com”
  • 每封转发的电子邮件都会在内容中添加一些文本

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

.procmail.log,有一条消息“procmail: Missing action”

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

应将注入的文本放置在内容所在的位置。现在它在上面...

【问题讨论】:

  • 就像错误消息一样,您没有对具有条件^Subject:.*weather 的配方执行操作。不幸的是,不起作用的代码是一种糟糕的方式来解释您确实想要什么,但也许您正在寻找大括号? iki.fi/era/procmail/mini-faq.html#recipe-block

标签: email forward procmail


【解决方案1】:

您没有解释您的代码,但看起来您正试图在一个条件下使用多个操作。 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 库更新之后)有点麻烦和笨拙。

【讨论】:

  • 顺便说一句,为了提高效率,您可能希望在管道操作中使用单个 sed 脚​​本而不是多个 shell 命令。 sed 实现之间在第 1 行插入内容的精确语法略有不同,但类似于 1i (text to insert)。不过,在 sed 脚本中嵌入文字换行符是 Procmail 下的一项重大挑战。 (搜索我在答案中链接的页面“Getting a newline into the action”)
  • 如果您只想在转发的消息中进行更改,请尝试将 c 标志移动到大括号外的条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多