Zpět na seznam článků     Číst komentáře (4)     Verze pro tisk

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

Autor: Jakub Tětek   
2.4.2014

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:


Funkce testující, přítomnost nové zprávy ve schránce
  1. def isNewMail(address):
  2.    req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss") # stáhneme RSS feed
  3.    rss = req.read() # z objektu odpovedi dostaneme XML kód
  4.    if "" in rss: # pokud kód obsahuje string ''
  5.       return rss # vrátíme XML
  6.    else:
  7.       return False


Funkce čekající na příchod e-mailu
  1. def waitForMail(address):
  2.    received = False
  3.    while not received: # dokud nám nepřišel email, pokaždé
  4.       sleep(5) # počkáme pět sekund
  5.       received = isNewMail(address) # a zkontrolujeme zda už nepřišel
  6.    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.

  1. rss = waitForMail(address)


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

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


Najdeme v ní potvrzovací odkaz na Facebook.

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


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

  1. urllib2.urlopen(conLink)


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

  1. import urllib2
  2. import re
  3. from time import sleep
  4.  
  5. def isNewMail(address):
  6.    req = urllib2.urlopen("http://trashcanmail.com/en/mailbox/"+address+"/rss")
  7.    rss = req.read()
  8.    if "" in rss:
  9.       return rss
  10.    else:
  11.       return False
  12.  
  13. def waitForMail(address):
  14.    received = False
  15.    while not received:
  16.       sleep(5)
  17.       received = isNewMail(address)
  18.    return received
  19.  
  20. def confirmMail(address):
  21.    rss = waitForMail(address)
  22.    link = re.findall("\s*([^<]*)\s*", rss)[-1]
  23.    html = urllib2.urlopen(link).read()
  24.    conLink = re.search("https:\/\/www.facebook.com\/n\/\?confirmemail\.php[^<]*", html).group()
  25.    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.

  1. from email.mime.text import MIMEText
  2. import smtplib


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

  1. 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.

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


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

  1. s = smtplib.SMTP('localhost')


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

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


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

  1. 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.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.22/9

1  2  3  4  5    
(známkování jako ve škole)