Skocz do zawartości

Skrypt Do Sprawdzania Poczty Gmail Dla Conky


borzole

Rekomendowane odpowiedzi

Witam,

Nie mogę poradzić sobie ze skryptem, który sprawdzał by pocztę Gmail. Potem chciałem to wrzucić do conky, ale na razie same skrypty nie działają.

1. Pierwszy pomysł jest ze strony dla debiana http://debian.linux.pl/viewtopic.php?t=913...asc&start=0

#!/bin/bash

gmail_login="xxx" #login do skrzyki
gmail_password="yyy" #hasło do konta

dane="$(wget --secure-protocol=TLSv1 --timeout=3 -t 1 -q -O - \
https://${gmail_login}:${gmail_password}@mail.google.com/mail/feed/atom \
--no-check-certificate | grep 'fullcount' \
| sed -e 's/.*<fullcount>//;s/<\/fullcount>.*//' 2>/dev/null)"

if [ -z "$dane" ]; then
echo "Connection Error !"
else
echo "GMail: $dane list(ów)"
fi

doinstalowałem wget bo brakowało, ale przy sprawdzaniu dostaje "Connection Error !" ze skryptu. Czy ten skrypt jest poprawny dla fedory? Co zrobić żeby zadziałał?

Sam skrypt miałby się uruchamiać linijką

${execi 60 ~/check_gmail.sh}

w conky.

 

2. pomysł jest bezpośrednio ze strony conky http://conky.sourceforge.net/gmail.pl

i uruchamiany przez

${exec cat ~/.gmail/.gmail_top}

...no ale puki co też nie działa.

#!/usr/bin/perl

# Put this in ~/.gmail/ and use "crontab -e" to add something like
# "* * * * * ~/.gmail/gmail.pl > /dev/null" to run it every minute.
# ${exec cat ~/.gmail/.gmail_top} shows your inbox in Conky.
# Note that this was intended to be used with Gmail or any other
# ssl-enabled pop3 server.

# beginning of configuration

# pop3 host
$pop_host = "pop.gmail.com";

# pop3 username (for Gmail, I didn't have to put @gmail.com at the end)
$pop_user = "user";

# pop3 password
$pop_pass = "Password";

# ssl port number (995 is what Gmail uses)
$ssl_port = "995";

# ssl protocol
$ssl_prot = "tcp";

# number of emails to show
$dis_numb = "6";

# end of configuration

use Mail::POP3Client;
use IO::Socket::SSL;

 my $socket = IO::Socket::SSL->new( PeerAddr => $pop_host,
                                    PeerPort => $ssl_port,
                                    Proto    => $ssl_prot);
 my $pop = Mail::POP3Client->new();
 $pop->User($pop_user);
 $pop->Pass($pop_pass);
 $pop->Socket($socket);
 $pop->Connect();

$msg_count = $pop->Count();

for ($i = $msg_count, $j = 0; $i >= $msg_count-($dis_numb-1); $i--, $j++) {
 foreach ( $pop->Head( $i ) ) {
   #/^(From|Subject):\s+/i and print $_, "\n";
   if ($_ =~ m/^From:/) {
     ($from) = ($_ =~ m#^From: .*<(.*)>#);
     $from = substr($from, 0, 30);
     $out .= "$j = $from\n";
   }
 }
 #chop $out;
 `echo -e "$out"> ~/.gmail/.gmail_top`;
}

$pop->Close();

tym razem dostaję komunikat

Can't locate Mail/POP3Client.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at ./gmail.pl line 31.
BEGIN failed--compilation aborted at ./gmail.pl line 31.

co tu trzeba doinstalować z tego perla?

Czy ktoś ma pomysł jak uruchomić jeden albo drugi sposób?

Odnośnik do komentarza
Udostępnij na innych stronach

w sposobie z wykorzystaniem perla to musisz sobie doinstalować kilka modułów z CPAN chyba, że są dostępne w repozytorium (mam gentoo więc nie wiem czy są w repozytoriach fedory, a na serwerach nie chce mi się szukać):

Mail-POP3Client

IO-Socket-SSL

 

możliwe że będzie brakować jeszcze jakiś modułów brakowało ale to później wyjdzie

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki! Działa!

To teraz dla potomności ;)

 

1. Ten sposób mi nie działał. Mam podręcznik wget, ale nadal nic nie wiem. Może ktoś chciałby się pobawić http://ptm.linux.pl/man_HTML/info_pl_HTML/wget/wget_toc.html

 

2. Ten sposób działa! Tylko brakowało czegoś

