其他分享
首页 > 其他分享> > bash – 如何从脚本中的`mail`中获取最旧的未读消息?

bash – 如何从脚本中的`mail`中获取最旧的未读消息?

作者:互联网

在我试图完成写入的脚本中,我需要从当前用户的邮箱中获取最旧的未读消息(具体来说,我需要该项目的主题行).

在提取最旧的消息之后,我还需要将其转发给其他用户以进行存档.

如何在bash或Python中提取该信息?

使用将主题行提取到文件中然后转发消息,只需要脚本进行文件处理会更好吗?如果是这样,我怎么能这样做呢?

解决方法:

在传统的mbox系统中,/ var / mail /中的第一条消息 – 按照定义 – 是未读的,也是最早可用的消息.

formail -zxSubject: -1 -s </var/mail/you

要将消息提取到文件(以便您可以方便地转发该消息),然后提取Subject:标题,请尝试类似的方法

tmp=$(maketemp -t findoldestunread.XXXXXXXX) || exit 127
trap 'rm -f $tmp' EXIT   # remove temp file when done
trap 'exit 1' 1 2 3 5 15 # remove also in case of error / interruption
formail -1 -s </var/mail/you >"$tmp"
formail -zxSubject: <"$tmp"
sendmail -oi uncannyvictim@example.com <"$tmp"

在Maildir,情况有点复杂.新消息暂时存储在tmp中,然后移动到cur.文件名表示标志; in so many words,查找一个文件名,其中包含逗号附近的逗号,其中S不在逗号后面的字符中.

find path/to/Maildir/cur -maxdepth 1 -type f \
    -regex '.*,[^S,]*$' -printf '%C@ %p\n' |
sort | sed '1s/^[^ ]* //;q' | xargs formail -zxSubject:

printf格式说明符首先打印时间戳以便于排序.我们排序,抓住第一行,修剪时间戳,并将其提供给formail以提取Subject:标题. (如果你有一些带有换行符的时髦文件名,这显然会破坏;有很多方法,但我在这里很懒惰和实用.)

在这种情况下,重构只是打印文件名应该是微不足道的 – 只需将管道移除到xargs并将输出捕获到变量中.

一些Maildir实现还将具有某种索引,这可能使该任务比遍历文件系统中的整个邮箱更容易和更快,但同样,在不了解您正在使用哪种实现的情况下,这只是一个推测性的注释在此刻.

如果您的邮箱不是这两种格式中的任何一种,(您很奇怪),您需要更新您的问题并提供更多详细信息.

您对邮件的引用意味着您可能正在使用传统的Berkeley mbox系统,但有许多版本,其中一些版本有些深奥.

标签:python,bash,mail-command,procmail,procmail
来源: https://codeday.me/bug/20190812/1642282.html