Работаю над университетским проектом в java. Мне нужно загрузить вложения из новых писем, используя GMAIL API .
Я успешно подключился к учетной записи Gmail, используя OAuth 2.0 авторизацию.
private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
Я пытался получать невидимые письма, используя
ListMessagesResponse listMessageResponse = service.users().messages().list(user).setQ("is:unseen").execute();
listMessageResponse is not null , но когда я вызываю метод .getResultSizeEstimate () , он возвращает 0 также я пытался преобразовать listMessageResponse в List (я думаю, это более удобно), используя
List<Message> list = listMessageResponse.getMessages();
Но список запускает NullPointerException
Затем попытался получить каждое вложение с помощью
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
}
}
}
Правильно ли мой подход (если не как его исправить) и как следует Я загружаю эти вложения.
РЕДАКТИРОВАТЬ 1:
Фиксированный параметр q , я по ошибке написал is: unseen вместо - это: непрочитанные . Теперь приложение успешно достигает непрочитанных писем. (Например, было два непрочитанных письма, и оба были успешно достигнуты, я могу легко получить их идентификаторы).
Теперь эта часть вызывает NullPointerException
List<MessagePart> part = m.getPayload().getParts();
Оба сообщения имеют вложения и m не null (я получаю идентификатор с .getID () )
Есть идеи, как преодолеть это и загрузить вложение?
РЕДАКТИРОВАТЬ 2:
Вложения Загружаемая часть
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
}
}
}
}
}
Загрузка работает как шарм, приложение протестировано с разными типами писем. Осталось только изменить ярлык непрочитанного сообщения (до которого дошло приложение) на чтение. Есть какие-нибудь советы, как это сделать?
И один крошечный вопрос: я хочу, чтобы это приложение получало почту каждые 10 минут с использованием абстрактного класса TimerTask. Есть ли необходимость в ручном "закрытии" соединения с gmail или это делается автоматически после завершения итерации метода run ()?
@Override
public void run(){
// Some fancy code
service.close(); // Something like that if even exists
}