lunes, 1 de octubre de 2012

Escrebendo un script que avise no email de novas entradas nun Atom [python] (Parte 2: a base de dados e o correo)

Nun post anterior viramos como escreber un programa que lera os Atom, neste imos ver como decatarnos de que unha entrada é nova e como enviala por correo electrónico.

A base de dados
Como base de dados imos a usar SQLite3, que non require software externo e python implementa como parte da libraría estándar: http://docs.python.org/library/sqlite3.html


Así, o noso script tería que abri-lo arquivo da base de dados e se é necesario preparar as táboas:
import sqlite3

dbname = "novas.sqlite3"
conn = sqlite3.connect(dbname)

A táboa que usaremos será unha cunha soa columna, a do título, creámola entón:
# Preparamos o obxecto que xestiona a conexión a base de dados
cur = conn.cursor()
# Creamos a táboa de novas
cur.execute('''CREATE TABLE novas (titulo varchar)''')

Pero se o '''CREATE TABLE''' executase coa táboa xa creada (por exemplo se lanzamos o script despois de habelo parado, daría unha excepción, para correxilo faremos:
# Creamos a táboa de novas
try:
    cur.execute('''CREATE TABLE novas (titulo varchar)''')
except sqlite3.OperationalError, e:
    pass

Así, se queremos engadir unha entrada a táboa faríamos unha query de `INSERT`, como se fora una base de dados SQL normal:
def add_entry(titulo, cur):
    cur.execute('''INSERT INTO novas VALUES(?)''', (titulo,))
(Ollo con facer o remprazo modificando directamente a cadea que podemos caer fácilmente nun SQL-injection ;) ).

E para comprobar se hay unha entrada, pois o de sempre, `SELECT`
def entry_exists(titulo, cur):
    cur.execute('''SELECT count(*) FROM novas WHERE titulo=?''', (titulo,))
    return cur.fetchone()[0] > 0

E esta parte xa está...
>>> add_entry(u'Título da entrada', cur)
>>> entry_exists(u'título falso', cur)
False
>>> entry_exists(u'Título da entrada', cur)
True
>>> 

O cliente de correo
E chegamos o momento de preparar o sistema que enviará o correo electrónico, por suposto Python provee unha libraría estándar para isto: http://docs.python.org/library/smtplib.html

Para mandar un correo so temos que conectarnos a un servidor
mailer = smtplib.SMTP(server)

Iniciar unha sesión cifrada
mailer.starttls()

Facer login
mailer.login(username, password)

Enviar propiamente o correo (o formateado deixa que desexar, pero serve de exemplo)
mailer.sendmail(send_from, rcpt_to, "Subject: %s\n\n%s" % (subject, data))

E por último pechar a conexión
mailer.quit()

E xa está, xuntémolo todo nunha función e vexamos un exemplo:
def mail(server, send_from, rcpt_to, subject, data, username, password):
    mailer = smtplib.SMTP(server)
    mailer.starttls()
    mailer.login(username, password)
    mailer.sendmail(send_from, rcpt_to, "Subject: %s\n\n%s" % (subject, data))
    mailer.quit()

Por exemplo, se quero enviar un correo de proba dende a miña conta de GMail faríao así
mail(server='smtp.gmail.com:587', # Servidor de gmail
     send_from='kenkeiras@gmail.com', # Correo do emisor
     rcpt_to='kenkeiras@gmail.com',   # Correo do receptor
     subject='Proba',                 # Asunto
     data='Proba do script',          # Texto do correo
     username='kenkeiras',            # Usuario do servizo
     password='xxxxxxxxxxx')          # Contrasinal do servizo

Así, o código podería quedar como este: http://pastebin.com/CvVRDcdm

Como nota final decir que poderíamos facer que se execute cada hora, para isto existe un demo chamado `cron`, queda a idea como exercicio para quen lea ;)

Saúdos

No hay comentarios:

Publicar un comentario