*nix

индекс
298,31

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
+103
9 сентября 2009, 11:14
99

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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
smartov #
Так это ж и есть Mac :)
0
smartov #
Делать такие скрины в 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
Nebulosa #
А я fetchmail гоняю для этих целей. Через POP3 c сертификатами и все такое…

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

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

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