2014-01-16 4 views
6

Я пишу код для чтения электронной почты из gmail. Поэтому при первом запуске он читает новые письма. Хорошо. Но я хочу, когда я запустил его во второй раз, он не получит те же электронные письма, что и раньше.Java получить непрочитанные письма

Например, если есть 3 непрочитанных письма, когда я запускаю их впервые, он получает 3. Но когда я запускаю снова, он ничего не получает (потому что у него уже есть 3). И если есть новое письмо, и я запускаю его снова, он должен получить только последний, а не 3 первых.

Надеюсь, что я достаточно ясен.

Я использую код из http://alvinalexander.com/java/javamail-search-unseen-unread-messages-mailbox-pop3

package javamailtests; 

import java.io.InputStream; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 
import javax.mail.search.*; 

public class JavaMailSearchInbox { 

    public static void main(String args[]) throws Exception { 

    // mail server info 
    String host = "pop.gmail.com"; 
    String user = "USER"; 
    String password = "PASS"; 

    // connect to my pop3 inbox in read-only mode 
    Properties properties = System.getProperties(); 
    Session session = Session.getDefaultInstance(properties); 
    Store store = session.getStore("pop3"); 
    store.connect(host, user, password); 
    Folder inbox = store.getFolder("inbox"); 
    inbox.open(Folder.READ_ONLY); 

    // search for all "unseen" messages 
    Flags seen = new Flags(Flags.Flag.SEEN); 
    FlagTerm unseenFlagTerm = new FlagTerm(seen, false); 
    Message messages[] = inbox.search(unseenFlagTerm); 

    if (messages.length == 0) System.out.println("No messages found."); 

    for (int i = 0; i < messages.length; i++) { 
     // stop after listing ten messages 
     if (i > 10) { 
     System.exit(0); 
     inbox.close(true); 
     store.close(); 
     } 

     System.out.println("Message " + (i + 1)); 
     System.out.println("From : " + messages[i].getFrom()[0]); 
     System.out.println("Subject : " + messages[i].getSubject()); 
     System.out.println("Sent Date : " + messages[i].getSentDate()); 
     System.out.println(); 
    } 

    inbox.close(true); 
    store.close(); 
    } 
} 
+1

@CarlPalsson No. Это вариант клиента. Это не является существенной особенностью POP3. Вы можете выбрать, остаются ли сообщения на сервере или удалены с сервера. Что действительно происходит, так это то, что клиент переходит к дополнительным проблемам для удаления сообщений, если вы выберете эту опцию. – EJP

+0

@ EJP Ahhh спасибо за разъяснение! – 8bitcat

+0

Получение почтовых сообщений Gmail с этого хоста будет сложным – Behe

ответ

0

Могу ли я предлагаю возвращение старых сообщений, которые читались на «Отметить как непрочитанное»?

+0

Да, но если я это сделаю, в следующий раз, когда я их прочитаю, я получу одинаковые сообщения? – user1700594

+0

Вы имеете в виду "mark as read"? если да, то как я могу узнать, прочитал ли мой клиент что-то или нет? Я имею в виду, например, пусть говорит thunderbird, как он знает на сервере, что является новым для него электронной почтой и старым? хранит ли он идентификатор или что-то локально, а затем проверяет сервер, с которого он должен начать? – user1700594

0
import java.util.*; 
import javax.mail.*; 

    public class ReadingEmail { 
    public static void main(String[] args) { 
    Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    try { 
     Session session = Session.getInstance(props, null); 
     Store store = session.getStore(); 
    store.connect("imap.gmail.com", "[email protected]", "Password"); 

     Folder inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_ONLY); 
     Message msg = inbox.getMessage(inbox.getMessageCount()); 
     Address[] in = msg.getFrom(); 
     for (Address address : in) { 
      System.out.println("FROM:" + address.toString()); 
     } 
     Multipart mp = (Multipart) msg.getContent(); 
     BodyPart bp = mp.getBodyPart(0); 
     System.out.println("SENT DATE:" + msg.getSentDate()); 
     System.out.println("SUBJECT:" + msg.getSubject()); 
     System.out.println("CONTENT:" + bp.getContent()); 
      } catch (Exception mex) 
     mex.printStackTrace(); 
        } 
      } 
     } 
1

Я только что сделал этот уродливый пример. И это сработало, оно извлекает все сообщения, в том числе те, которые были замечены.

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    Store store = App.session.getStore("imaps"); 
    store.connect("imap-mail.outlook.com", "email", "password"); 

    Folder folder = App.store.getFolder("Inbox"); 
    folder.open(Folder.READ_ONLY); 
    Message[] msgs = folder.getMessages(); 

    for (Message msg : msgs) { 
     System.out.println(msg.getSubject()); 
    } 
}catch(MessagingException e) { 
    System.out.println(e); 
} 

Конечно, вы должны будете правильно получить только письма, нужно, в противном случае, если у вас есть старая учетная запись электронной почты, этот код будет начать очень тяжелый процесс.

Я надеюсь, что это может быть полезно.

Смежные вопросы