Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从看不见的邮件下载附件_Java_Google Api_Gmail_Gmail Api_Google Api Java Client - Fatal编程技术网

Java 从看不见的邮件下载附件

Java 从看不见的邮件下载附件,java,google-api,gmail,gmail-api,google-api-java-client,Java,Google Api,Gmail,Gmail Api,Google Api Java Client,我在java从事大学项目。我必须使用GMAIL API从新电子邮件下载附件 我使用OAuth 2.0授权成功连接到gmail帐户 private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY); listMessageResponse不是null,但是当我调用方法时,getResultSizeEstimate()它返回0 此外,我还尝试使用 下载工作如魅

我在java从事大学项目。我必须使用GMAIL API从新电子邮件下载附件

我使用OAuth 2.0授权成功连接到gmail帐户

private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
listMessageResponse不是null,但是当我调用方法时,getResultSizeEstimate()它返回0 此外,我还尝试使用

下载工作如魅力,测试应用程序与不同类型的电子邮件。 剩下的唯一一件事就是将未读邮件的标签(应用程序已访问)更改为“已读”。有什么建议吗

还有一个小问题: 我希望这个应用程序使用TimerTask抽象类每10分钟提取一次邮件。是否需要手动“关闭”与gmail的连接,或者在run()方法迭代结束后自动关闭

 @Override
 public void run(){

 // Some fancy code

 service.close(); // Something like that if even exists
 }

我认为
ListMessagesResponse
永远不会变为空。即使没有与您的查询匹配的消息,结果响应中至少会填充
resultSizeEstimate
:请参阅

我认为您使用的方法是正确的,只是没有与您的查询匹配的消息。事实上,我以前从来没有见过
is:unseen
。你是说
是:未读的

更新: 当仅使用每条消息的
id
threadId
时,将填充该消息,因此您无法访问消息
有效负载
。为了获得完整的消息资源,您必须使用
Users.messages:get
,正如您在参考链接中看到的:

请注意,每个消息资源仅包含一个id和一个线程id。可以使用该方法获取其他消息详细信息

因此,在本例中,在获取消息列表后,您必须遍历该列表,并对列表中的每条消息执行以下操作:

  • 通过获取消息
    id
  • 检索到消息
    id
    后,使用它调用并获取完整的消息资源。检索到的消息应该包含所有字段,包括有效负载,并且您应该能够访问相应的附件
代码示例:
List List=listMessageResponse.getMessages();
用于(消息m:列表){
Message Message=service.users().messages().get(user,m.getId()).execute();
List part=message.getPayload().getParts();
//代码的其余部分
}
参考:

您有一个名为unseen的自定义标签?记住响应不会为空,它总是会返回一个响应对象。你的自定义标签听起来似乎没有结果。我犯了一个愚蠢的错误,我想写未读的,但写了未看的。@BogosavCvetkovic我相应地更新了我的答案,请让我知道这是否适用于你。@BogosavCvetkovic自从你原来的问题解决后,我建议在你的当前问题发布一个新的问题,并且请考虑接受我提供的答案,因为这是在这样的用户之间共享知识的基础。当然,在发布新问题之前,请先研究一下标签变更的主题,只有在遇到无法解决的问题时才发布问题。这可能是你们开始研究标签变更的好地方。你们是对的,我犯了一个错误:看不见。我将用更多的新细节编辑这个问题。终于完成了,现在只剩下将消息标签从“未读”改为“已读”(不想再次阅读同一条消息)。用最新信息编辑的问题。
List<Message> list = listMessageResponse.getMessages();
for(Message m : list) {
            List<MessagePart> part = m.getPayload().getParts();
            for(MessagePart p: part) {
                if(p.getFilename()!=null && p.getFilename().length()>0) {
                    System.out.println(p.getFilename()); // Just to check attachment filename
                }
            }
        }
List<MessagePart> part = m.getPayload().getParts();
for(MessagePart p : parts) {

            if ((p.getFilename() != null && p.getFilename().length() > 0)) {
                String filename = p.getFilename();
                String attId = p.getBody().getAttachmentId();
                MessagePartBody attachPart;
                FileOutputStream fileOutFile = null;
                try { 
                   attachPart = service.users().messages().attachments().get("me", p.getPartId(), attId).execute();
                   byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());


                   fileOutFile = new FileOutputStream(filename); // Or any other dir
                   fileOutFile.write(fileByteArray);
                   fileOutFile.close();
                }catch (IOException e) {
                    System.out.println("IO Exception processing attachment: " + filename);
                } finally {
                   if (fileOutFile != null) {
                      try {
                         fileOutFile.close();
                      } catch (IOException e) {
                         // probably doesn't matter
                      }
                   }
                }
            }
        }
 @Override
 public void run(){

 // Some fancy code

 service.close(); // Something like that if even exists
 }