从" content-disposition:attachment"中提取文本。身体的一部分

时间:2015-08-30 01:17:28

标签: procmail

我会定期收到包含文字部分和文字附件的生成的电子邮件。我想测试附件是否为base64编码,然后将其解码为:

:0B
* ^(Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($))
{
 msgID=`printf '%s' "$MATCH" | base64 -d`
}

但是它总是说无效的输入,任何人都知道什么是错的?

procmail: Match on "^()\/[a-z]+[0-9]+[^\+]"
procmail: Assigning "msgID=PGh0b"
procmail: matched "^(Content-Disposition: *attachment.*(($)[a-z0-9].*)*    |Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($)"

procmail: Executing "printf '%s' "$MATCH" | base64 -d"
base64: invalid input
procmail: Assigning "msgID=<ht"
procmail: Unexpected EOL


procmail: Assigning "msgID=PGh0b"
procmail: Match on "^(Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($))"
procmail: Executing "printf '%s' "$MATCH" | base64 -d"
base64: invalid input
procmail: Assigning "msgID=<ht"
procmail: Unexpected EOL

1 个答案:

答案 0 :(得分:0)

如果您的要求很复杂,那么编写一个专门的脚本可能会更容易,该脚本会提取您想要的信息 - 具有适当MIME支持的现代脚本语言在涉及到各种不同的时候会更加通用现代MIME电子邮件中内容编码和正文部分结构的可能性。

以下内容查找第一次出现Content-Disposition: attachment的MIME标头,并提取以下正文的第一个标记。如果您与使用定义良好的静态模板的发件人对应,则此可能会执行您想要的操作。这里没有真正的MIME解析,因此(比方说)转发的消息恰好包含与模式匹配的嵌入部分也将触发条件。 (这可能是一个错误或一个功能。)

Procmail的一个有用但不经常使用的功能是能够编写跨越多行的正则表达式。在正则表达式中,($)始终与文字换行符匹配。因此,我们可以查找Content-Disposition: attachment标题,后跟其他标题(零或更多),后跟空行,然后是要提取的标记。

:0B
* ^Content-Disposition: *attachment.*(($)[A-Z].*)*($)($)\/[A-Z]+[0-9]+
{ msgid="$MATCH" }

为简单起见,我没有尝试处理多行MIME标头。如果你想支持它,修复应该是相当明显的,虽然不是很优雅。

在更一般的情况下,您可能希望添加一个条件来检查条件中的MIME标头组是否也包含Content-type: text/plain;你需要在Content-type:之前或之后设置Content-disposition:的两个备选方案(或者在获取此配方之前以某种方式规范化MIME标头;或者相信发件人总是按照其中的顺序生成它们示例消息)。

相关问题