我如何确定我的 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 only
和Show 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 " "
如果没有未读邮件,它将显示空字符串。
否则它将打印未读邮件的数量。