Как узнать, есть ли непрочитанные письма на локальном хосте

Вопрос или проблема

Как я могу определить, есть ли непрочитанные письма на моем компьютере с OSX?

Почта извлекается из различных источников с помощью fetchmail и доставляется моему локальному пользователю в /var/mail/user. Я ищу способ узнать, есть ли непрочитанная почта, или если я прочитал письма (используя alpine). Я предпочитаю решение, которое использует инструменты unix, но открыт для AppleScript или любого другого решения для подсчета непрочитанных писем, при этом оно должно работать с почтовыми читателями Unix (/var/mail/user).

Я хотел бы иметь инструмент командной строки, который сообщал бы, есть ли непрочитанные письма в папке «Входящие», чтобы я мог запускать его с помощью cron job и использовать keyboard_leds для установки ненавязчивых уведомлений. Я предпочитаю это MacBiff, growlnotify и т. д.

Я думал, что нашел одно возможное решение:

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

Кажется, что иногда это возвращает количество непрочитанных сообщений. Но если я прочитаю сообщение в alpine, оно не обновляется, пока я не выйду из alpine.

Другой подход может заключаться в том, чтобы использовать мой почтовый клиент (alpine) напрямую. У меня есть чистый .pinerc, который не имеет цветов и т. д., чтобы сделать отображение как можно более простым, а затем выполнить эту команду:

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

Которая запускает alpine, переходит в «Входящие», а затем выходит (оставляя «Входящие» в режиме только для чтения, чтобы не нарушить основной процесс alpine, который просматривает «Входящие»). Содержимое экрана «Входящие» сохраняется в файле “foo”.

Однако foo – это последний экран (сообщение о завершении, а не «Входящие») и является бинарным файлом в этом случае, и я не могу понять, как его разобрать, чтобы найти “N” в столбце, который указывает на непрочитанные письма, даже если бы оно там было…

Вы на 90% на правильном пути с командой
mail -H | grep -c '^.[NU]'. Я понимаю, что вам нужно, чтобы это отражало любые изменения, внесенные в открытый экземпляр Alpine. К сожалению, это не так просто сделать, но я все равно изложу это для вас.

Что вам нужно, не возможно сделать напрямую, потому что изменения в статусе сообщений, внесенные Alpine, происходят в памяти и записываются на диск периодически (на “контрольных точках”). Команда mail (и все ее варианты) может только читать информацию о почте с диска и не может знать о внесенных изменениях в Alpine между контрольными точками. Так что все, что вы действительно можете сделать, это увеличить частоту контрольных точек.

Код для определения времени контрольной точки очень сложен, но, судя по всему, настройки по умолчанию:

  • Не будут сохранять чаще, чем каждые 180 секунд (min_interval)

  • Когда Alpine была неактивна более 30 секунд, она установит контрольную точку, если в файл было внесено 12 изменений (частота контрольных точек) или было внесено хотя бы одно изменение, а контрольная точка не проводилась в течение пяти минут (интервал контрольной точки).

  • Когда Alpine выполняет какую-либо команду, она установит контрольную точку, если есть 36 неиспользованных изменений в файле почты или хотя бы одно изменение и не было контрольной точки в течение десяти минут.

  • При составлении сообщения Alpine установит контрольную точку только в том случае, если было внесено хотя бы 48 изменений или хотя бы одно изменение было внесено за последние двадцать минут без контрольной точки.

Что вам действительно нужно, так это чтобы Alpine записывал на диск чаще. К сожалению, переменные checkpoint_interval и checkpoint_frequency могут быть изменены только во время компиляции. Чтобы это сделать, вам нужно перекомпилировать Alpine, но с некоторыми опциями конфигурации, а именно:

--with-checkpoint-interval (по умолчанию 420)
--with-checkpoint-frequency (по умолчанию 12, вам, возможно, стоит изменить на 1) 

Конечно, если вы собираетесь потратить время на перекомпиляцию alpine, вам, возможно, стоит изменить код контрольной точки, чтобы записывать после каждого изменения, но имейте в виду, что что бы вы ни сделали, это, вероятно, приведет к снижению производительности, если вы увеличите частоту контрольных точек.

Еще одна вещь, которую стоит отметить – вы можете увидеть, когда контрольные точки происходят в данный момент, включив опцию [X] Включить очередь проверки почты. Две звездочки ** появятся, когда происходит запись на диск.

Попробуйте следующий скрипт:

checkmail

if [[ "$?" == "0" ]]
    then echo "У вас есть почта!"
    else echo "Новых писем нет"
fi

Замените команды echo в соответствии с вашим назначением.

Смотрите эту статью: Скрипт для отображения только непрочитанных/отмеченных сообщений в Mail.app:

Жаль, что Mail не может отображать
только непрочитанные/отмеченные сообщения… или может?
Исправьте меня, если я ошибаюсь. В любом случае,
вот два скрипта для фильтрации вашей
почты. Сохраните эти скрипты внутри
Users -> ваше_имя_пользователя -> Library ->
Scripts -> Mail Scripts ->
любойПодпапке. Они появятся под
значком скрипта на панели меню Mail. Если
вы не знаете, вы также можете добавить
горячие клавиши к скриптам; мне лень
рассказывать, как, но вы можете открыть
Помощь по почте и найти инструкцию
в разделе Обзор Помощи по почте -> Настройка
почты -> Использование меню скриптов.

