我有一个 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 操作会更有意义。