title: How to get emails received from gmail python?
body: <p>I want to get the last 10 received gmails with python.</p>
  <p>Currently I have this code but it only returns a limited number of emails and it manipulates pop3 directly, which makes it unnecessary long.</p>
  <p>Source of the code: <a href="https://www.code-learner.com/python-use-pop3-to-read-email-example/" rel="nofollow noreferrer">https://www.code-learner.com/python-use-pop3-to-read-email-example/</a></p>
  <pre><code>import poplib
  import smtplib, ssl
  def guess_charset(msg):
      # get charset from message object.
      charset = msg.get_charset()
      # if can not get charset
      if charset is None:
         # get message header content-type value and retrieve the charset from the value.
         content_type = msg.get('Content-Type', '').lower()
         pos = content_type.find('charset=')
         if pos &gt;= 0:
            charset = content_type[pos + 8:].strip()
      return charset
  
  def decode_str(s):
      value, charset = decode_header(s)[0]
      if charset:
         value = value.decode(charset)
      return value
  # variable indent_number is used to decide number of indent of each level in the mail multiple bory part.
  def print_info(msg, indent_number=0):
      if indent_number == 0:
         # loop to retrieve from, to, subject from email header.
         for header in ['From', 'To', 'Subject']:
             # get header value
             value = msg.get(header, '')
             if value:
                # for subject header.
                if header=='Subject':
                   # decode the subject value
                   value = decode_str(value)
                # for from and to header. 
                else:
                   # parse email address
                   hdr, addr = parseaddr(value)
                   # decode the name value.
                   name = decode_str(hdr)
                   value = u'%s &lt;%s&gt;' % (name, addr)
             print('%s%s: %s' % (' ' * indent_number, header, value))
      # if message has multiple part. 
      if (msg.is_multipart()):
         # get multiple parts from message body.
         parts = msg.get_payload()
         # loop for each part
         for n, part in enumerate(parts):
             print('%spart %s' % (' ' * indent_number, n))
             print('%s--------------------' % (' ' * indent_number))
             # print multiple part information by invoke print_info function recursively.
             print_info(part, indent_number + 1)
      # if not multiple part. 
      else:
          # get message content mime type
          content_type = msg.get_content_type() 
          # if plain text or html content type.
          if content_type=='text/plain' or content_type=='text/html':
             # get email content
             content = msg.get_payload(decode=True)
             # get content string charset
             charset = guess_charset(msg)
             # decode the content with charset if provided.
             if charset:
                content = content.decode(charset)
             print('%sText: %s' % (' ' * indent_number, content + '...'))
          else:
             print('%sAttachment: %s' % (' ' * indent_number, content_type))
  
  # input email address, password and pop3 server domain or ip address
  email = 'yourgmail@gmail.com'
  password = 'yourpassword'
  
  # connect to pop3 server:
  server = poplib.POP3_SSL('pop.gmail.com')
  # open debug switch to print debug information between client and pop3 server.
  server.set_debuglevel(1)
  # get pop3 server welcome message.
  pop3_server_welcome_msg = server.getwelcome().decode('utf-8')
  # print out the pop3 server welcome message.
  print(server.getwelcome().decode('utf-8'))
  
  # user account authentication
  server.user(email)
  server.pass_(password)
  
  # stat() function return email count and occupied disk size
  print('Messages: %s. Size: %s' % server.stat())
  # list() function return all email list
  resp, mails, octets = server.list()
  print(mails)
  
  # retrieve the newest email index number
  #index = len(mails)
  index = 3
  # server.retr function can get the contents of the email with index variable value index number.
  resp, lines, octets = server.retr(index)
  
  # lines stores each line of the original text of the message
  # so that you can get the original text of the entire message use the join function and lines variable. 
  msg_content = b'\r\n'.join(lines).decode('utf-8')
  # now parse out the email object.
  
  from email.parser import Parser
  from email.header import decode_header
  from email.utils import parseaddr
  
  import poplib
  
  # parse the email content to a message object.
  msg = Parser().parsestr(msg_content)
  print(len(msg_content))
  # get email from, to, subject attribute value.
  email_from = msg.get('From')
  email_to = msg.get('To')
  email_subject = msg.get('Subject')
  print('From ' + email_from)
  print('To ' + email_to)
  print('Subject ' + email_subject)
  for part in msg.walk():
      if part.get_content_type():
          body = part.get_payload(decode=True)
          print_info(msg, len(msg))
  
  
  # delete the email from pop3 server directly by email index.
  # server.dele(index)
  # close pop3 server connection.
  server.quit()
  </code></pre>
  <p>I also tried this code but it didn't work:</p>
  <pre><code>import imaplib, email, base64
  
  
  def fetch_messages(username, password):
      messages = []
      conn = imaplib.IMAP4_SSL(&quot;imap.gmail.com&quot;, 993)
      conn.login(username, password)
      conn.select()
      typ, data = conn.uid('search', None, 'ALL')
  
      for num in data[0].split():
          typ, msg_data = conn.uid('fetch', num, '(RFC822)')
          for response_part in msg_data:
              if isinstance(response_part, tuple):
                  messages.append(email.message_from_string(response_part[1]))
          typ, response = conn.store(num, '+FLAGS', r'(\Seen)')
      return messages
  </code></pre>
  <p>and this also didn't work for me...</p>
  <pre><code>import poplib
  from email import parser
  pop_conn = poplib.POP3_SSL('pop.gmail.com')
  pop_conn.user('@gmail.com')
  pop_conn.pass_('password')
  
  messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
  # Concat message pieces:
  messages = [&quot;\n&quot;.join(mssg[1]) for mssg in messages]
  #Parse message intom an email object:
  messages = [parser.Parser().parsestr(mssg) for mssg in messages]
  for message in messages:
      print(message['subject'])
      print(message['body'])
  </code></pre>