在gmail-api中获取发件人邮件

时间:2015-10-10 09:45:18

标签: android gmail-api

我想通过gmail-api开发人员指南来解决这个问题.gmail-api中的消息部分不包含任何关于发件人的详细信息任何帮助表示感谢。

4 个答案:

答案 0 :(得分:4)

  

好的,我终于做到了。获取消息有效负载,然后从有效负载循环中获取标题,通过标题为"来自"

     标题的格式为header = [name:" somename"值:" someValue中"]

     

这是我的代码希望它可以帮助某人

private List<MessageReader> getDataFromApi() throws IOException {
            String user = "me";
            List<MessageReader> labels = new ArrayList<MessageReader>();
            ListMessagesResponse listResponse = mActivity.mService.users().messages().list(user).setQ(query).execute();
            //int i=0;
            for (Message label : listResponse.getMessages()) {
                Message m =  mActivity.mService.users().messages().get(user, label.getId()).execute();
                String a =""; 
                try{
                    List<MessagePart> parts  =m.getPayload().getParts();
                    List<MessagePartHeader> headers = m.getPayload().getHeaders();
                    MessageReader mreader = readParts(parts);
                    mreader.setDate(m.getInternalDate());
                    for(MessagePartHeader header:headers){
                        String name = 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){
        MessageReader mreader = new MessageReader();
        int cnt =0;
        for(MessagePart part:parts){

            try{

                String mime = part.getMimeType();           
                if(mime.contentEquals("text/plain")){
                    String s = new String(Base64.decodeBase64(part.getBody().getData().getBytes()));
                    mreader.setText(s);
                }else if(mime.contentEquals("text/html")){
                    String s = new String(Base64.decodeBase64(part.getBody().getData().getBytes()));
                    mreader.setHtml(s);

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

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

            }

        }
        return mreader;
    }





public class MessageReader {

    private String text;
    private String html;
    int no_of_files;
    private String sender;
    private long date;
    // file data to be made


    public String getSender() {
        return sender;
    }
    public void setSender(String sender) {
        this.sender = sender;
    }
    public long getDate() {
        return date;
    }

    public void setDate(long date) {
        this.date = date;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public String getHtml() {
        return html;
    }
    public void setHtml(String html) {
        this.html = html;
    }
    public int getNo_of_files() {
        return no_of_files;
    }
    public void setNo_of_files(int no_of_files) {
        this.no_of_files = no_of_files;
    }



}

答案 1 :(得分:1)

您可以先list messages获取id条消息。

请求:

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

<强>响应:

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

然后,您可以通过getting the actual message在第二个请求中询问这些邮件的发件人。

请求:

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

<强>响应:

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

答案 2 :(得分:0)

假设您已使用ListMessagesResponse获取了消息ID, 这是你如何获得发件人,即从字段:

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

答案 3 :(得分:0)

从文档中我们可以知道 Users.messages 将为我们提供具有以下属性的消息

{
  "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
}

从以上属性中,我们可以使用payload.headers[]来了解发件人邮件。 payload.headers[]将包含格式为{"name":string , "value":string}的字典数组。要获取发件人的邮件,我们必须使用name == 'From'查找字典,其相应的value将给我们发件人的邮件

我附上我的python代码以供参考

    #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 in range(len(msg_headers)):       
            if msg_headers[k]['name'] == 'From':
                print(msg_headers[k]['value'])
                print("\n")