w sposobie z wykorzystaniem perla to musisz sobie doinstalować kilka modułów z CPAN chyba, że są dostępne w repozytorium ...

Mail-POP3Client

IO-Socket-SSL

Chyba nie ma w repozytorium (mam tylko dwa: domyślne i livna) wklepałem: yum info CPAN Mail-POP3Client IO-Socket-SSL ale nic nie wyskoczyło. Znalazłem je tu:

http://search.cpan.org/~sullr/IO-Socket-SSL-1.08/SSL.pm

http://search.cpan.org/~sdowd/Mail-POP3Cli...7/POP3Client.pm

Instalacja poszła bez problemu, więcej modułów nie było potrzebne.

 

Teraz zgodnie z komentarzem w skrypcie wrzuciłem gmail.pl do katalogu ~/.gmail/ trzeba jeszcze w środku zmienić user i Password ;)

# pop3 username (for Gmail, I didn't have to put @gmail.com at the end)
$pop_user = "user";

# pop3 password
$pop_pass = "Password";

plus prawa do wykonywania. Po testowym wykonaniu w katalogu pojawił się nowy plik ~/.gmail/.gmail_top z informacją o stanie konta.

Żeby skrypt się uruchamiał co jakiś czas trzeba wpisać w konsoli (cholera to Vi!! aaaaaaa instrukcja obsługi jak się tego używa)

$ crontab -e

i wpisać (5 oznacza co ile minut będzie sprawdzane konto, więcej tu Crontab)

SHELL=/bin/sh
*/5 * * * * ~/.gmail/gmail.pl > /dev/null

a przynajmniej ja tak zrobiłem. Nacisnąć Esc i wpisać ZZ. Sprawdzanie gotowe. ;)

Do skryptu conky trzeba dopisać linijkę

${exec cat ~/.gmail/.gmail_top}

To powinno wyglądać tak jak tu na dole http://conky.sourceforge.net/conky-folding.png tylko skórka inna, bo ta jest brzydka ;)

ps. dopiero teraz zobaczyłem że skrypt pozwala sprawdzać nie tylko konta gmail.

# Note that this was intended to be used with Gmail or any other
# ssl-enabled pop3 server.

3. Heh jak się bawić to już na całego. tu jeszcze jeden sposób: http://forum.slackware.pl/viewtopic.php?t=9695

Odnośnik do komentarza
Udostępnij na innych stronach

Może wpisujesz np. w miejscu loginu do skrzynki [email protected] zamiast samego "login"?
nie, wpisuje samo 'login'. Nie mam pojęcia czemu nie działa, a szkoda, bo jest to o jakieś pół hektara papieru krótszy sposób.

 

[EDIT]

Znalazłem jeszcze dwa sposoby sprawdzania z pomocą skryptów:

4. Pięknie wygląda w konsoli (kolorki) mamy też więcej informacji o poszczególnych mailach http://twig.homelinux.org/files/dev/gmail.pl Niestety dla Conky trzeba pousuwać te kolorki bo sobie nieradzi i wyświetla krzaczki w miejscach gdzie kolor się zmienia. Uprościłem go do takiej postaci:

#!/usr/bin/perl -w

