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.