Procmail 多部分消息/内容类型

Procmail 多部分消息/内容类型

我有一个 procmailrc 文件,它从邮件头收集一些变量,然后将这些变量回显到邮件正文中。如下所示:

:0bfw 
| echo Subject_ "${SUBJECT_}" ; echo From_ "${FROM_}" ; echo To_ "${TO_}" ; echo CC_ "${CC_}" ; echo "" ; cat

总的来说,这没问题。它正确地回显了我想要它回显的内容。但它将这些变量回显到消息的单独部分,如下所示:

Content-Type: multipart/alternative; boundary=001a11c1367a19ff420508126c21


Subject_  Subject variable is here
From_  variable@whatever
To_  variable@whatever
CC_ 

--001a11c1367a19ff420508126c21
Content-Type: text/plain; charset=UTF-8

The rest of the message body is here, in a separate message part.

我怎样才能让 procmail 将这些变量回显到与电子邮件正文其余部分相同的消息部分中?

答案1

这有点棘手,因为并非所有消息都是 MIME 消息,也并非所有 MIME 消息都是多部分消息。因此,下面的方法可能有点过于简单,但在我的有限测试中是可行的。

:0fbw
* ^MIME-version:
* ^Content-type:[   ]*multipart/[^-a-z0-9_]*;[  ]*boundary="?\/[^   "]*
| awk "!q&&/^--$MATCH/{h=1}h&&/^$/{h=0;p=1}\
    !q&&p&&!/^$/{print \"Subject_ $SUBJECT_\"; print \"From_ $FROM\";\
        print \"To_ $TO\"; print \"CC_ $CC\"; print \"\"; p=0; q=1 }1"
:0Efbw
| echo blah blah  # Your original attempt here

Awk 脚本先找到第一个 MIME 边界,然后找到之后的第一个空行,然后插入代码片段,并设置几个状态变量以防止进一步处理。不幸的是,该脚本有点脆弱;如果提取的值之一包含不成对的双引号,它会失败,并且会错误地处理成对的双引号。

此外,只有当多部分中的第一个正文部分是文本部分时,此方法才能正常工作;如果您有嵌套的多部分(例如,包含 multipart/alternative 结构的顶级消息 multipart/related),它将与您当前的情况类似地失败。它可以扩展以涵盖更多情况 - 一个简单的调整是跳到第一个Content-Type: text/plain- 但在某些时候,在适当的 MIME 感知工具(例如,一个简单的 Python 脚本)中执行 MIME 操作会更有意义。

相关内容