我会定期收到包含文字部分和文字附件的生成的电子邮件。我想测试附件是否为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
答案 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标头;或者相信发件人总是按照其中的顺序生成它们示例消息)。