Dostęp do kont GMail z poziomu Pythona

Przegląd rozwiązań umożliwiających dostęp do skrzynki pocztowej GMail

Ten artykuł został oznaczony jako przestarzały i zawarte w nim informacje mogą być już nieaktualne.

GMail to popularne skrzynki mailowe, dostępne także w różnych serwisach jak gazeta.pl, fotka.pl. Dostęp do tych kont nie różni się od dostępu do każdej innej skrzynki pocztowej, choć powstało kilka projektów zapewniających łatwiejszy dostęp do zgromadzonych tam danych.

libgmail umożliwia dostęp do konta GMail bez stosowania protokołu POP3 czy IMAP, lecz ma problemy z obsługą kont GMail w innych domenach. Oto prosty przykład:

import libgmail

ga = libgmail.GmailAccount("LOGIN", "HASŁO")
ga.login()
folder = ga.getMessagesByFolder('inbox')

for thread in folder:
  print thread.id, len(thread), thread.subject
  for msg in thread:
    print "  ", msg.id, msg.number, msg.subject
    print msg.source

Dostępna w Pythonie biblioteki poplib może połączyć się z kontem GMAIL jeżeli włączona została na nim obsługa POP3:

import poplib
import email

M = poplib.POP3_SSL('pop.gmail.com')
M.user('LOGIN@DOMENA')
M.pass_('HASŁO')
numMessages = len(M.list()[1])
for i in range(numMessages):
	print M.retr(i+1)[1]
Powyższy przykład wyświetli surowe wiadomości (bez parsowania załączników itp.). Do parsowania wiadomości Email można użyć standardowego modułu "email":
import poplib
import email

M = poplib.POP3_SSL('pop.gmail.com')
M.user('LOGIN@DOMENA')
M.pass_('HASŁO')
numMessages = len(M.list()[1])
for i in range(numMessages):
	z = '
'.join(M.retr(i+1)[1])
	m = email.message_from_string(z)
	# elementy wiadomości
	at =  m.get_payload()
	for a in at:
		try:
			file = a.get_filename()
		except:
			pass
		else:
			print 'Załącznik %s' % file
			# treść załącznika
			print a.get_payload(decode=True)

Moduł Pythona imaplib także może zostać wykorzystany, wystarczy włączyć w GMAILu obsługę protokołu IMAP:

import imaplib
from re import findall

M = imaplib.IMAP4_SSL('imap.gmail.com')
M.login('LOGIN@DOMENA', 'HASLO')
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print 'Message %s
%s
' % (num, data[0][1])
M.close()
M.logout()

blog comments powered by Disqus

Kategorie

Strony