如何查看本地主机上是否有未读邮件

如何查看本地主机上是否有未读邮件

我如何确定我的 OSX 机器上是否有未读邮件?

使用 fetchmail 从各种地方获取邮件,并将其发送到 /var/mail/user 中的本地用户。我正在寻找一种方法来查明是否有未读邮件,或者我是否已阅读邮件(使用 alpine)。我更喜欢使用 unix 工具的解决方案,但对于未读计数部分,我愿意使用 AppleScript 或任何其他解决方案,但它必须与 unix 邮件阅读器(/var/mail/user)兼容。

我想要一个命令行工具,它可以显示收件箱中是否有未读邮件,这样我就可以用 cron 作业运行它,并使用键盘指示灯工具来设置细微通知。我更喜欢这个麦克比夫发出咆哮通知, ETC。

想法我想到了一个可能的解决方案:

mail -H | grep -c '^.[NU]'

似乎有时会返回未读消息的数量。但如果我在 alpine 中读了一条消息,它不会更新,直到我退出 alpine。

另一种方法可能是直接使用我的邮件客户端 (alpine)。我有一个干净的 .pinerc,没有颜色等,试图使显示尽可能简单,然后运行以下命令:

alpine -o -x .pinerc.clean -I i,q >& foo

运行 alpine,进入收件箱,然后退出(将收件箱保留为只读模式,以免干扰正在查看收件箱的主要 alpine 进程)。收件箱的屏幕转储存储在文件“foo”中。

但是,foo 是最后一个屏幕(退出消息,而不是收件箱),在这种情况下是一个二进制文件,我无法弄清楚如何解析表示未读邮件的列中的“N”,即使它在那里......

答案1

您已经完成了 90% 的命令 mail -H | grep -c '^.[NU]'。不过,我知道您需要这个来反映 Alpine 打开实例中所做的任何更改。不幸的是,这并不容易做到,但无论如何我都会为您说明。

您想要的并不是直接实现的,因为 Alpine 对消息状态所做的更改是在内存中完成的,并且仅定期(在“检查点”)写入磁盘。邮件命令(以及所有变体)只能从磁盘读取邮件信息,无法知道检查点之间在 Alpine 中所做的更改。因此,您真正能做的就是增加检查点的频率。

确定何时检查点的代码是非常复杂但据我所知,默认设置是:

  • 保存频率不会超过 180 秒 (min_interval)

  • 当 Alpine 闲置超过 30 秒时,它将检查 12 个更改(检查点频率)对文件进行了更改,或者至少进行了一次更改,并且五分钟内没有进行检查点(检查点间隔)。

  • 当 Alpine 执行某些命令时,它将检查邮件文件是否有 36 个未完成的更改,或者至少有一个更改,并且十分钟内没有检查点。

  • 撰写消息时,仅当进行了至少 48 处更改或在过去 20 分钟内进行了至少一次更改且没有检查点时,Alpine 才会进行检查点。

您真正想要的是让 Alpine 更频繁地写回磁盘。不幸的是,checkpoint_interval 和 checkpoint_frequency 变量只能在编译时更改。为此,您需要重新编译 Alpine,但需要一些配置选项,即:

--with-checkpoint-interval (default 420)
--with-checkpoint-frequency (default 12, you might want to change to 1) 

当然,如果您不辞辛劳重新编译 alpine,您可能只想在每次更改后更改要写入的检查点代码,但请注意,无论您做什么,如果您增加检查点频率,都可能会导致性能下降。

还有一点需要注意——您可以通过打开选项来查看当前检查点发生的时间。保存到磁盘时会出现[X] Enable Mail Check Cue两个星号。**

答案2

尝试以下脚本:

checkmail

if [[ "$?" == "0" ]]
    then echo "You've got mail!"
    else echo "No new mail"
fi

替换 echo 命令以满足您的目的。

答案3

请参阅此文章:用于在 Mail.app 应用程序中仅显示未读/标记消息的脚本

遗憾的是,Mail 无法显示未读/标记的邮件……或者可以吗?如果我错了,请纠正我。无论如何,这里有两个脚本可以过滤您的邮箱。将这些脚本保存在用户 -> 您的用户名 -> 库 -> 脚本 -> 邮件脚本 -> anySubFolder 中。它们将出现在 Mail 菜单栏上的脚本图标下。如果您不知道,您还可以为脚本添加快捷键;我懒得告诉您怎么做,但您可以打开邮件帮助并在浏览邮件帮助 -> 自定义邮件 -> 使用脚本菜单下找到说明。

本文包含两个脚本:Show unread onlyShow flagged only,由于我不是 Mac 用户,因此无法评估。但是,如果它们有效,则可以轻松适应您的需求。

这是Show unread only

try
  tell application "Mail"
    set theViewer to front message viewer
    set theMsg to messages of theViewer
    set msgList to {}
    repeat with thisMsg in theMsg
      if read status of thisMsg is false then
        set the end of msgList to thisMsg
      end if
    end repeat
    if msgList is {} then
      display dialog "There's no unread message in this mailbox."
    else
      tell theViewer to set properties to {visible messages:msgList}
    end if
  end tell
  on error the errMsg number the errNmb
  if the errNmb is not -128 then
    set the errTxt to "Error: " & the errNmb & ". " & the errMsg
    display dialog the errTxt buttons {"Cancel"} default button 1
  else
    error number -128
  end if
end try

答案4

你可以运行

mail <<< q | head -n2 | tail -n1 | cut -f4 -d " "

如果没有未读邮件,它将显示空字符串。

否则它将打印未读邮件的数量。

相关内容