在我现在试图完成编写的脚本中,我需要从当前用户的邮箱中获取最旧的未读消息(具体来说,我需要该项目的主题行)。
提取最旧的消息后,我还需要将其转发给不同的用户以进行存档。
我怎样才能提取只是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
更适合在消息到达时对其进行归档。它可以轻松配置为在传送时将副本发送到另一个地址。有一些标准方法可以避免邮件锁定并跳过某些类型的消息。