#
# gmail.pl v1.0
#
# Checks a GMail account's atom feed (via SSL) and formats the 
# results nicely in a console window
#  * usage: gmail.pl <username> <password>
#
# Required Perl modules:
#  * LWP::UserAgent		(for fetching the atom feed)
#  * XML::Parser		(for parsing the atom feed)
#
# Optional Perl module:
#  * DateTime::Format::ISO8601	(for formatting the date in the feed)
#
# If you only want to check one account, you can put the username 
# and password below (between the ""), and run without arguments.
$username = (defined($ARGV[0])) ? $ARGV[0] : "";
$password = (defined($ARGV[1])) ? $ARGV[1] : "";
########################################################################
if ($username eq "" || $password eq "") {
die("Usage: gmail.pl <username> <password>
(or you can edit the script to use one account automatically)\n");
}

require LWP::UserAgent;
require XML::Parser;

$has_iso8601 = eval { require DateTime::Format::ISO8601; } ? 1 : 0;
if ($has_iso8601) { 
require DateTime::Format::ISO8601; 
}

# fetch atom feed
my $browser = LWP::UserAgent->new;
$browser->agent("gmail.pl/1.0");
$browser->credentials(
'mail.google.com:443',
'New mail feed',
$username."\@gmail.com",
$password
);
unless (defined($xmlresponse = $browser->get('https://mail.google.com/mail/feed/atom')))
{ die($xmlresponse->status_line, "\n"); }
$xml = $xmlresponse->content;

# ? (aka "...") is not defined in XML so 
# it's not displayed correctly. We're going to 
# replace it in the XML before parsing.
$xml =~ s/\…/.../g;

my $p = new XML::Parser(Style => 'Subs');
$p->setHandlers(Char => \&char);

$line = ('-' x 78) . "\n";

$p->parse($xml);
# print "\n";

# procedures to deal with various elements
sub char {  my (undef, $str) = @_;  $char = $str;}

sub title_ {
my ($el) = @_;
my $parent = ($el->current_element);
if ($parent eq "feed") { print "" . $char };
if ($parent eq "entry") { $subj = "Subject: " . $char };
}
# sub summary_ {  $summ = $char;}

sub issued_ {
if ($has_iso8601) {
 my $dt = DateTime::Format::ISO8601->parse_datetime( $char );
 $dt->set_time_zone("local");
 $date = $dt->strftime("%B %d, %G @ %r");
} else {
 my @date = split(/T/,$char);
 $date = $date[0]." ".$date[1];
}
}
sub modified_ {  &issued_;}

sub name_ { $auth = $char;}

sub email_ { $auth = $auth . " [" . $char . "]";}

sub entry_ {
print "From: $auth :: $date\n" . 
$subj . "\n" .
# $summ . "\n" .
$line;
}
sub fullcount_ {
$ct = $char;
if ($ct==0) {
 print " :: 0 messages.\n\n";
 exit;
} elsif ($ct==1) {
 print " :: " . (1) . (" new message.\n") . $line;
} elsif ($ct>1) {
 print " :: " . ($ct) . (" new messages.\n") . $line;
}
}

I to rozwiązanie już mnie w zupełności satysfakcjonuje.

5. Jeszcze jedno rozwiązanie, ale już mi się nie chciało go sprawdzać ;)http://forums.gentoo.org/viewtopic-t-29183...orsmo+tips.html

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 months later...

Rzeczywiście wystarczyło włączyć obsługę POP w gmail :)

Niestety w 2 sposobie występuje błąd ;/

 

Can't locate LWP/UserAgent.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./gmail.pl line 27.

 

doinstalowanie pakietów liblwp2 oraz liblwp-authen-wsse-perl niepomogło. Jakie pakiety i z jakich repozytorów powinienem zainstalowac?

Odnośnik do komentarza
Udostępnij na innych stronach

zacznijmy od tego że perla nie znam, a fedore mam od sierpnia ;) ale...

1. testuj na tym oryginalnym skrypcie, jak będzie ok to dopiero sprawdź na tym co okroiłem, bo może coś skopałem.

2. ten twój błąd wyjaśnia link http://www.kt.agh.edu.pl/perl-faq/Uruchamianie#2

3. pamiętam ze robiłem jakiś test w rodzaju perl -w skrypt.pl z tego linka http://www.kt.agh.edu.pl/perl-faq/Uruchamianie#8

w ogóle możesz sobie przejrzeć tę stronę całą ;)

4. modułów perl jest tak dużo że głowa boli, w repo fedory jest dużo ale to i tak mało ;) do instalowania jest specjalny automat i wygląda to mniej więcej tak:

perl -MCPAN -e 'install LWP::UserAgent'

więcej tutaj, ładnie napisane http://www.brandonhutchinson.com/installin...rl_modules.html

albo tu też jakiś przykład jak to się robi http://xfce.jakilinux.org/viewtopic.php?pid=780

albo jak to mówią z palca http://search.cpan.org/~gaas/libwww-perl-5...WP/UserAgent.pm

Odnośnik do komentarza
Udostępnij na innych stronach

Ten błąd udało mi się rozwiązać poprzez zainstalowanie paczki libwww-perl, ale pojawił się nowy błąd :P

Can't locate XML/Parser.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./gmail.pl line 28.

pio:/home/rc/.gmail# aptitude reinstall libwww-perl

 

Ten natomiast błąd udało mi się załatać instalując libxml-perl

 

Skrypt nr 4 jest rzeczywiście lepszy od 2 :)

 

Pracuje teraz nad tym żeby się to wszystko ładnie wyświetlilo w conky, póki co nic sie nie wyświetla ;/

Odnośnik do komentarza
Udostępnij na innych stronach

żeby się wyświetlało w conky to mam wpis

${color}${texeci 300 /home/user/skrypty/gmail.pl}

