Programování spiderů v Pythonu 3 – Práce s e-mailem

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Jakub Tětek
Datum: 2.4.2014
Hodnocení/Hlasovalo: 1.6/10

V dnešním díle seriálu si ukážeme, jak potvrdit e-mail v naší automatizované registraci na Facebooku a také, jak z Pythonu e-maily odesílat.

Potvrzování emailové adresy

Bot PythonMinule jsme naprogramovali bota, který se dokázal automatizovaně zaregistrovat na Facebooku. Po registraci je ale ještě potřeba potvrdit platnost uvedené e-mailové adresy. K přijmutí e-mailu žádajícího o potvrzení využijeme dočasné e-mailové schránky. Já jsem pro tento účel vybral službu TrashcanMail.com, ale podobný postup by šel aplikovat i na jiné služby poskytující dočasné e-mailové schránky. Některé z nich jsou ale už Facebookem blokovány. Dočasnou schránku jsem zvolil proto, že nás to oprošťuje od registrace e-mailu a tudíž i vypisování captchy, nebo dokonce čísla mobilního telefonu.

TrashcanMail.com navíc poskytuje RSS feed, který umožní kontrolovat, zda již e-mail dorazil, aniž bychom museli stahovat objemnou HTML stránku obsahující spousty nepotřebných informací.

Vzhledem k tomu, že není zapotřebí řešit formuláře, ani nic podobného, tak namísto Mechanize použijeme Urllib2.


Nejdříve si nadefinujeme funkce, které použijeme při potvrzování emailu:


def isNewMail(address):
   req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss") # stáhneme RSS feed
   rss = req.read() # z objektu odpovedi dostaneme XML kód
   if "" in rss: # pokud kód obsahuje string ''
      return rss # vrátíme XML
   else:
      return False


def waitForMail(address):
   received = False
   while not received: # dokud nám nepřišel email, pokaždé
      sleep(5) # počkáme pět sekund
      received = isNewMail(address) # a zkontrolujeme zda už nepřišel
   return received # pak vrátíme RSS feed


Nyní tedy máme všechny potřebné funkce a můžeme začít se samotným potvrzováním emailu.

Nejdříve zavoláme funkci waitForMail, která počká než přijde email a pak vrátí RSS feed.

rss = waitForMail(address)


Poté můžeme vyhledat odkaz, na stránku s posledním emailem a stáhnout jí.

link = re.findall("\s*([^<]*)\s*", rss)[-1] 
html = urllib2.urlopen(link).read()


Najdeme v ní potvrzovací odkaz na Facebook.

conLink = re.search("https:\/\/www.facebook.com\/n\/\?confirmemail\.php[^<]*", html).group()


A odkaz otevřeme, čímž potvrdíme email.

urllib2.urlopen(conLink)


Když naimportujeme nutné knihovny a dáme to dohromady s našimi funkcemi, dostaneme tento výsledný skript:

import urllib2
import re
from time import sleep

def isNewMail(address):
   req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss")
   rss = req.read()
   if "" in rss:
      return rss
   else:
      return False

def waitForMail(address):
   received = False
   while not received:
      sleep(5)
      received = isNewMail(address)
   return received

def confirmMail(address):
   rss = waitForMail(address)
   link = re.findall("\s*([^<]*)\s*", rss)[-1]
   html = urllib2.urlopen(link).read()
   conLink = re.search("https:\/\/www.facebook.com\/n\/\?confirmemail\.php[^<]*", html).group()
   urllib2.urlopen(conLink)


Nyní nám stačí zavolat funkci confirmMail s emailovou adresou (bez části @trashcanmail.com) v parametru a máme plně funkční účet na Facebooku.


Odesílání emailů v Pythonu

Někdy by bylo užitečné emaily nejen přijímat, ale také odesílat. Například, když se změní obsah webové stránky, můžeme si nechat zaslat upozornění. K tomu bude potřeba mít nainstalován smtp server. Ve většině linuxových distribucí už je předinstalován a pokud není, je jednoduché ho doinstalovat. K tomu mohu doporučit například tutoriál na rosehosting.com.

Nejdříve naimportujeme e-mail MIME knihovnu, která nám umožní vytvořit objekt e-mailu, a SMTP knihovnu, pomocí které budeme email odesílat.

from email.mime.text import MIMEText
import smtplib


Když máme importovaný MIME modul, můžeme za jeho pomoci vytvořit objekt e-mailu

msg = MIMEText('text emailu')


Poté vyplníme předmět, příjemce a odesílatele. Jako odesílatele můžeme nastavit jakýkoliv string vypadající jako emailová adresa, není tedy nutné, abychom použili naši skutečnou adresu. Hodnoty které vyplníme zde, se zobrazí příjemci v e-mailovém klientu.

msg['Subject'] = 'Predmet'
msg['From'] = 'odesilatel@nekde.tld'
msg['To'] = 'prijemce@nekde.tld'


Nyní otevřeme sezení s SMTP serverem, který běží na našem počítači.

s = smtplib.SMTP('localhost')


A zprávu odešleme. Druhým argumentem je seznam obsahující adresy všech příjemců.

s.sendmail('odesilatel@nekde.tld', ['prijemce@nekde.tld'], msg.as_string())


To je vše. Nyní už stačí jen uzavřít sezení.

s.quit()


Tím jsme odeslali e-mail na požadovanou adresu. Je ale dobré podotknout, že na počet odeslaných emailů bývá z důvodu spamu často omezení. Proto obvzlášť pokud plánujete použít k odesílání VPS, nedoporučuji odesílat příliš mnoho zpráv současně. Není žádná jasně vymezená hranice, kolik emailů odeslat, ale dokud to budete používat pouze jako upozornění, tak byste s tím neměli mít problém.

Pro dnešek je to vše, příště budeme v Mechanize používat TOR a ukážeme si další možnosti této knihovny.