我有一个 cron 任务,每 20 分钟从多个邮件服务器获取新邮件。邮件会自动分类到 下的 Maildir 邮箱中~/Mail
。
如果在过去 20 分钟内有新消息到达任何本地邮箱,我希望在 shell 中收到通知。
我正在使用zsh
shell。
我有一个 cron 任务,每 20 分钟从多个邮件服务器获取新邮件。邮件会自动分类到 下的 Maildir 邮箱中~/Mail
。
如果在过去 20 分钟内有新消息到达任何本地邮箱,我希望在 shell 中收到通知。
我正在使用zsh
shell。
new
由于使用了 Maildir 邮箱,因此可以通过在下的任何名为 的目录中查找任何常规文件来找到新邮件~/Mail
。我们忽略了这样一个事实:对于一个合法的Maildir 邮箱目录,它应该包含三个子目录cur
、new
和tmp
;我们天真地假设任何名为 的目录new
都是有效 Maildir 邮箱的一部分。如果以下命令返回任何结果,我们将至少收到一条新消息:
...或者,如果我们想避免查看
cur
目录(存储已读邮件的位置),...或者,我们可以查看某些 shell 通配符模式的扩展
zsh
,例如(扩展到任何目录~/Mail/**/new/*(.[1])
下第一个常规文件的路径名)。如果扩展无法匹配任何内容,则没有新邮件。new
~/Mail
我们可以创建一个 shell 函数,使用上面的代码在有新邮件时打印友好通知:
如果有任何输出,则该
grep -q .
命令为语句生成一个真实条件。if
find
将我们的函数与
periodic
“钩子”关联起来,zsh
shell 可以在打印下一个主提示符之前定期调用该函数。我们利用此功能,如果$PERIOD
自上次调用以来已过去了超过秒数,则自动调用该函数(该PERIOD
变量特定于periodic
下面使用的钩子)。new
现在,每当在 下的某个目录中创建新文件时~/Mail
,文本You have new mail
将在 20 分钟内的某个时间点显示,假设 shell 已重绘提示符。如果未阅读邮件,则在 shell 重绘提示符之前,该消息将在 20 分钟后再次显示。参见:
zshmisc(1)
有关钩子函数的手册。zshcontrib(1)
关于操作钩子函数(命令)的手册add-zsh-hook
。创建自定义钩子函数并不是唯一可行的方法。另一种方法是使用 shell 的内置功能进行邮件通知。查看zsh 的手册页,邮件通知由以下环境变量控制(类似于其他 shell,例如 bash、ksh):
但是,由于 MAIL 和 MAILPATH 都面向mbox文件,因此这种替代方法需要执行脚本来维护最新摘要,以了解是否存在未见消息
~/Mail
(例如在文件中)~/.maildir_unseen
,其方式类似于 mbox 文件。然后可以通过设置相关环境变量来启用通知,例如对于维护
~/.maildir_unseen
,选项包括:~/Mail/new
,例如通过 cronjob~/Mail/new
确定何时更新~/.maildir_unseen
。这可以使用inotify-tools或fwa来实现。例如使用 fwa: