2014-01-16 4 views
6

Ich schreibe einen Code, um E-Mails von Google Mail zu lesen. Beim ersten Start liest es also neue E-Mails. Das ist gut. Aber ich möchte, wenn ich es ein zweites Mal starte, es bekommt nicht dieselben E-Mails, die es zuvor bekommen hat.Java erhalten ungelesene E-Mails

Zum Beispiel, wenn es 3 ungelesene E-Mails gibt, wenn ich zum ersten Mal starte, bekommt es die 3. Aber wenn ich wieder starte, bekommt es nichts (weil es schon 3 hat). Und wenn es eine neue E-Mail gibt und ich sie erneut starte, sollte sie nur die letzte und nicht die ersten 3 bekommen.

Ich hoffe, ich bin klar genug.

Ich verwende den Code aus 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 Nein. Das ist eine Client-Option. Dies ist kein wesentliches Merkmal von POP3. Sie können auswählen, ob Nachrichten auf dem Server verbleiben oder gelöscht werden. Was wirklich passiert, ist, dass der Client zusätzliche Probleme hat, die Nachrichten zu löschen, wenn Sie diese Option auswählen. – EJP

+0

@EJP Ahhh danke für die Klärung! – 8bitcat

+0

Das Abrufen von Gmail-E-Mails von diesem Host wird knifflig sein – Behe

Antwort

0

Darf ich die alten Nachrichten empfehlen Rückkehr, die auf „Als ungelesen markieren“ gelesen wurden?

+0

Ja, aber wenn ich das nächste Mal, wenn ich sie lese, bekomme ich die gleichen Nachrichten richtig? – user1700594

+0

Meinst du "als gelesen markieren"? Wenn ja, wie kann ich wissen, ob mein Kunde bereits etwas gelesen hat oder nicht? Ich meine zum Beispiel, sagen wir Thunderbird, woher weiß er auf dem Server, was ist eine neue E-Mail für ihn und was ist alt? speichert er eine ID oder etwas lokal und checkt dann auf dem Server von wo er anfangen soll? – 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

Ich habe gerade dieses hässliche Beispiel gemacht. Und es funktionierte, es ruft alle Nachrichten ab, einschließlich derjenigen, die gesehen wurden.

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); 
} 

Natürlich haben Sie richtig nur die E-Mails abzurufen, Sie benötigen, andernfalls, wenn Sie diesen Code ein altes E-Mail-Konto haben einen sehr schweren Prozess starten.

Ich hoffe, das könnte hilfreich sein.