从Linux命令行读取邮件附件

时间:2016-09-19 05:39:38

标签: linux mailx

是否可以根据主题行阅读电子邮件,然后获取base64附件或直接获取附件? 服务器:Linux系统

1 个答案:

答案 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,则必须在脚本中指定编码形式。