2011-07-07 9 views
12

Czy ktoś może mi pomóc dostosować istniejący przykład kodu?Pobierz konkretny e-mail z Gmaila za pomocą Python

Widzę z poniższego artykułu, jak połączyć się z Gmailem i pobierać treści, ale nie mogę wymyślić, jak wyszukać konkretny e-mail i pobrać tylko znacznik czasu i treść?

artykułu: How can I download all emails with attachments from Gmail?

I specjalnie chcą chwycić maile od „[email protected]” przez ostatnie 5 dni i pobierz godzinę wysłania i treść wiadomości e-mail. Następnie przeanalizuję to, aby określić, które wiadomości e-mail muszę użyć.

Jestem samoukiem i mam trudności z dostosowaniem powyższego skryptu, aby to zrobić.

Każda pomoc jest doceniana. Dzięki.

JD

+0

które [kryteriów wyszukiwania] (http://www.example-code.com/csharp/imap-search-critera.asp) próbowałeś do tej pory? – sarnold

+1

Nie zależy mi na Gmailu, ale na IMAP/POP, więc powinieneś to poszukać - z wyjątkiem tego, że jesteś selfkillerem i robisz to z klientem internetowym, p – tmg

Odpowiedz

15

Proponuję za pomocą IMAPClient jak to prace nad wieloma z bardziej ezoterycznych aspektów IMAP.

Poniższy fragment generuje komunikaty na podstawie podanych kryteriów, analizuje ciągi komunikatów na instancje email.message.Message i drukuje nagłówki Date i From.

from datetime import datetime, timedelta 
import email 
from imapclient import IMAPClient 

HOST = 'imap.gmail.com' 
USERNAME = 'username' 
PASSWORD = 'password' 
ssl = True 

today = datetime.today() 
cutoff = today - timedelta(days=5) 

## Connect, login and select the INBOX 
server = IMAPClient(HOST, use_uid=True, ssl=ssl) 
server.login(USERNAME, PASSWORD) 
select_info = server.select_folder('INBOX') 

## Search for relevant messages 
## see http://tools.ietf.org/html/rfc3501#section-6.4.5 
messages = server.search(
    ['FROM "[email protected]"', 'SINCE %s' % cutoff.strftime('%d-%b-%Y')]) 
response = server.fetch(messages, ['RFC822']) 

for msgid, data in response.iteritems(): 
    msg_string = data['RFC822'] 
    msg = email.message_from_string(msg_string) 
    print 'ID %d: From: %s Date: %s' % (msgid, msg['From'], msg['date']) 
+0

Dzięki Rob! Właśnie przeniesiłem to z Python2.6 do 2.7 i teraz dostaję następujący błąd podczas wywoływania message_from_string ... 'UnicodeEncodeError: kodek ASCII nie może kodować znaku u' \ xa0 'w pozycji 3041: porządkowy nie w zakresie (128) ". Czy muszę wykonać jakąś transformację na msg_String? I czytam w tym samym e-mailu, więc ładunek e-mail nie może być problemem. – jond

+0

Czy zaktualizowałeś IMAPClient do wersji 0.10 lub nowszej? Zachowanie zmieniło się w tym wydaniu; Funkcje teraz zwracają obiekty unicode (zobacz https://bitbucket.org/mjs0/imapclient/src/tip/NEWS.rst). Szczególną kwestią w tym przypadku jest nieprzestrzeganie przestrzeni. Możesz go bezpiecznie usunąć (prawdopodobnie) z .replace (u '\ xa0', u '') –

+0

Dzięki Rob! To wystarczyło. – jond

2
import imaplib 
from datetime import datetime, timedelta 

obj = imaplib.IMAP4_SSL('imap.gmail.com',993) 
obj.login('username','password') 
obj.select() 

today = datetime.today() 
cutoff = today - timedelta(days=5) 
dt = cutoff.strftime('%d-%b-%Y') 
typ, data = obj.search(None, '(SINCE %s) (FROM "[email protected]")'%(dt,)) 
print data 
Powiązane problemy