войти зарегистрироваться

*nix whois

индекс
0,00

GMail — проверка новых писем из командной строки

Не будем тянуть кота за хвост. Сразу к делу

curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | wc -l

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



Update: команду можно упростить до
curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | awk -F '<fullcount>|</fullcount>' '{for (i=2; i<=NF; i++) {print $i}}'
Спасибо за подсказку Wolverine

Update: и даже еще проще
curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | grep -c "<entry>"
намекает onix74

Использованые команды должны быть вполне знакомы искушенному пользователю linux. Для неискушенных краткое пояснение того, что делают части этой строки.
curl — тут получает страницу по заданному адресу. В данном случае это RSS feed
tr -d '\n' — удаляет переносы строк
awk — «выкусывает» нужные части (язык awk вообще спец в разного рода парсинге строк. Такая себе замена регулярок)
wc -l — подсчет количества строк

А если команду немного усложнить и распарсить вывод, то можно получить и больше информации: отправителя и тему письма.

curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | perl -pe 's/^<title>(.*)<\/title>.*<name>(.*)<\/name>.*$/$2 - $1/'


По материалам commandlinefu

комментарии (95)

  • раскрыть комментарий
    • Я рассказал что делают команды в данном случае, а не для чего они предназначены. Для чего они предназначены можно прочитать в man.
    • Описал чуть более подробно, чтобы не было подобных вопросов.
  • НЛО прилетело и опубликовало эту надпись здесь.
    • Все так, только у гугла POP TLS-ный, что накладывает некоторые дополнительные сложности.
  • раскрыть комментарий
    • Ага, он что, есть под Линукс?
      • раскрыть комментарий
        • Тогда какой толк упоминать его в блоге «Линукс для всех»?
        • Очень толсто :) Идите тренироваться на LOR
          • михо, на ЛОРе он не проживет и минуты — такая толщина туда даже не пролезет.
    • Надеюсь это было ибо это феерический каммент.
    • Вот этот?!..


      У Google тоже есть свой мессенджер :) Он более открытый: использует стандартный Джаббер протокол, а также позволяет общаться голосом.
      И почту тоже проверяет, да.

      Но у него менее… хм… попсовый :) интерфейс.
      • Не такой уж и «стандартный» протокол он использует. Например, Gtalk (сам сервер) меняет название jabber-ресурса клиента. Вообще при общение в связке jabber-сервер <-> Gtalk периодически возникают проблемы. Но в целом, да, это получше, чем велосипед от mail.ru.
        • Есть немного. Но по моему опыту проблемы были раньше. Последние пару лет проблем не наблюдаю ни в одном мессенджере, который я использовал.
        • НЛО прилетело и опубликовало эту надпись здесь.
          • > Протокол — XMPP
            Так если протокол один, не кажется ли Вам, что как бы проблем быть не должно? Кстати, Jabber — это не «IM» (что бы Вы под этим термином не понимали), а всего лишь старое название XMPP, а ещё точнее: проекта из которого XMPP вырос.

            > Мэйл-агент тоже на xmpp
            Да ну?
            agent.mail.ru/ru/developers/licence.html
        • > Например, Gtalk (сам сервер) меняет название jabber-ресурса клиента
          Что совершенно не запрещено протоколом.
    • В линуксе полно всяких графических напоминалок и мультипротокольных IM, тема-то о другом. Не стоит думать, что это единственный способ узнать о количестве сообщений в ящике в линуксе.
    • я не собираюсь терпеть, когда анкета на Моём Мире автоматически восстанавливается после удаления, и терпеть 1,5к. спама в неделю, хотя ящик нигде не светил. И весь спам во входящих.
  • Прикольно.
    Только вот не совсем пойму, вы разместили в Линукс для всех и по тексту применяете все к линуксу, а скриншот MacOS X. Это я к тому, что UNIX not LINUX.
    • Ну у нас нету блога UNIX для всех. А описанный материал будет наиболее интересен именно линуксоидам.
      • Ну почему? Мне интерестно и я на маке, А много людей на *BSD сидят, и им интерестнее с консолькой работать, чем большенству убунтовцев. Я не прав?
        • У вас есть конкретные предложения куда перенести пост, или вы просто потрепаться ради? :)
    • Набор утилит, которые тут использовались и там и там одинаков.
      • и про то же. Что эти команды подходят бля всех UNIX like систем, а не только для линукса. Моно было вообще написать Убунтариум — Проверка почты в Ubuntu. Но это же не правильно.
  • не, лучше в виде скриптика это оформить, нефиг пароль в истории оставлять.
    • золотые слова
    • Если есть доступ к профилю пользователя, то скриптик прочитать можно, а если доступа нет, то и история нелоступна будет. Хотя трудно представить, зачем это надо вне скриптов.
      • Ну, во первых, такого рода скриптики с паролями не желательно хранить в профиле (с правами пользователя)
        А во вторых, к компьютеру могут разные люди случайно подойти. Ну не дело это короче.
        • а если так?
          curl -u username --silent «https://mail.google.com/mail/feed/atom» | grep -c ""
          тогда пароль будет запрашиваться интерактивно, и не показываться. У меня по крайней мере так.
  • А количество не содержится в
    <fullcount>1</fullcount>
    ?
    • Охо! Ваша правда! Так гораздо проще. Обновил пост
  • Какой ужасный терминал :)
    • Покажи свой?
      • банальный, за которым можно пропводить много и много часов работы
  • Вот за такое я люблю *nix
  • Так как команда получается длинная, то лучше «завернуть» ее в скрипт, как рекомендует sovnarkom, или воспользоваться другим полезным советом от commandlinefu.com — использование reverse-i-search.
    • Конечно кому надо, завернет в скрипт. Это, вроде как, очевидно
  • О, добавлю скрипт в коньки.
  • curl -u username:password --silent «https://mail.google.com/mail/feed/atom» | grep -c ""
    Так не проще посчитать кол-во новых сообщений?
    • А вы сами ее пробовали? У меня постоянно результатом — 0
      • Прощу прощения из-за кавычек не то выдавало. Но все равно количество линий там больше чем количество писем.
    • Пардон, не углядел. Правильно так:
      curl -u username:password --silent «https://mail.google.com/mail/feed/atom» | grep -c "<empty>"

      Если новых писем нет, то и <empty> отсутствует
      • У меня есть новые письма, но empty отсутствует. Количество новых писем эта команда не вернет. Я что-то не пойму кто из нас где запутался :)
        • entry наверно. Не empty
          • Да, конечно.
        • До прочтения писем в ящике:
          <?xml version=«1.0» encoding=«UTF-8»?>
          <feed version=«0.3» xmlns=«purl.org/atom/ns#»>
          <title>Gmail — Inbox for xxxxxxxxxxxxxx@gmail.com</title>
          <tagline>New messages in your Gmail Inbox</tagline>
          <fullcount>1</fullcount>
          <link rel=«alternate» href=«mail.google.com/mail» type=«text/html» />
          <modified>2009-09-09T08:32:02Z</modified>
          <entry>
          <title>Test22222222</title>
          <summary>T111est</summary>
          <link rel=«alternate» href=«mail.google.com/mail?account_id=xxxxxxxxxxxx%40gmail.com&message_id=1239dee275d61a35&view=conv&extsrc=atom» type=«text/html» />
          <modified>2009-09-09T08:31:53Z</modified>
          <issued>2009-09-09T08:31:53Z</issued>
          <id>tag:gmail.google.com,2004:1313325830576151093</id>
          <author>
          <name>My Name</name>
          <email>from@mail.dom</email>
          </author>
          </entry>
          </feed>

          После прочтения писем в ящике:
          <?xml version=«1.0» encoding=«UTF-8»?>
          <feed version=«0.3» xmlns=«purl.org/atom/ns#»>
          <title>Gmail — Inbox for xxxxxxxxxxxxxx@gmail.com</title>
          <tagline>New messages in your Gmail Inbox</tagline>
          <fullcount>0</fullcount>
          <link rel=«alternate» href=«mail.google.com/mail» type=«text/html» />
          <modified>2009-09-09T08:37:23Z</modified>
          </feed>
    • Я смотрю комментарий плюсуют. Плюсующие, у вас что работает? Там же XML. Подсчет количества строк не даст количетсво сообщений.
  • Без перла
    curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"

    www.commandlinefu.com/ рулит :)
    • Экранируйте символы < > у вас entry вылетел

      curl -u login:password --silent «https://mail.google.com/mail/feed/atom» | tr -d '\n' | awk -F '' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n «s/\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 — \1/p»
      • Бля это ж надо было так тупануть что пароль спалить :))
        • ниче, теперь есть повод сменить
          • Само собой. Сразу :)
      • пасворд фейл :)

        Вообще парсер не должэен ничего менять внутри code :(
  • для имапа на перле:
    #!/usr/bin/env perl
    
    use Net::IMAP::Simple;
    use Email::Simple;
    
    my $imap = Net::IMAP::Simple->new('imap_server') || die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
    
    if(!$imap->login('username','password')){
        print STDERR "Login failed: " . $imap->errstr . "\n";
        exit(64);
    }
    
    my $nm = $imap->select('INBOX');
    
    for(my $i = 1; $i <= $nm; $i++){
        if($imap->seen($i)){
            print "*";
        } else {
            print " ";
        }
    
        my $es = Email::Simple->new(join '', @{ $imap->top($i) } );
    
        printf("[%03d] %s\n", $i, $es->header('Subject'));
    }
    
    $imap->quit;
    


    ну и считать вывод | wc -l
  • Я так понимаю данной командой проверяется только inbox? А как насчет других ярлыков?
    • Спам mail.google.com/mail/feed/atom/spam/
    • Корзина mail.google.com/mail/feed/atom/trash/
    • Тут пишут что ярлыки можно вводить после слеша
      • So, to view your 'work' label as a feed, it's https://mail.google.com/mail/feed/atom/work/.
    • Работает, правда, не со всеми ярлыками. Помню нарывался на какие-то грабли, то ли с какими-то спецсимволами, то ли с русскими.
      • По илее если все правильно заурл-кодировать, то все будет работать

        Проверил у себя на ярлыке «В мемориз»
        Получилась такая ссылка. Работает

        https://mail.google.com/mail/feed/atom/%D0%92%20%D0%BC%D0%B5%D0%BC%D0%BE%D1%80%D0%B8%D0%B7

        * This source code was highlighted with Source Code Highlighter.
        • Не работало в русских тэгах со слэшами (ага, подпапки делал, в имапе хорошо выглядят). Причём, в некоторых случаях выдаёт ошибку, а в некоторых просто пустой rss, как будь-то там нет новых писем, хотя они там есть.
          • И да, про url encoding я знаю.
            • Я и не сомневался что вы знаете :) Но урлкодировать можно по-разному.
              А со слешем действительно засада. Попробовал — он его режет тупо и все. Никак не вставить.
  • а это меня одного смущает пароль, который в plaintext остаётся в .bash_history?
  • Чтобы не хранить пароль ни в скрипте, ни в истории:

    read -sp "pass: " && echo && curl -u username:$REPLY --silent "https://mail.google.com/mail/feed/atom" | grep -c ""
    • Не, ну парсер просто зверь. Чего он ест тэги внутри тэга code? Должно быть:

      read -sp "pass: " && echo && curl -u username:$REPLY --silent "https://mail.google.com/mail/feed/atom" | grep -c "<entry>"
      • Парсер настолько зверь, что вам не удастся написать в сообщении
  • Для того, что бы curl не ругался на сертификат надо добавить ключик "-k". Вариант с "" показывает только первых 20 писем.
    • И все-таки он зверь! Вариант с "<entry>" показывает только первых 20 писем.
  • Напомните пожалуйста, как в последний вариант добавить перекодировку на системную KOI8R? iconv-чегтототам
    • Ок. Нужно просто добавить в конец выражения:
      | iconv -f UTF-8 -t KOI8-R
      Вместо последней — кодировку вашей системы. Список досупных кодировок можно посмотреть командой iconv -l

      К.О. mode on
      Для пущего удобства выражение записать в файл, поместить в /usr/bin/ и сделать ему chmod a+x
      Скрипт можно будет запускать из командной строки просто по названию файла.
      /К.О.
      • Для удобства, iconv можно указывать только одну кодировку — исходную. В таком случае целевая будет взята из текущей локали. Т.е., можно просто написать iconv -f UTF-8. И какой бы ни была кодировка юзера, он увидит правильно кодированный текст.
  • А список TODO можно таким же образом получать?
  • А можно ли таким образом проверить на сколько заполнен ящик? в процентах или гигабайтах?
    • У Вас 8 гигабайт кончаются так быстро, что нужно мониторить онлайн?
      • Да, примерно за 7-10 дней. И таких ящиков админю несколько. Будьте толерантнее, не все же люди одинаковы, не все одинаково используют почту. Короче, проблема мониторинга свободного места в ящике очень актуальна. :)
        • > Будьте толерантнее

          Я же просто вопрос задал, без всяких намеков :)
  • Поделитесь как это вы сделали такой красивый (с тенью) скрин окна? Gimp?
    и еще хоцю такую же тему для гнома под МАС :)
    • >Поделитесь как это вы сделали такой красивый (с тенью) скрин окна? Gimp?

      По-моему в макоси это стандартная фича для скриншотов.

      В принципе, тень можно сделать при помощи утилиты montage, входящей в состав пакета imagemagick. Не такую гламурную, конечно, но всё же :)

      Держите небольшой скриптик:

      Copy Source | Copy HTML
      #!/bin/sh
       
      usage() {
          echo ""
          echo "Usage:"
          echo "    $0 <in_file> <out_file>"
          echo ""
      }
       
      if [ -z "$1" ]; then
          usage
          exit 1
      fi
       
      if [ -z "$2" ]; then
          usage
          exit 1
      fi
       
      PNG=`file $1 | grep PNG`
      if [ -z "$PNG" ]; then
          echo "Looks like file is not a PNG image"
          exit 1
      fi
       
      montage $1 -shadow -background none -geometry +5+5 $2


      Результат:

      • Так, а зачем я проверяю, что файл является PNG? Не нужно тут это. От старого скрипта осталось :)
        Можно удадить блок

        PNG=`file $1 | grep PNG`
        if [ -z "$PNG" ]; then
            echo "Looks like file is not a PNG image"
            exit 1
        fi
        • В общем, после удаления всего ненужного скрипт сократился почти вдвое:

          Copy Source | Copy HTML
          #!/bin/sh
           
          usage() {
              echo ""
              echo "Usage:"
              echo "    $0 <in_file> <out_file>"
              echo ""
          }
           
          if [ $# -lt 2 ]; then
              usage
              exit 1
          fi
           
          montage $1 -shadow -background none -geometry +5+5 $2
    • Так это ж и есть Mac :)
      • Делать такие скрины в Mac OS — стандартная фича.
        >Command-Control-Shift-4, then space, then click a window: Take a screenshot of a window and save it to the clipboard
  • А я fetchmail гоняю для этих целей. Через POP3 c сертификатами и все такое…

    Если интересно, могу написать.
  • Спасибо, весьма полезно. Кстати, я тут немного модернизировал ваш скрипт
  • Спасибо. Создал скрипт gmail и добавил в .screenrc. Теперь так

    backtick 1 10 10 gmail
    hardstatus alwayslastline
    hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%1` mail(s)][%{B}%Y-%m-%d %{W}%c %{g}]'
    • Да, забыл сказать к чему это — теперь в статусе screen-а написано клоичество непрочитанных писем.

      backtick 1 10 10 gmail — проверяет почту каждые 10 секунд
      [%1` mail(s)] — превращается в [7 mail(s)]
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.