Skip to content Skip to sidebar Skip to footer

Get Sender Mail In Gmail-api

I am trying to figure it out went through gmail-api developer guide.The message part in gmail-api does not contain any detail about sender any help is appreciated thanks.

Solution 1:

Ok I finally did it.Get message payload and then get headers from payload loop through the headers with name "from"

format of header is of the form header=[name:"somename" value:"somevalue"]

here is my code hope it helps someone

private List<MessageReader> getDataFromApi()throws IOException {
            Stringuser="me";
            List<MessageReader> labels = newArrayList<MessageReader>();
            ListMessagesResponselistResponse= mActivity.mService.users().messages().list(user).setQ(query).execute();
            //int i=0;for (Message label : listResponse.getMessages()) {
                Messagem=  mActivity.mService.users().messages().get(user, label.getId()).execute();
                Stringa=""; 
                try{
                    List<MessagePart> parts  =m.getPayload().getParts();
                    List<MessagePartHeader> headers = m.getPayload().getHeaders();
                    MessageReadermreader= readParts(parts);
                    mreader.setDate(m.getInternalDate());
                    for(MessagePartHeader header:headers){
                        Stringname= header.getName();
                        if(name.equals("From")||name.equals("from")){
                            mreader.setSender(header.getValue());
                            break;
                        }
                    }
                    labels.add(mreader);
                 }catch(Exception e){
                     a+="The following error occurred:\n" +
                                e.getMessage();
                    }

            }
            return labels;//extractData(labels);
        }


private MessageReader readParts(List<MessagePart> parts){
        MessageReadermreader=newMessageReader();
        intcnt=0;
        for(MessagePart part:parts){

            try{

                Stringmime= part.getMimeType();           
                if(mime.contentEquals("text/plain")){
                    Strings=newString(Base64.decodeBase64(part.getBody().getData().getBytes()));
                    mreader.setText(s);
                }elseif(mime.contentEquals("text/html")){
                    Strings=newString(Base64.decodeBase64(part.getBody().getData().getBytes()));
                    mreader.setHtml(s);

                }elseif(mime.contentEquals("multipart/alternative")){
                    List<MessagePart> subparts  =part.getParts();
                    MessageReadersubreader= readParts(subparts);
                    mreader.setText(subreader.getText());
                    mreader.setHtml(subreader.getHtml());
                }elseif(mime.contentEquals("application/octet-stream")){
                    cnt++;
                    mreader.setNo_of_files(cnt);
                }

            }catch(Exception e){
                // get file here

            }

        }
        return mreader;
    }





publicclassMessageReader {

    private String text;
    private String html;
    int no_of_files;
    private String sender;
    privatelong date;
    // file data to be madepublic String getSender() {
        return sender;
    }
    publicvoidsetSender(String sender) {
        this.sender = sender;
    }
    publiclonggetDate() {
        return date;
    }

    publicvoidsetDate(long date) {
        this.date = date;
    }
    public String getText() {
        return text;
    }
    publicvoidsetText(String text) {
        this.text = text;
    }
    public String getHtml() {
        return html;
    }
    publicvoidsetHtml(String html) {
        this.html = html;
    }
    publicintgetNo_of_files() {
        return no_of_files;
    }
    publicvoidsetNo_of_files(int no_of_files) {
        this.no_of_files = no_of_files;
    }



}

Solution 2:

You could first list messages, to get the id of messages.

Request:

GET https://www.googleapis.com/gmail/v1/users/me/messages

Response:

{
 "messages": [
    {
     "id": "1504f80fcf4ceb5f",
     "threadId": "1504f80fcf4ceb5f"
    }, ...
  ]
}

Then, you could ask for the sender of these messages in a second request, by getting the actual message.

Request:

format = metadata
metadataHeaders = From
fields = payload/headers

GET https://www.googleapis.com/gmail/v1/users/me/messages/1504f80fcf4ceb5f?format=metadata&metadataHeaders=From&fields=payload%2Fheaders

Response:

{
 "payload": {
  "headers": [
   {
    "name": "From",
    "value": "YouTube <noreply@youtube.com>"
   }
  ]
 }
}

Solution 3:

Assuming that you already got message id using ListMessagesResponse, here is how you can get sender, i.e. From field:

publicString getFrom(String userId, String messageId) throws IOException {
        Message message = mService.users().messages().get(userId, messageId).execute();
        List<MessagePartHeader> headers = message.getPayload().getHeaders();
        Stringfrom="";
        for (MessagePartHeader header:headers){
            if(header.getName().equals("From")){
                from=header.getValue();
                break;
            }
        }
        returnfrom;
    }

Solution 4:

From documentation we can know that Users.messages will give us the message with following properties

{
  "id": string,
  "threadId": string,
  "labelIds": [
    string
  ],
  "snippet": string,
  "historyId": unsigned long,
  "internalDate": long,
  "payload": {
    "partId": string,
    "mimeType": string,
    "filename": string,
    "headers": [
      {
        "name": string,
        "value": string
      }
    ],
    "body": users.messages.attachments Resource,
    "parts": [
      (MessagePart)
    ]
  },
  "sizeEstimate": integer,
  "raw": bytes
}

From the above properties we can use payload.headers[] to know the Sender mail. The payload.headers[] will contain array of dictionaries of form {"name":string , "value":string}. To get the sender's mail, we have to find the dictionary with name == 'From' and its corresponding value will give us the sender's mail

I am attaching my python code for reference

#Call the Gmail API#Before calling the API you have to create service using User credentials
    results = service.users().messages().list(userId='me',labelIds = ['INBOX']).execute()
    msgs = results.get('messages',[])
    for msg in msgs:
        mg = service.users().messages().get(userId='me', id=msg['id']).execute()
        msg_headers = mg['payload']['headers']
        for k inrange(len(msg_headers)):       
            if msg_headers[k]['name'] == 'From':
                print(msg_headers[k]['value'])
                print("\n")

Post a Comment for "Get Sender Mail In Gmail-api"