2012-04-16 3 views
4

У меня есть сценарий Python адаптирован из Downloading MMS emails sent to Gmail using PythonКак загрузить только непрочитанные вложения с определенной метки gmail?

import email, getpass, imaplib, os 

detach_dir = '.' # directory where to save attachments (default: current) 
user = raw_input("Enter your GMail username:") 
pwd = getpass.getpass("Enter your password: ") 

# connecting to the gmail imap server 
m = imaplib.IMAP4_SSL("imap.gmail.com") 
m.login(user,pwd) 
m.select("[Gmail]/All Mail") # here you a can choose a mail box like INBOX instead 
# use m.list() to get all the mailboxes 

resp, items = m.search(None, 'FROM', '"Impact Stats Script"') # you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp) 
items = items[0].split() # getting the mails id 

for emailid in items: 
    resp, data = m.fetch(emailid, "(RFC822)") # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you can ask for headers only, etc 
    email_body = data[0][1] # getting the mail content 
    mail = email.message_from_string(email_body) # parsing the mail content to get a mail object 

    #Check if any attachments at all 
    if mail.get_content_maintype() != 'multipart': 
     continue 

    print "["+mail["From"]+"] :" + mail["Subject"] 

    # we use walk to create a generator so we can iterate on the parts and forget about the recursive headach 
    for part in mail.walk(): 
     # multipart are just containers, so we skip them 
     if part.get_content_maintype() == 'multipart': 
      continue 

     # is this part an attachment ? 
     if part.get('Content-Disposition') is None: 
      continue 

     filename = part.get_filename() 
     counter = 1 

     # if there is no filename, we create one with a counter to avoid duplicates 
     if not filename: 
      filename = 'part-%03d%s' % (counter, 'bin') 
      counter += 1 

     att_path = os.path.join(detach_dir, filename) 

     #Check if its already there 
     if not os.path.isfile(att_path) : 
      # finally write the stuff 
      fp = open(att_path, 'wb') 
      fp.write(part.get_payload(decode=True)) 
      fp.close() 

Я фильтрация сообщений по теме и получать вложения, но теперь мне нужно получить только вложение от новых писем. Могу ли я изменить m.search(), чтобы вернуть только непрочитанные письма?

+0

Что это значит для присоединения к быть _new_? После отправки электронного письма вложения фиксированы ... – sarnold

+0

Я имею в виду новые письма с прикрепленными файлами. Я отредактирую вопрос. –

ответ

7

Попробуйте изменить эту строку:

resp, items = m.search(None, 'FROM', '"Impact Stats Script"') 

к:

resp, items = m.search(None, 'UNSEEN', 'FROM', '"Impact Stats Script"') 

Python imaplib documentation shows just adding more search criteria и the IMAP specification определяет критерии UNSEEN поиска:

UNSEEN 
    Messages that do not have the \Seen flag set. 
+1

NEW не работает, но просто UNSEEN сам по себе делает. Благодарю. Если вы измените NEW на UNSEEN в своем ответе, я пометю его как принятый. Мне было непонятно, какие критерии можно было бы просто добавить для поиска. –

+0

@William: Отлично! Рад слышать, как это работает. – sarnold

+0

Привет, я новичок в gmail-скриптах. Этот сценарий все еще работает, и если да, то где его выполнить? – Adam

Смежные вопросы