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
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 95
    • –20
      Как-то вы странно описание «команд» привели, ибо awk (http://ru.wikipedia.org/wiki/AWK) — это язык такой, который работает с текстом, а не «выкусывает» нужные части…
      • +8
        Я рассказал что делают команды в данном случае, а не для чего они предназначены. Для чего они предназначены можно прочитать в man.
        • +1
          Описал чуть более подробно, чтобы не было подобных вопросов.
        • НЛО прилетело и опубликовало эту надпись здесь
          • +1
            Все так, только у гугла POP TLS-ный, что накладывает некоторые дополнительные сложности.
          • –116
            Лучше зарегистрировать почту от Mail.Ru и поставить агент. А также получим отличный мессенджер.
            • +1
              Ага, он что, есть под Линукс?
              • –65
                Конечно нет, это же не костыль.
                • +7
                  Тогда какой толк упоминать его в блоге «Линукс для всех»?
                  • +12
                    Очень толсто :) Идите тренироваться на LOR
                    • +1
                      михо, на ЛОРе он не проживет и минуты — такая толщина туда даже не пролезет.
                • 0
                  Надеюсь это было ибо это феерический каммент.
                  • +4
                    Вот этот?!..


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

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

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

                                                Если новых писем нет, то и <empty> отсутствует
                                                • 0
                                                  У меня есть новые письма, но empty отсутствует. Количество новых писем эта команда не вернет. Я что-то не пойму кто из нас где запутался :)
                                                  • 0
                                                    • +1
                                                      entry наверно. Не empty
                                                    • 0
                                                      До прочтения писем в ящике:
                                                      <?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>
                                                  • –2
                                                    Я смотрю комментарий плюсуют. Плюсующие, у вас что работает? Там же XML. Подсчет количества строк не даст количетсво сообщений.
                                                  • 0
                                                    Без перла
                                                    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/ рулит :)
                                                    • +1
                                                      Экранируйте символы < > у вас 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»
                                                      • +7
                                                        Бля это ж надо было так тупануть что пароль спалить :))
                                                        • 0
                                                          ниче, теперь есть повод сменить
                                                      • +1
                                                        пасворд фейл :)

                                                        Вообще парсер не должэен ничего менять внутри code :(
                                                    • 0
                                                      для имапа на перле:
                                                      #!/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
                                                      • 0
                                                        Я так понимаю данной командой проверяется только inbox? А как насчет других ярлыков?
                                                            • 0
                                                              Тут пишут что ярлыки можно вводить после слеша
                                                              • 0
                                                                So, to view your 'work' label as a feed, it's https://mail.google.com/mail/feed/atom/work/.
                                                              • 0
                                                                Работает, правда, не со всеми ярлыками. Помню нарывался на какие-то грабли, то ли с какими-то спецсимволами, то ли с русскими.
                                                                • 0
                                                                  По илее если все правильно заурл-кодировать, то все будет работать

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

                                                                  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.
                                                                  • 0
                                                                    Не работало в русских тэгах со слэшами (ага, подпапки делал, в имапе хорошо выглядят). Причём, в некоторых случаях выдаёт ошибку, а в некоторых просто пустой rss, как будь-то там нет новых писем, хотя они там есть.
                                                                    • 0
                                                                      И да, про url encoding я знаю.
                                                                      • 0
                                                                        Я и не сомневался что вы знаете :) Но урлкодировать можно по-разному.
                                                                        А со слешем действительно засада. Попробовал — он его режет тупо и все. Никак не вставить.
                                                              • 0
                                                                а это меня одного смущает пароль, который в plaintext остаётся в .bash_history?
                                                              • +2
                                                                Чтобы не хранить пароль ни в скрипте, ни в истории:

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

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

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

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


                                                                            Результат:

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

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

                                                                                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
                                                                            • 0
                                                                              Так это ж и есть Mac :)
                                                                              • 0
                                                                                Делать такие скрины в Mac OS — стандартная фича.
                                                                                >Command-Control-Shift-4, then space, then click a window: Take a screenshot of a window and save it to the clipboard
                                                                            • 0
                                                                              А я fetchmail гоняю для этих целей. Через POP3 c сертификатами и все такое…

                                                                              Если интересно, могу написать.
                                                                              • 0
                                                                                Спасибо, весьма полезно. Кстати, я тут немного модернизировал ваш скрипт
                                                                                • 0
                                                                                  Спасибо. Создал скрипт 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}]'
                                                                                  • 0
                                                                                    Да, забыл сказать к чему это — теперь в статусе screen-а написано клоичество непрочитанных писем.

                                                                                    backtick 1 10 10 gmail — проверяет почту каждые 10 секунд
                                                                                    [%1` mail(s)] — превращается в [7 mail(s)]

                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.