Javamail mark gmail сообщение прочитано
Примечание: добавлено после ответа:
Спасибо.. Да, я попробовал флаг Flags.SEEN для true и saveChanges. Я также прочитал getContent, который он читал. Я попытался использовать его в инструкции for, которая проходит через сообщения. Но я снова получил сообщения из папки в следующем цикле. Я предполагал, что папка была вживую, поэтому хватала содержимое, а затем снова извлекала сообщения из папки с фильтром, чтобы не получить видимых результатов, но я все еще получал то же сообщение. Я мог бы попытаться закрыть папку и снова открыть ее в качестве теста, чтобы увидеть, отмечена ли она. Также, если я перейду к своему клиенту и нажимаю сообщение, тогда мой код перестает видеть его даже в цикле, поэтому я надеялся сделать то же самое в коде.
оригинал:
Я использую javamail для получения электронной почты из учетной записи gmail, она отлично работает, когда я получаю сообщение, которое я хотел бы пометить как прочитанное, может ли кто-нибудь дать мне какое-то направление? Вот мой текущий код:
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", eUserName, ePassWord);
// Get folder
Folder folder = store.getFolder("INBOX");
if (folder == null || !folder.exists()) {
return null;
}
folder.open(Folder.READ_ONLY);
// Only pull unread
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
Message messages[]; // = folder.search(ft);
for(int x = 0; x < timeOutInSeconds; x++) {
log.reportMessage("looking for emails");
try {
folder.getMessages();
messages = folder.search(ft);
if (messages.length > 0) {
for (Message message : messages) {
//log.reportMessage("found message: should not see again, marking read");
// want to mark as read
}
}
Thread.sleep(1000);
}
catch(Exception ex) {
}
}
// Close connection
folder.close(false);
store.close();
return null;
}
catch (NoSuchProviderException ex) {
return null;
}
catch (MessagingException ex) {
return null;
}
}
Ответы
Ответ 1
Прежде всего, вы не можете пометить сообщение как прочитанное, если используете сервер POP3 - протокол POP3 этого не поддерживает. Тем не менее, протокол IMAP v4 делает.
Вы можете подумать, что для этого нужно получить сообщение, установить для флага Flags.Flag.SEEN
значение true, а затем вызвать message.saveChanges()
. Как ни странно, это не так.
Вместо этого в Спецификации разработки API JavaMail, глава 4, раздел "Класс флагов" говорится, что флаг SEEN
неявно устанавливается при получении содержимого сообщения. Итак, чтобы пометить сообщение как прочитанное, вы можете использовать следующий код:
myImapFolder.open(Folder.READ_WRITE);
myImapFolder.getMessage(myMsgID).getContent();
myImapFolder.close(false);
Или другой способ - использовать конструктор копирования MimeMessage, т.е.
MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);
Когда вы создаете копию, флаг visible неявно устанавливается для сообщения, на которое ссылается источник.
Ответ 2
Один вкладыш, который сделает это БЕЗ загрузки всего сообщения:
одно сообщение:
folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);
все сообщения:
folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
Ответ 3
Ну, этот пост старый, но самое легкое решение еще не было опубликовано.
Вы получаете доступ к сообщению.
message.setFlag(Flag.SEEN, true);
Ответ 4
Вы также можете рассмотреть наличие public static int max_message_number
и сохранение в нем message[i].getMessageNumber();
, как только вы прочтете сообщение. Затем перед чтением любого сообщения проверьте только max_message_number < message[i].getmessageNumber()
. Если true, то не печатайте это сообщение (как оно уже было прочитано)
Ответ 5
Если вы используете цикл for для чтения или проверки почты один за другим, код может быть следующим, чтобы пометить сообщение gmail как прочитанное:
Message[] unreadMessages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));
for (int q = 0; q < unreadMessages.length; q++) {
unreadMessages[q].setFlag(Flag.SEEN, true);
}
Что делает этот код, так это то, что он делает его непрочитанным по одному.
И также папка/входящий код должен быть READ_WRITE, а не READ_ONLY:
folder.open(Folder.READ_WRITE);
Ответ 6
for (Message message : messages) {
message.setFlag(Flags.Flag.SEEN,true);
}
и измените нижнюю строку
folder.open(Folder.READ_ONLY);
к этому
folder.open(Folder.READ_WRITE);
Ответ 7
message.setFlag(Flag.SEEN, true) дает "не может найти символ"
message.setFlag(Flags.Flag.SEEN, true) кажется хорошим.
Ответ 8
Самый простой способ сделать это установить папку для чтения или записи в или из. Значит, как это...
Folder inbox = null;
inbox.open(Folder.READ_WRITE);
класс Folder должен быть импортирован.
Ответ 9
Вы также можете попробовать
зайдите в настройки Gmail> Переадресация и POP/IMAP
в раскрывающемся списке " Когда к сообщениям обращаются с помощью POP", выберите "Копировать Gmail" как "прочитанные" и сохраните изменения.