2024. április 25., csütörtök

Gyorskeresés

Értesülj az emaileidről SMS-ben!

  • (f)
  • (p)
Írta: |

Hasznos lehet, ha a mobilunk "szól", amikor új email érkezik postaládánkba...

[ ÚJ TESZT ]

Sokszor hasznos lehet, ha a mobilunk "szól", amikor új email érkezik postaládánkba. A mai telefonok jó részén van lehetőségünk a leveleinket elolvasni, de ha azt szeretnénk, hogy értesítsen is az új levelekről, akkor két kézenfekvő lehetőségünk volna:

1. Folyamatosan működtetjük a telefonunkon működő e-mail klienst - ez mondjuk okostelefonokon működhet, az adatátviteli díjak is egyre kedvezőbbek, mégis van egy nagy hátránya ennek a megoldásnak: gyilkos az akkumulátorra. Kipróbáltam, még ha csak ritkábban is ellenőrzi a postaládánk, akkor is könnyen felére-kétharmadára csökkenhet a készenléti idő.

2. A mobilszolgáltatónknál használunk egy email fiókot, amire átirányítjuk bejövő leveleink, és amiről a szolgáltató X Ft-ért küldhet értesítést, ha új levelünk van. Itt nyilvánvaló a hátrány: pénzbe kerül, minnél több a levelünk, annál többe. És minek fizessünk valamiért, amit ingyen is meg tudunk oldani?

Az alábbi, harmadik módszer kicsit trükkösebb, ezért megpróbálom részletesen kifejteni, hátha valakinek pont erre van szüksége.
Az biztos hogy sms-ben kéne jönnie az értesítőnek, hogy a telefonnak ne kelljen folyton adatkapcsolaton lógni. Tehát már csak egy ingyenes sms-küldő program kéne... Létezik ilyen?

A jó hír, hogy létezik, még ha van is valami napi limit - bár még nem jöttem rá, pontosan mennyi ;). A Google Naptárba van beépítve. Igaz, nem egészen erre találták ki, de egy kis trükközéssel fel tudjuk használni saját céljainkra.

Aki nem ismerné, a következőképp működik ez a naptárprogram: kell egy Google Fiók a belépéshez - ha van Gmail címünk, használhatjuk azt, ha nincs, akkor érdemes egyet létrehozni, mert a későbbiekben még szükség lehet rá. Miután beléptünk, a beállítások között megadhatjuk telefonszámunkat, amire a későbbiekben a naptárban létrehozott eseményekről kérhetünk értesítést - sms-ben.

A Gmail-es fiókunkból fogjuk kiszedni a leveleket, amikről értesítést szeretnék. Aki nem használ Gmail-t, erre a célra létrehozhat egy fiókot, és beállíthatja kedvenc levelezőrendszerét, hogy küldje tovább a Gmail-es címre a bejövő leveleket. Ez azért hasznos, mert a Gmail-es olvasatlan leveleinket sima HTTP azonosítás után le tudjuk kérdezni külső programmal XML formátumban, amit aztán egyszerűen fel lehet dolgozni. Persze mindez megoldható mondjuk egy POP3 lekérdező összerakásával is, szóval a nagyon paranoiások kikerülhetik a Gmailt. A Google Calendart viszont akkor is kelleni fog, szóval minek :)

Ezután a Google Naptárba be kell pakolni eseményként a leveleket, és már jönnek is az sms-ek.

A konkrét megvalósítás

A feladatot egy egyszerű Python szkripttel oldottam meg. Lényegében bármi mással is meg lehetne - a dolgunk akkor a legegyszerűbb, ha olyan nyelvet választunk, amit támogat a Google Data API.

A szkript elején importáljuk a szükséges függvénykönyvtárakat, köztük a ElementTree-t és a GData Python Client Library-t (ezek nélkül a szkript nem fog működni).

#!/usr/bin/python

try:
from xml.etree import ElementTree # for Python 2.5 users
except ImportError:
from elementtree import ElementTree
import gdata.calendar.service
import gdata.service
import atom.service
import gdata.calendar
import atom
import getopt
import sys
import string
import time

Majd adjuk meg a Google azonosításhoz szükséges adataink a szkriptnek:

EMAIL = 'email@gmail.com'
PASSWORD = 'jelszo'
CALENDAR = 'kod@group.calendar.google.com'

Az utolsó kód annak a naptárnak az azonosítója, ahová a leveleinket akarjuk importálni, hogy aztán sms-t kapjunk róla. Például létrehozhatunk egy Gmail nevű naptárat, majd az adatainál keressünk meg ezt az azonosítót, a Naptár címe sorban.

A cím és a jelszó segítségével be tudunk jelentkezni a Google Calendar API-n keresztül:

calendar_service = gdata.calendar.service.CalendarService()
calendar_service.email = EMAIL
calendar_service.password = PASSWORD
calendar_service.ProgrammaticLogin()

A következő lépés a leveleink letöltése a Gmail fiókunkból:

atom_service = atom.service.AtomService()
atom_service.UseBasicAuth(EMAIL, PASSWORD)
gmail_str = atom_service.Get('https://mail.google.com/mail/feed/atom').read()

Dolgozzuk fel az olvasatlan üzeneteinket tartalmazó XML-t:

tree = ElementTree.fromstring(gmail_str)
entries = tree.getchildren()[5:]
for entry in entries:
title = entry.getchildren()[0].text
summary = entry.getchildren()[1].text
author_name = entry.getchildren()[6].getchildren()[0].text
author_email = entry.getchildren()[6].getchildren()[1].text
modified = entry.getchildren()[3].text

Most már megvannak a leveleink adatai, a következő lépés, a beillesztésük a naptárba.

Itt teszek egy kis kitérőt az időzítésekről:
Tegyük fel, hogy a szkriptet majdan 10 percenként fogjuk lefuttatni. Hogy ne kapjuk meg az értesítést 10 percenként, csak azokat a leveleket tesszük be a naptárba, amelyek 600 másodpercnél frissebbek. Továbbá a naptári eseményt 20 perccel a levél feladása utánra állítjuk, a róla szóló értesítést pedig 10 perccel előre. Így ha a megkapott levelet a lehető legrégebben, 10 perce adták fel, akkor most kapunk róla értesítést, ha pedig újabb, akkor 10 percen belül.

sent = time.mktime(time.strptime(modified, '%Y-%m-%dT%H:%M:%SZ')) - time.timezone
now = time.time()

if (now-sent < 630): # fél percet még rádobhatunk, biztos ami biztos

event = gdata.calendar.CalendarEventEntry()
event.title = atom.Title(text=author_email+' ('+author_name+')')
event.content = atom.Content(text=summary)
event.where.append(gdata.calendar.Where(value_string=title))
start_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(sent+1200))
when = gdata.calendar.When(start_time=start_time)
when.reminder.append(gdata.calendar.Reminder(minutes=10))
event.when.append(when)
new_event = calendar_service.InsertEvent(event, '/calendar/feeds/'+CALENDAR+'/private/full')

Az események címének a feladót állítottuk be, helyszínének pedig a levél tárgyát, ezt a kettőt fogjuk megkapni az sms(ek)-ben. A többes szám oka, hogy sokszor több sms-be darabolva kapjuk meg az értesítést.

Ennyivel lényegében meg is volnánk. Még hátravan az ütemezés, erre az alábbi cron bejegyzést használom:

*/10 * * * * /usr/bin/python /utvonal/gmail2cal.py

A kód nálam működik, mindazonáltal lehetnek benne hibák, amiket kérnék kommentben jelezni.

Azóta történt

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.