【问题标题】:Get sender mail in gmail-api在 gmail-api 中获取发件人邮件
【发布时间】:2016-01-08 05:56:16
【问题描述】:

我正在尝试通过 gmail-api 开发人员指南弄清楚它。gmail-api 中的消息部分不包含有关发件人的任何详细信息,感谢任何帮助。

【问题讨论】:

  • 我检索到 HTML 格式的邮件,但仍然没有发件人邮件的详细信息
  • 只需要一个关于在哪里看的指南我通过这个链接stackoverflow.com/questions/24781501/… 但不知道如何循环通过 android 中的标题我是新手
  • 我尝试搜索“来自:”,但没有
  • 同时查找“X-Original-Sender”标头。

标签: android gmail-api


【解决方案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】:

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

    header 的格式为 header=[name:"somename" value:"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;
        }
    
    
    
    }
    

    【讨论】:

      【解决方案3】:

      假设您已经使用 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;
          }
      

      【讨论】:

        【解决方案4】:

        从文档中我们可以知道 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")
        

        【讨论】:

          猜你喜欢
          • 2016-12-23
          • 2014-09-07
          • 2020-09-04
          • 2021-04-27
          • 2019-04-19
          • 1970-01-01
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多