Статья содержит два скрипта: Показать только непрочитанные и Показать только отмеченные, которые я не могу оценить, так как не являюсь пользователем Mac. Однако, если они работают, их можно легко адаптировать под ваши нужды.

Вот Показать только непрочитанные :

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 "В этом почтовом ящике нет непрочитанных сообщений."
    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 "Ошибка: " & the errNmb & ". " & the errMsg
    display dialog the errTxt buttons {"Отмена"} default button 1
  else
    error number -128
  end if
end try

Посмотрите, помогает ли эта статья: Командная почта в OS X: re-alpine и Geektool

Искали удаленные инструменты мониторинга
в офисе на этой неделе, я наткнулся
на GeekTool. GeekTool похож на
SilverService для уведомлений. Все,
что он делает – это отображает что-то на
рабочем столе. В офисе я быстро
начал использовать его для мониторинга журнальных файлов
и удаленных графиков. Но опция
вывода оболочки идеально подходит для
отображения входящей почты.

/usr/bin/mail -H

Это просто программа командной строки для почты
с опцией отображения индекса ожидающих писем и немедленного
выхода. Если есть ожидающие сообщения,
она отобразит дату и тему сообщения,
а если нет – она ничего не отобразит.

Так что это оставит рабочий стол в покое,
если только не будет ожидающей почты,
которую нужно прочитать из одного из моих cron job.

GeekTool довольно классный, и вы можете
загрузить кучу готовых
“гиков” для него (я ни разу не пользовался
ни одним из них). Вы можете разместить их на
рабочем столе и расположить так, как вам удобно.

Вы можете выполнить

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

Если нет непрочитанных писем, он покажет пустую строку.

В противном случае он выведет число непрочитанных писем.

Другие комментарии могут быть верными, но есть одна небольшая уловка в вашем регулярном выражении: Вместо

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

должно быть

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

потому что если есть ровно одно сообщение, оно будет отображено как

>N 1 root Tue Nov 26 17:24 12/483

Ответ или решение

Для определения наличия непрочитанных писем на вашем локальном компьютере с операционной системой OSX, следует рассмотреть несколько подходов с использованием командной строки и стандартных утилит Unix. Учитывая, что почта поступает через fetchmail и хранится в директории /var/mail/user, а также что вы предпочитаете решения, совместимые с почтовыми клиентами на Unix, в частности с Alpine, я предложу несколько вариантов.

1. Использование команды mail

Вы уже упомянули команду:

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

Эта команда является хорошим началом для подсчета непрочитанных писем. Однако в вашем случае есть nuance: изменения статуса сообщений в Alpine сохраняются на диск не сразу, а лишь по истечении определенного времени. Это связано с механизмом контрольных точек в Alpine, который можно изменить лишь при помощи перекомпиляции программы.

Для проверки непрочитанных сообщений в вашем почтовом ящике, вы можете попробовать следующую команду, которая учитывает возможность существования одного сообщения:

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

Данная команда будет корректно обрабатывать случаи с одним непрочитанным сообщением.

2. Использование Alpine с временным файлом

Если вам необходимо получение более актуальной информации о прочитанных и непрочитанных письмах, вы можете воспользоваться запуском Alpine в режиме "только для чтения", сохранив вывод его работы:

alpine -o -x .pinerc.clean -I i,q > output.txt

К сожалению, как вы заметили, вывод может быть в бинарном формате, и его парсинг может оказаться сложным. Для этого вам нужно будет смотреть на последний экранный вывод перед выходом из Alpine.

3. Создание простого скрипта

Также вы можете создать простой bash-скрипт, который будет выводить уведомления в зависимости от количества непрочитанных писем. Например:

#!/bin/bash

# Проверка количества непрочитанных сообщений
unread_count=$(mail -H | grep -c '^[ >][NU]')

if [ "$unread_count" -gt 0 ]; then
    echo "У вас $unread_count непрочитанных сообщений."
else
    echo "Нет непрочитанных сообщений."
fi

4. Использование cron для автоматизации

Чтобы этот скрипт выполнялся автоматически через заданный интервал времени, добавьте его в crontab:

*/5 * * * * /path/to/your/checkmail_script.sh

Эта строка будет запускать ваш скрипт каждые 5 минут. Не забудьте предоставить необходимые права на выполнение скрипта с помощью команды chmod +x /path/to/your/checkmail_script.sh.

Заключение

Таким образом, описанные методы позволят вам эффективно отслеживать количество непрочитанных писем в вашем почтовом ящике на OSX. Выбор метода зависит от того, насколько актуальную информацию вы хотите получать: сразу по выходу из почтового клиента или с некоторой задержкой. Учитывайте, что некоторые подходы могут потребовать доработки или последующей оптимизации в зависимости от ваших конкретных требований и рабочей среды.

Оцените материал
Добавить комментарий

Капча загружается...