2014-01-29 11 views
5

Ich erstelle ein Tool, das Zugriff auf Mail-spezifische Ordner benötigt (z. B. "[Google Mail]/Papierkorb", "[Google Mail]/Gesendet"). Es scheint, dass die Namen in Bezug auf die Benutzerlokalisierungseinstellungen lokalisiert sind, so dass '[Gmail]/Papierkorb' beispielsweise für spanische Benutzer als '[Gmail]/Papelera' angezeigt wird.IMAP-Listenerweiterung JAVA

Ich lese über XLIST Befehl, aber jetzt ist veraltet zugunsten der IMAP LIST Extension (https://developers.google.com/gmail/imap_extensions#special-use_extension_of_the_list_command).

Ich habe versucht, es so javax.mail.Folder.list ("\ Trash") zu tun, aber nichts zurückgegeben wird.

Wie kann ich die IMAP-Listenerweiterung in JAVA verwenden?

PS: Verwenden mehrerer E-Mail-Anbieter, nicht nur Google Mail.

+0

Es ist möglich, dass die Java nicht oder analysieren Felder, die die Erweiterung nicht unterstützt. Kannst du den Befehl irgendwie manuell ausgeben? Oder verzweigen Sie die Javamail-Quelle, um die benötigte Unterstützung hinzuzufügen? – Max

Antwort

0

sollten Diese helfen:

Properties props = System.getProperties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    try { 
     Session session = Session.getDefaultInstance(props, null); 
     javax.mail.Store store = session.getStore("imaps"); 
     store.connect("imap.gmail.com", "[email protected]", "mypassword"); 
     javax.mail.Folder[] folders = store.getDefaultFolder().list("*"); 
     for (javax.mail.Folder folder : folders) { 
      if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) { 
       System.out.println("foldername->"+folder.getFullName() + " folder msg count->" + folder.getMessageCount()); 
      } 
     } 
    } catch (MessagingException e) { 
     e.printStackTrace(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
+1

Danke, aber das ist für Ordner zu erkunden, es ist keine Lösung für eine Trash-unabhängige Spracherkennung. – Ydrojen

+0

Nicht sicher, ob ich dich verstanden habe. Was meinst du mit Trash unabhängige Sprache. – aryann

+0

Im "alten Code" habe ich iteriert, um den Müll zu finden, wie Sie mir gegeben haben, aber jetzt habe ich mehrsprachige Unterstützung und Gmail Trash-Name ändert sich entsprechend den Spracheinstellungen des Benutzers, nicht genug zum Auffinden von Müll, weil anders aufgerufen werden kann . – Ydrojen

0

Sie sagen, Sie dies versucht:

javax.mail.Folder.list("\Trash") 

Versuchen ohne Schrägstrich:

javax.mail.Folder.list("Trash") 

Sehen Sie, wie es geht. Nun wird angenommen, dass der Ordner tatsächlich "Papierkorb" heißt. Wenn es in einer anderen Sprache lokalisiert ist, müssen Sie wahrscheinlich alle Ordner auflisten ("*"), sie nacheinander durchlaufen und den Ordner \ Trash finden. Ich bin mit JavaMail nicht sehr vertraut, daher weiß ich nicht, ob/wie es Ihnen die Ordnerattribute zurückgibt.

0

vielleicht können Sie überprüfen (Wenn Sie einen Ordner Ordner), wenn

if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) { 

und dann prüfen, ob Nachrichten im Ordner dieses Flag haben:

Flags.Flag.DELETED 

wenn ja, würde dies bedeuten, ist der Müll? Ich denke nicht, wenn eine msg gelöscht wird, wird sie in den Papierkorb verschoben oder sie kann im Ordner bleiben ... wenn sie verschoben wird, könnte das den Trick ausmachen.

+0

Nachrichten im Papierkorbordner sind normalerweise nicht markiert \ Gelöscht. Das ist eine Übergangsflagge, bevor sie ausgelöscht werden. – Max

0

Gmail no longer requires the use of the XLIST command. Google Mail gibt Attribute mit dem regulären IMAP LIST-Befehl zurück, die die Verwendung der lokalisierten Postfächer angeben. Sie können auf diese Attribute mit der Methode IMAPFolder.getAttributes zugreifen.

Ich fürchte, das hilft Ihnen nicht, wenn Sie einen anderen IMAP-Server haben, der diese Information nur mit XLIST zurückgibt.

4

Als Bill Shannon said, können Sie Google Mail-Attribute verwenden, um special folders wie Müll zu bekommen. Dies funktioniert jedoch nur mit Google Mail.

javax.mail.Folder[] folders = store.getDefaultFolder().list("*"); 

Wenn Sie diesen Druck, es wie folgt aus wie pro Gmail

a004 LIST "" "*" 
* LIST (\HasNoChildren) "/" "INBOX" 
* LIST (\Noselect \HasChildren) "/" "[Gmail]" 
* LIST (\HasNoChildren \All) "/" "[Gmail]/All Mail" 
* LIST (\HasNoChildren \Drafts) "/" "[Gmail]/Drafts" 
* LIST (\HasNoChildren \Important) "/" "[Gmail]/Important" 
* LIST (\HasNoChildren \Sent) "/" "[Gmail]/Sent Mail" 
* LIST (\HasNoChildren \Junk) "/" "[Gmail]/Spam" 
* LIST (\HasNoChildren \Flagged) "/" "[Gmail]/Starred" 
* LIST (\HasNoChildren \Trash) "/" "[Gmail]/Trash" 
a004 OK Success 

aussehen sollte Sobald Sie die Ordner mit Ihnen haben, können Sie für das Attribut iterieren Sie suchen.

Für [Gmail]/All Mail, mailFolder = "\\All".in ähnlicher Weise für [Gmail]/Trash wird es mailFolder = "\\Trash"

private static IMAPFolder getLocalisedFolder(IMAPStore store, String mailFolder) throws MessagingException { 
Folder[] folders = store.getDefaultFolder().list("*"); 
for (Folder folder : folders) { 
    IMAPFolder imapFolder = (IMAPFolder) folder; 
    for (String attribute : imapFolder.getAttributes()) { 
    if (mailFolder.equals(attribute)) { 
     return imapFolder; 
    } 
    } 
} 
return null; 
}