从Linux命令行读取邮件附件

问题描述:

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

+2

查看'formail'程序。这个问题可能更适合StackExchange站点[**超级用户**](http://superuser.com/)或[** ServerFault **](http://serverfault.com/) –

+0

是否有可能只使用命令行而不使用其他实用程序? –

+1

不是我所知道的基于消息和附件的编码方式,并且包含在同一个文件的不同部分。 (虽然有几种格式)。你需要一些可以提取和保存附件的内容,以便阅读它们。 (除非您阅读7位ASCII码)您可以将一行实用程序串在一起,以单行方式执行,但最好只使用写入的实用程序来完成。 –

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

但是,如果我们假设你是在处理与一贯使用静态消息模板,其中第一的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模式进行比较。我希望这是“基于主题”的意思 - 如果我们找到匹配的主题标题,请检查此消息,否则请丢弃。

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

更健壮的方法将涉及MIME提取工具或可能是一个自定义脚本来实际解析MIME结构并提取您想要的部分。没有关于你需要什么的细节,我无法提供。 (这也可以让你使用发件人的指定文件名;上面的脚本只是将解码后的有效负载打印到标准输出中。)

请注意,formail对RFC2047编码没有任何意见,所以如果主题不是纯ASCII,您必须在脚本中指定编码形式。

+0

嗨,粗awk脚本试图隔离base64数据并将其传递给base64 -d进行提取。 - 它将如何完成。我能够提取发件人,主题和附件名称。我有兴趣提取base64数据。 –

+0

我不明白你的问题。你需要关于Awk脚本的更多细节,或者你想要一个具有更多或不同功能的脚本? – tripleee

+0

我想了解如何读取/ var/spool/mail/user文件,然后根据不同的主题提取附件的详细信息。 –

Gmail提供了IMAP服务,通过该服务,您可以使用任何支持该协议的客户端来获取您的电子邮件。该客户端如何使它们在磁盘上可用可能会有所不同。

到目前为止,最广泛使用的命令行IMAP客户端必须是fetchmail。您可以在Ubuntu中轻松安装它,然后使用谷歌的特定配置与gmail一起使用。

fetchmail的一件事是,它从远程服务器啜泣电子邮件,然后通过本地MTA管道它们。所以你需要有一个本地配置的MTA来使这个设置工作。 MTA大概会将邮件追加到/ var/mail/$ USER,然后你可以读取这个文件来处理。

另一个可以工作的工具是offlineimap。我没有用过;设置可能比使用fetchmail更容易。

至于你需要保存电子邮件中包含的附件​​,你需要的是安装mpack。然后,在每个电子邮件的.txt文件上运行munpack命令(是的,其中包含附件中的所有乱码)。它将解码并将附件保存在单个文件中:

$ munpack mail.txt 
Invoice.PDF (application/pdf) 
my-picture.png (image/png)