如何从脚本中的“mail”中获取最旧的未读消息?

如何从脚本中的“mail”中获取最旧的未读消息?

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

提取最旧的消息后,我还需要将其转发给不同的用户以进行存档。

我怎样才能提取只是bash 或 Python 中的信息?

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

答案1

在传统系统中,根据定义,mbox第一条消息是未读的并且是最旧的可用消息。/var/mail/you

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 [email protected] <"$tmp"

在 Maildir 中,情况稍微复杂一些。新消息暂时存储在中tmp,然后移动到cur。文件名表示标志;用这么多的话来说,查找在末尾附近包含逗号且不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 实现还将具有某种索引,这可能使此任务比遍历文件系统中的整个邮箱更容易、更快,但同样,如果不更多地了解您正在使用哪种实现,这只是一个推测性说明在此刻。

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

您的引用mail暗示您可能正在使用传统的伯克利mbox系统,但有很多版本,其中一些版本有些深奥。

答案2

mail命令可以非交互方式用于打印收件箱中的电子邮件列表:

mail -H | head -1
>U     1  [email protected] Tue Apr 29 14 08:13 18/774    "Subject of mail"

答案3

至少有三种邮件传送格式。了解您正在使用哪一款会有所帮助。

formail将读取邮件文件,并可以通过跳过和总计选项输出特定消息的标题。这假设消息已传送到已知文件中。如果您想存档所有消息,这将是一个合适的工具。

procmail更适合在消息到达时对其进行归档。它可以轻松配置为在传送时将副本发送到另一个地址。有一些标准方法可以避免邮件锁定并跳过某些类型的消息。

相关内容