Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to retrieve gmail messages from any folder other than inbox (Python3 issue)

Tags:

Update: my code works under python 2.6.5 but not python 3 (I'm using 3.4.1).

I'm unable to search for messages in the "All Mail" or "Sent Mail" folders - I get an exception:

imaplib.error: SELECT command error: BAD [b'Could not parse command'] 

my code:

import imaplib m = imaplib.IMAP4_SSL("imap.gmail.com", 993) m.login("[email protected]","mypassword") m.select("[Gmail]/All Mail") 

using m.select("[Gmail]/Sent Mail") doesn't work either.

But reading from the inbox works:

import imaplib m = imaplib.IMAP4_SSL("imap.gmail.com", 993) m.login("[email protected]","mypassword") m.select("inbox") ... 

I used the mail.list() command to verify the folder names are correct:

b'(\\HasNoChildren) "/" "INBOX"',  b'(\\Noselect \\HasChildren) "/" "[Gmail]"', b'(\\HasNoChildren \\All) "/" "[Gmail]/All Mail"',  b'(\\HasNoChildren \\Drafts) "/" "[Gmail]/Drafts"',  b'(\\HasNoChildren \\Important) "/" "[Gmail]/Important"',  b'(\\HasNoChildren \\Sent) "/" "[Gmail]/Sent Mail"',  b'(\\HasNoChildren \\Junk) "/" "[Gmail]/Spam"',  b'(\\HasNoChildren \\Flagged) "/" "[Gmail]/Starred"',  b'(\\HasNoChildren \\Trash) "/" "[Gmail]/Trash"' 

I'm following the solutions from these questions, but they don't work for me:
imaplib - What is the correct folder name for Archive/All Mail in Gmail?

I cannot search sent emails in Gmail with Python

Here is a complete sample program that doesn't work on Python 3:

import imaplib import email  m = imaplib.IMAP4_SSL("imap.gmail.com", 993) m.login("[email protected]","mypassword") m.select("[Gmail]/All Mail")  result, data = m.uid('search', None, "ALL") # search all email and return uids if result == 'OK':     for num in data[0].split():         result, data = m.uid('fetch', num, '(RFC822)')         if result == 'OK':             email_message = email.message_from_bytes(data[0][1])    # raw email text including headers             print('From:' + email_message['From'])  m.close() m.logout() 

The following exception is thrown:

Traceback (most recent call last): File "./eport3.py", line 9, in <module> m.select("[Gmail]/All Mail") File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 682, in select typ, dat = self._simple_command(name, mailbox) File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 1134, in _simple_command return self._command_complete(name, self._command(name, *args)) File "/RVM/lib/python3/lib/python3.4/imaplib.py", line 965, in _command_complete raise self.error('%s command error: %s %s' % (name, typ, data)) imaplib.error: SELECT command error: BAD [b'Could not parse command'] 

Here's the corresponding Python 2 version that works:

import imaplib import email  m = imaplib.IMAP4_SSL("imap.gmail.com", 993) m.login("[email protected]","mypassword") m.select("[Gmail]/All Mail")  result, data = m.uid('search', None, "ALL") # search all email and return uids if result == 'OK':     for num in data[0].split():         result, data = m.uid('fetch', num, '(RFC822)')         if result == 'OK':             email_message = email.message_from_string(data[0][1])    # raw email text including headers             print 'From:' + email_message['From']  m.close() m.logout() 
like image 332
Randy Dellinger Avatar asked Aug 07 '14 15:08

Randy Dellinger


1 Answers

As it's mentioned in this answer:

Try using m.select('"[Gmail]/All Mail"'), so that the double quotes get transmitted. I suspect imaplib is not properly quoting the string, so the server gets what looks like two arguments: [Gmail]/All, and Mail.

And it works in python v3.4.1

import imaplib import email  m = imaplib.IMAP4_SSL("imap.gmail.com", 993) m.login("[email protected]","mypassword") m.select('"[Gmail]/All Mail"')  result, data = m.uid('search', None, "ALL") # search all email and return uids if result == 'OK':     for num in data[0].split():     result, data = m.uid('fetch', num, '(RFC822)')     if result == 'OK':         email_message = email.message_from_bytes(data[0][1])    # raw email text including headers         print('From:' + email_message['From'])  m.close() m.logout() 
like image 168
Ben Avatar answered Oct 10 '22 06:10

Ben