AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 780130
Accepted
Kusalananda
Kusalananda
Asked: 2024-07-14 23:53:27 +0800 CST2024-07-14 23:53:27 +0800 CST 2024-07-14 23:53:27 +0800 CST

在 Zsh shell 中 ~/Mail 下的任何 Maildir 收件箱中收到新邮件通知

  • 772

我有一个 cron 任务,每 20 分钟从多个邮件服务器获取新邮件。邮件会自动分类到 下的 Maildir 邮箱中~/Mail。

如果在过去 20 分钟内有新消息到达任何本地邮箱,我希望在 shell 中收到通知。

我正在使用zshshell。

zsh
  • 2 2 个回答
  • 58 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2024-07-14T23:53:27+08:002024-07-14T23:53:27+08:00

    new由于使用了 Maildir 邮箱,因此可以通过在下的任何名为 的目录中查找任何常规文件来找到新邮件~/Mail。我们忽略了这样一个事实:对于一个合法的Maildir 邮箱目录,它应该包含三个子目录cur、new和tmp;我们天真地假设任何名为 的目录new都是有效 Maildir 邮箱的一部分。

    如果以下命令返回任何结果,我们将至少收到一条新消息:

    find ~/Mail -path '*/new/*' -type f -print
    

    ...或者,如果我们想避免查看cur目录(存储已读邮件的位置),

    find ~/Mail -name cur -type d -prune -o -path '*/new/*' -type f -print
    

    ...或者,我们可以查看某些 shell 通配符模式的扩展zsh,例如(扩展到任何目录~/Mail/**/new/*(.[1])下第一个常规文件的路径名)。如果扩展无法匹配任何内容,则没有新邮件。new~/Mail

    我们可以创建一个 shell 函数,使用上面的代码在有新邮件时打印友好通知:

    check_mail () {
        if find ~/Mail -path '*/new/*' -type f -print | grep -q .
        then
            echo 'You have new mail' >&2
        fi
    }
    

    如果有任何输出,则该grep -q .命令为语句生成一个真实条件。iffind

    将我们的函数与periodic“钩子”关联起来,zshshell 可以在打印下一个主提示符之前定期调用该函数。我们利用此功能,如果$PERIOD自上次调用以来已过去了超过秒数,则自动调用该函数(该PERIOD变量特定于periodic下面使用的钩子)。

    autoload -Uz add-zsh-hook
    add-zsh-hook periodic check_mail
    
    PERIOD=1200    # 20 minutes
    

    new现在,每当在 下的某个目录中创建新文件时~/Mail,文本You have new mail将在 20 分钟内的某个时间点显示,假设 shell 已重绘提示符。如果未阅读邮件,则在 shell 重绘提示符之前,该消息将在 20 分钟后再次显示。

    参见:

    • zshmisc(1)有关钩子函数的手册。
    • zshcontrib(1)关于操作钩子函数(命令)的手册add-zsh-hook。
    • 2
  2. user92403
    2024-08-13T08:22:45+08:002024-08-13T08:22:45+08:00

    创建自定义钩子函数并不是唯一可行的方法。另一种方法是使用 shell 的内置功能进行邮件通知。查看zsh 的手册页,邮件通知由以下环境变量控制(类似于其他 shell,例如 bash、ksh):

    邮件

    如果设置了此参数并且未设置 MAILPATH,则 shell 会在指定的文件中查找邮件。

    邮件支票

    检查新邮件的间隔(秒数)。

    邮件路径

    用于检查新邮件的文件名数组(冒号分隔列表)。每个文件名后面可以跟一个“?”和一条将要打印的消息。该消息将进行参数扩展、命令替换和算术扩展,变量 $_ 定义为已更改文件的名称。默认消息为“您有新邮件”。如果元素是目录而不是文件,则 shell 将递归检查元素的每个子目录中的每个文件。

    但是,由于 MAIL 和 MAILPATH 都面向mbox文件,因此这种替代方法需要执行脚本来维护最新摘要,以了解是否存在未见消息~/Mail(例如在文件中)~/.maildir_unseen,其方式类似于 mbox 文件。然后可以通过设置相关环境变量来启用通知,例如

    export MAILCHECK=60
    export MAILPATH="$HOME/.maildir_unseen?you have mail in ~/Mail"
    

    对于维护~/.maildir_unseen,选项包括:

    • 轮询内部文件的数量~/Mail/new,例如通过 cronjob
    • 后台进程使用通知机制来~/Mail/new确定何时更新~/.maildir_unseen。这可以使用inotify-tools或fwa来实现。例如使用 fwa:
    #!/bin/sh
    
    monitor_source=~/Mail/new
    monitor_target=~/.maildir_unseen
    
    update_monitor_target() {
        count=$(find "$monitor_source" -mindepth 1 -maxdepth 1 | wc -l | tr -d ' ')
        if [ "$count" != "0" ]
        then
            echo "$count" > "$monitor_target"
        else
            print -n "" > "$monitor_target"
        fi
    }
    
    update_monitor_target
    
    /usr/local/bin/fwa "$monitor_source" | while read -r; do
        update_monitor_target
    done
    
    • 1

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve