是否可以根据主题行阅读电子邮件,然后获取base64附件或直接获取附件? 服务器:Linux系统
答案 0 :(得分:0)
您的问题似乎预先假定只有一个附件,并且可以可靠地提取。在一般情况下,电子邮件消息可以具有基本上无限量的附件,并且编码可以是几个中的一个。
但是,如果我们假设您正在处理一个始终使用静态消息模板的发送者,其中第一个base64附件始终是您想要的那个,例如
case $(formail -zcxSubject: <"$message") in
"Hello, here is your report for "*)
awk 'BEGIN { h=1 }
h { if ($0 ~ /^$/) h=0 ; next } # skip headers
/^Content-Disposition: attachment/ { a=1 } # find att
a && /^$/ { p=1; next }
p && /^$/ { exit }
p' "$message" |
base64 -d ;;
esac
这将提取Subject:
标头并将其与glob模式进行比较。我希望这是你所说的基于主题&#34; - 如果我们找到匹配的主题标题,请检查此消息,否则丢弃。
原始的Awk脚本尝试隔离base64数据并将其传递给base64 -d
进行提取。这包含了许多关于消息格式的讨厌和粗略的假设,并且可能需要进行大量的额外调整。简而言之,我们跳过标题,然后查找标识附件的MIME标题,并打印出来,跳过消息中的其他内容。如果缺少此标头,或者标识错误的MIME部分,则不会得到任何结果,或者(更糟)不正确的结果。此外,/^Content-Disposition:/
正则表达式理论上可以在不是MIME标题的行上匹配,但这似乎不太可能(但如果您正在查看例如反弹消息,则可能会发生这种情况)。
更强大的方法是使用MIME提取工具或自定义脚本来实际解析MIME结构并提取所需的部分。如果没有关于您究竟需要什么的详细信息,我无法提供。 (这也允许您使用发送者指定的文件名;上面的脚本只是将解码的有效负载打印到标准输出。)
另请注意formail
不了解RFC2047编码,因此如果主题不是纯ASCII,则必须在脚本中指定编码形式。