从Linux命令行读取邮件附件
您的问题似乎预设有一个附件,并且它可以可靠地提取。在一般情况下,电子邮件消息可以具有基本上无限量的附件,并且编码可以是几个中的一个。
但是,如果我们假设你是在处理与一贯使用静态消息模板,其中第一的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,您必须在脚本中指定编码形式。
嗨,粗awk脚本试图隔离base64数据并将其传递给base64 -d进行提取。 - 它将如何完成。我能够提取发件人,主题和附件名称。我有兴趣提取base64数据。 –
我不明白你的问题。你需要关于Awk脚本的更多细节,或者你想要一个具有更多或不同功能的脚本? – tripleee
我想了解如何读取/ 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)
查看'formail'程序。这个问题可能更适合StackExchange站点[**超级用户**](http://superuser.com/)或[** ServerFault **](http://serverfault.com/) –
是否有可能只使用命令行而不使用其他实用程序? –
不是我所知道的基于消息和附件的编码方式,并且包含在同一个文件的不同部分。 (虽然有几种格式)。你需要一些可以提取和保存附件的内容,以便阅读它们。 (除非您阅读7位ASCII码)您可以将一行实用程序串在一起,以单行方式执行,但最好只使用写入的实用程序来完成。 –