How to retrieve the whole message body using Gmail API (python)

前端 未结 3 804
名媛妹妹
名媛妹妹 2020-12-16 05:34

I want to extract the whole message body of mail using gmail api. Right now i am using \'snippets\' but i need the entire text. I searched and found that it\'s something to

相关标签:
3条回答
  • 2020-12-16 05:47

    The gmail api docs provides sample code that showcases how to return the full message body as a message object structure. However, the code that they provided doesn't work for Python3. If you want to use to do this in Python3, you need to change their email.message_from_string() to email.message_from_bytes. Not sure exactly which module it was that changed this to make this issue happen, but the code below works just fine for me Python3.7.4

    import base64
    import email
    
    message = gmail_conn.users().messages().get(userId=u_id, id=m_id, format='raw').execute()
    msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
    mime_msg = email.message_from_bytes(msg_str)
    
    print(mime_msg)
    
    0 讨论(0)
  • 2020-12-16 05:48

    same as noogui said but I found that snippet wont return the whole body

    when the snippet exceed 200~ chars you will get it under payload.body.data you can find the whole body using payload.body.data

    the catch is that you are getting it base64encoded so you need to decode it :)

    the following code will do the trick

    import base64  
    mail = service.users().messages().get(userId=user_id, id=id, format="full").execute()
    
    def parse_msg(msg):
        if msg.get("payload").get("body").get("data"):
            return base64.urlsafe_b64decode(msg.get("payload").get("body").get("data").encode("ASCII")).decode("utf-8")
        return msg.get("snippet") 
    
    0 讨论(0)
  • 2020-12-16 06:04

    Use Users.messages.get from the docs where there's a Python snippet:

    import base64
    import email
    from apiclient import errors
    
    def GetMessage(service, user_id, msg_id):
    
      try:
        message = service.users().messages().get(userId=user_id, id=msg_id).execute()
        print 'Message snippet: %s' % message['snippet']
        return message
      except errors.HttpError, error:
        print 'An error occurred: %s' % error
    
    def GetMimeMessage(service, user_id, msg_id):
    
      try:
        message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
        print 'Message snippet: %s' % message['snippet']
        msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
        mime_msg = email.message_from_string(msg_str)
    
        return mime_msg
      except errors.HttpError, error:
        print 'An error occurred: %s' % error
    

    What your trying to access is the payload.body or if you want to go further, payload.body.data.

    0 讨论(0)
提交回复
热议问题