【问题标题】:Read the mail attachment from Linux command line从 Linux 命令行读取邮件附件
【发布时间】:2016-09-19 05:39:37
【问题描述】:

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

【问题讨论】:

  • 看看formail 程序。这个问题在 StackExchange 站点 Super UserServerFault 上可能更合适
  • 是否可以只使用命令行而不使用其他实用程序?
  • 不是我所知道的基于消息和附件被 uuencoded 和包含为同一文件的单独部分的方式。 (虽然有几种格式)。您需要一些可以提取和 uudecode 附件的东西,以便您可以阅读它们。 (除非您阅读 7 位 ASCII)您可以将一行实用程序串在一起以单行执行,但最好只使用为此编写的实用程序。
  • @DavidC.Rankin 这显然要求 MIME 解码,而不是史前 uuencode,

标签: linux mailx


【解决方案1】:

您的问题似乎预设了只有一个附件并且可以可靠地提取它。在一般情况下,一封电子邮件可以有基本上无限数量的附件,并且编码可以是几个之一。

但是,如果我们假设您正在处理一个始终使用静态消息模板的单个发件人,其中第一个 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: 标头并将其与全局模式进行比较。我希望这就是您所说的“基于主题”的意思——如果我们找到匹配的主题标头,请检查此消息,否则丢弃。

粗略的 Awk 脚本尝试隔离 base64 数据并将其传递给base64 -d 进行提取。这包含一些关于消息格式的讨厌且有些粗略的假设,并且可能需要进行大量的额外调整。简而言之,我们跳过标头,然后查找标识附件的 MIME 标头,然后打印它,跳过消息中的所有其他内容。如果此标头丢失,或者标识了错误的 MIME 部分,您将得不到任何结果,或者(更糟)不正确的结果。此外,/^Content-Disposition:/ 正则表达式理论上可以匹配不是 MIME 标头的行,尽管这似乎不太可能(但如果您正在查看例如退回消息,则可能实际上发生)。

更强大的方法是使用 MIME 提取工具或自定义脚本来实际解析 MIME 结构并提取您想要的部分。如果没有关于您到底需要什么的详细信息,我无法提供。 (这也将允许您使用发件人指定的文件名;上述脚本只是将解码后的有效负载打印到标准输出。)

还要注意formail 不知道 RFC2047 编码,所以如果主题不是纯 ASCII,您必须在脚本中指定编码形式。

【讨论】:

  • 您好,粗略的 Awk 脚本尝试隔离 base64 数据并将其传递给 base64 -d 进行提取。 - 怎么做。我能够提取发件人、主题和附件名称。我有兴趣提取 base64 数据。
  • 我不明白你的问题。您是否需要有关 awk 脚本功能的更多详细信息,或者您想要一个具有更多或不同功能的脚本?
  • 我想了解如何阅读 /var/spool/mail/user 文件,然后根据不同的主题提取附件的详细信息。
  • 您仍然没有透露“基于不同主题”的实际含义。假脱机文件是一个mbox 文件,其中包含多条消息。您可以使用formail -s path/to/script &lt;"$MAIL" 在每个脚本上运行上述脚本
  • ... 上面的脚本期望message 指向消息的文件名,但formail 会将每条消息作为标准输入提供。也许重构上面的代码以将传入的消息保存到一个临时文件中,并在完成或中断时将其删除(提示:cascading traps),添加一个 shebang,保存,标记为可执行文件等。
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2015-11-27
  • 2020-10-16
  • 2018-08-05
  • 2015-09-03
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多