2012-04-16 6 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

この行を変更してみてください。Python imaplib documentation shows just adding more search criteria

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

、およびthe IMAP specificationUNSEEN検索条件を定義します:に

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

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

NEWは機能しませんが、UNSEENだけで動作します。ありがとう。あなたの答えでNEWをUNSEENに変更するなら、私はそれを合格とマークします。そのような検索に基準を追加するだけでは不十分であることは私には分かりませんでした。 –

+0

@ウィリアム:優秀!聞いてうれしいです。 – sarnold

+0

こんにちは、私はGmailスクリプトを初めて使っています。このスクリプトはまだ動作していますか?その場合、どこで実行しますか? – Adam

関連する問題