2009-06-04 10 views

risposta

54
import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com','993') 
obj.login('username','password') 
obj.select() 
obj.search(None,'UnSeen') 
+5

Mi piace molto questa soluzione. Generalmente pulito con una sola importazione. Per ottenere il numero desiderato: len (obj.search (None, 'UnSeen') [1] [0] .split()) –

+0

è possibile ottenere corpi di messaggi e soggetti con questa soluzione? – DataGreed

+1

@DataGreed: con la ricerca si ottiene solo l'ID della posta, ma è possibile utilizzarlo con "obj.fetch (..." per ottenere i messaggi desiderati. Vedere questo link per esempio su come farlo: http : //yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/ –

-1

Usa Gmail.py

file = open("filename","r") 
usr = file.readline() 
pwd = file.readline() 
gmail = GmailClient() 
gmail.login(usr, pwd) 
unreadMail = gmail.get_inbox_conversations(is_unread=True) 
print unreadMail 

Ottiene le informazioni di login da un file di testo assumendo il nome utente e la password sono su righe separate.

+4

ho controllato la fonte modulo, ciò che fa gmail aperto in modalità html e analizzare la pagina. Questo non va bene! http://www.holovaty.com/code/gmail.py –

+0

readline include una nuova riga finale, che non vuoi qui. –

+1

Nadia ha ragione. Ciò sprecherà tempo e larghezza di banda significativi. Misura –

25

io consiglio di utilizzare Gmail atom feed

E 'semplice come questo:

import urllib 

url = 'https://mail.google.com/mail/feed/atom/' 
opener = urllib.FancyURLopener() 
f = opener.open(url) 
feed = f.read() 

È quindi possibile utilizzare la funzione di avanzamento parse in questo bell'articolo: Check Gmail the pythonic way

+2

+1 bella soluzione che evita tutto il business imap/pop! –

+3

Cosa c'è di male in IMAP? Nota che questo frammento non è completo, nonostante il "semplice come questo". –

+0

Si noti inoltre che questa soluzione richiederà all'utente il nome utente e la password sul TTY. Tuttavia, puoi creare una sottoclasse di opener per gestirlo. –

1

Una volta effettuato l'accesso in (fai questo manualmente o con gmail.py) dovresti usare il feed.

E si trova qui: http://mail.google.com/mail/feed/atom

E 'il modo in cui Google fa. Questo è il link alla loro estensione js Chrome: http://dev.chromium.org/developers/design-documents/extensions/samples/gmail.zip

Sarete quindi in grado di analizzare XML che assomiglia a questo:

<?xml version="1.0" encoding="UTF-8"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#"> 
<title>Gmail - Inbox for [email protected]</title> 
<tagline>New messages in your Gmail Inbox</tagline> 
<fullcount>142</fullcount> 
24

Beh, ho intenzione di andare avanti e precisare un imaplib soluzione come suggeriva Cletus. Non vedo perché le persone sentano la necessità di usare gmail.py o Atom per questo. Questo tipo di cose è ciò per cui è stato progettato IMAP. Gmail.py è particolarmente eclatante in quanto effettivamente analizza l'HTML di Gmail. Potrebbe essere necessario per alcune cose, ma non per ottenere un conteggio dei messaggi!

import imaplib, re 
conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
conn.login(username, password) 
unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 

La pre-compilazione della regex può migliorare leggermente le prestazioni.

+1

Mentre sono d'accordo, IMAP è il modo per andare qui, ci sono alcuni problemi di portabilità che potrebbero verificarsi. Poiché gli altri metodi utilizzano connessioni HTTP, potrebbero funzionare quando IMAP no (in ambienti restrittivi come Google App Engine o reti in cui il traffico non HTTP è limitato). – Tom

+8

Tom, è vero. Ma il PO non ha detto che avevano a che fare con quei limiti, quindi non dovremmo inventarli prematuramente. –

7

Per una completa implementazione di leggere il valore dal feed atom:

import urllib2 
import base64 
from xml.dom.minidom import parse 

def gmail_unread_count(user, password): 
    """ 
     Takes a Gmail user name and password and returns the unread 
     messages count as an integer. 
    """ 
    # Build the authentication string 
    b64auth = base64.encodestring("%s:%s" % (user, password)) 
    auth = "Basic " + b64auth 

    # Build the request 
    req = urllib2.Request("https://mail.google.com/mail/feed/atom/") 
    req.add_header("Authorization", auth) 
    handle = urllib2.urlopen(req) 

    # Build an XML dom tree of the feed 
    dom = parse(handle) 
    handle.close() 

    # Get the "fullcount" xml object 
    count_obj = dom.getElementsByTagName("fullcount")[0] 
    # get its text and convert it to an integer 
    return int(count_obj.firstChild.wholeText) 
Problemi correlati