300 oznacza co ile sekund skrypt ma się wykonać, czyli jakieś 5minut. Można to zrobić też za pomocą cron, ale tak jest szybciej, a poza tym wynik skryptu jest od razu wyświetlany na pulpicie, bez zbędnych plików.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, teraz wyświetla się, lecz ta informacja rozszerza moje conky, przez co zajmuje ponad 2/3 ekranu :|

maximum_width x niestety ucina wiadomość. Czy jest w conky cos takiego jak zawijanie wierszy ? ;p

 

jak zrobić aby ten skrypt dodatkowo obsługiwał poczte o2 i interia oraz czy jest możliwość sprawdzania pare skrzynek na raz bez tworzenia/kopiowania nowych skryptów?

Odnośnik do komentarza
Udostępnij na innych stronach

z tego co wiem to:

1. Gmail może sprawdzać ci inne skrzynki, ja tak od dawna mam podłączone konto onet, o2, wp, gazeta.pl i dwa konta uczelniane. Koniec ze spamem, bo gmail to filtruje. Polecam to rozwiązanie.

2. Conky ma wbudowany moduł do sprawdzania zwykłych kont POP. Z Gmail był problem, bo dostęp jest przez ssl (?, port 995). Tak więc nie potrzeba skryptów do zwykłych kont. Ale jak to się robi to Ci nie powiem, bo nie próbowałem. Poszukaj w google, albo w dokumentacji Conky, to pewnie jedna linijka jest.

 

Co do zawijania wierszy, to chyba nie ;), więc trzeba częściej sprawdzać pocztę, albo skorzystać z innego narzędzia yum install mail-notification , bo tak naprawdę wypisywanie maili w Conky robi się dla zabawy :)

Odnośnik do komentarza
Udostępnij na innych stronach

Aby ten skryp był wyświetlany prawidłowo w moim conky postanowiłem troszkę powyrzucać dla mnie zbędnych rzeczy z tego skryptu (np data jest dla mnie całkowicie zbędna). Obecnie skrypt wygląda następująco:

#!/usr/bin/perl -w
#
# gmail.pl v1.0
#
# Checks a GMail account's atom feed (via SSL) and formats the
# results nicely in a console window
#  * usage: gmail.pl <username> <password>
#
# Required Perl modules:
#  * LWP::UserAgent             (for fetching the atom feed)
#  * XML::Parser                (for parsing the atom feed)
#
# If you only want to check one account, you can put the username
# and password below (between the ""), and run without arguments.
$username = (defined($ARGV[0])) ? $ARGV[0] : "login";
$password = (defined($ARGV[1])) ? $ARGV[1] : "haslo";
########################################################################
  if ($username eq "" || $password eq "") {
    die("Usage: gmail.pl <username> <password>
    (or you can edit the script to use one account automatically)\n");
  }

  require LWP::UserAgent;
  require XML::Parser;

  # fetch atom feed
  my $browser = LWP::UserAgent->new;
  $browser->agent("gmail.pl/1.0");
  $browser->credentials(
    'mail.google.com:443',
    'New mail feed',
    $username."\@gmail.com",
    $password
  );
  unless (defined($xmlresponse = $browser->get('https://mail.google.com/mail/feed/atom')))
  { die($xmlresponse->status_line, "\n"); }
  $xml = $xmlresponse->content;
  $xml =~ s/\…/.../g;

  my $p = new XML::Parser(Style => 'Subs');
  $p->setHandlers(Char => \&char);

  $line = ('-' x 50) . "\n";

  $p->parse($xml);

  # procedures to deal with various elements
  sub char {  my (undef, $str) = @_;  $char = $str;}

  sub title_ {
    my ($el) = @_;
    my $parent = ($el->current_element);
    if ($parent eq "feed") { print "" . $char };
    if ($parent eq "entry") { $subj = "S: " . $char };
  }

  sub name_ { $auth = $char;}

  sub email_ { $auth = $auth . " [" . $char . "]";}

  sub entry_ {
    print "F: $auth \n" .
    $subj . "\n" .
    $line;
  }
  sub fullcount_ {
  $ct = $char;
  if ($ct==0) {
    print "\n0 messages.\n\n";
    exit;
  } elsif ($ct==1) {
    print "\n" . (1) . (" new message.\n") . $line;
  } elsif ($ct>1) {
    print "\n" . ($ct) . (" new messages.\n") . $line;
  }
}

 

Chciałem aby mi nie wyświetlało "Gmail - Inbox for" lecz niestety nie wiem w jakiej zmiennej jest ten text przechowywany.

 

PS, Jakoś nie wyobrażam sobie jak ten skrypt wyglądałby dla poczty o2. Więc pozostaje tylko w Gmail ustawić aby pobierało maile z innych skrzynek :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...