Java 从看不见的邮件下载附件
我在java从事大学项目。我必须使用GMAIL API从新电子邮件下载附件 我使用OAuth 2.0授权成功连接到gmail帐户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 此外,我还尝试使用 下载工作如魅
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
}