Die JavaMail API (Teil 2)

Steht die Verbindung zum Server, kann der Client eine Mailbox öffnen. Wir deklarieren dazu eine openPop3InboxReadOnly() und closeInbox() Methode.

com/tutego/insel/mail/MailUtils.java, Teil 2

public static Folder openPop3InboxReadOnly( Session session )

throws MessagingException

{

Store store = session.getStore( "pop3" );

store.connect();

Folder folder = store.getFolder( "INBOX" );

folder.open( Folder.READ_ONLY );

return folder;

}

public static void closeInbox( Folder folder ) throws MessagingException

{

folder.close( false );

folder.getStore().close();

}

Die Rückgabe von openPop3InboxRealOnly() ist ein Folder-Objekt und mit diesem lassen sich letztendlich die E-Mails abrufen:

com/tutego/insel/mail/MailUtils.java, Teil 3

public static void printAllTextPlainMessages( Folder folder )

throws MessagingException, IOException

{

for ( Message m : folder.getMessages() )

{

System.out.println( "\nNachricht:" );

System.out.println( "Von: " + Arrays.toString(m.getFrom()) );

System.out.println( "Betreff: " + m.getSubject() );

System.out.println( "Gesendet am: " + m.getSentDate() );

System.out.println( "Content-Type: " +

new ContentType( m.getContentType() ) );

if ( m.isMimeType( "text/plain" ) )

System.out.println( m.getContent() );

}

}

Die Implementierung holt sich mit getContent() den kompletten Inhalt, aber natürlich lässt sich der auch über einen Eingabestrom holen.

Ein kleines Demo dazu, was erst Verbindung mit dem Google Mail Server herstellt, dann sich den INPUT-Ordner öffnet und alle E-Mails abläuft. Die Nachrichten werden nicht vom Server gelöscht.

com/tutego/insel/mail/PrintAllMailsWithMailUtils.java, main()

Session session = MailUtils.getGMailSession(

JOptionPane.showInputDialog( "user" ),

JOptionPane.showInputDialog( "pass" ) );

Folder inbox = MailUtils.openPop3InboxReadOnly( session );

MailUtils.printAllTextPlainMessages( inbox );

MailUtils.closeInbox( inbox );

Das Programm öffnet zwei Dialoge, einen für den Benutzernamen und einen für das Passwort, es ist jedem selbst überlassen, hier feste Strings einzukodieren.

Hinweis

Um herauszufinden, ob überhaupt Nachrichten auf dem Server vorliegen, können wir auf dem aktuellen folder-Objekt die Methode getMessageCount() nutzen.

Nachricht löschen

Um eine Nachricht vom Server zu löschen, darf der Ordner nicht mit READ_ONLY geöffnet werden, sondern mit Folder.READ_WRITE. Anschließend lässt sich einer Nachricht, repräsentiert durch ein Message-Objekt, mit setFlag() ein Lösch-Hinweis geben:

message.setFlag( Flags.Flag.DELETED, true );

Die Daten werden jedoch nur dann vom Server gelöscht, wenn zum Schluss folder.close(true) aufgerufen wird. Ohne den Aufruf von close() mit dem Argument true bleiben die Nachrichten erhalten.

Ähnliche Beiträge

Ein Gedanke zu “Die JavaMail API (Teil 2)

  1. Hey Leute,

    ich möchte Nachrichten von einem Mail Server via IMAP abrufen und anzeigen. Das Programm (client) soll dann den push-modus des Servers aktivieren und über neue Nachrichten informiert werden. Die bereits abgerufenene Nachrichten sollen jedoch erst als gelesen markiert werden, wenn sie bei mir auf dem Rechner in einer DB zwischengespeichert wurden. Hierzu sollen nach der Persistierung die jeweiligen Nachrichten via unique id gefunden und das DELETED flag auf true gesetzt werden.
    Problem an der Sache ist folgendes:
    Ich öffne den inbox Folder in READ_WRITE Modus, rufe die Nachrichten ab und dann sind sie als gelesen markiert. Ich würde dich Nachrichten aber gerne solange als ungelesen lassen, bis die Nachricht auch wirklich in meiner Datenbank persistiert wurde.

    Das SEEN flag wird anscheinend automatisch auf true gesetzt, sobal der Folder in WRITE_READ geöffnet wird und die jewilige Nachricht abgerufen wird.
    Gibt es eine Möglichkeit, das SEEN Flag einer jeden Nachricht oder des gesamten Nachrichtenarrays am Ende, nachdem die Nachrichten aus dem Account abgerufen wurden wieder auf false zusetzen, sodass die Nachrichten bei nächsten mal auch wieder als ungelesen markiert sind?

    Hab da schon mit Methoden wie,

    this.inbox.setFlags(this.getMessages(),new Flags(Flags.Flag.SEEN), false);

    rumprobiert, aber irgendie übernimmt der Server das nicht, die Nachrichten sind nach dem ersten Abrufen dann immer als gelesen markiert.

    Wäre super, wenn mir jemand weiterhelfen könnte.

    Vielen Dank schon mal.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert