# javax.mail MessageCount



## Paul1896 (4. Sep 2012)

Guten Tag,

ich hoffe ihr könnt mir helfen. Ich möchte auf einige Postfächer zugreifen und mir die die aktuelle Anzahl der Mails ausgeben lassen. Ich bin noch ziemlicher Anfänger in Java, aber möchte es trotzdem mit eurer Hilfe schaffen.

Hier ist einmal mein bisheriger Code:

[Java] 
import java.util.*;
import java.io.*;
import javax.mail.*;
public class getAnzahl
{
  public static void getMessageCount( final String host, final String user, final String passwd )
    throws Exception
  {
    Session session = Session.getDefaultInstance( new Properties() );
    Store store = session.getStore( "pop3" );
    store.connect( host, user, passwd );
    Folder folder = store.getFolder( "INBOX" );
    folder.open( Folder.READ_ONLY );
    Message[] message = folder.getMessages();
    for ( int i = 0; i < message.length; i++ )

  folder.close( false );
  store.close();
  }
  public static void main( String[] args ) throws Exception
  {
	getMessageCount( "host","Benutzer", "passwd" );
  }
  System.out.println(getMessageCount)
}
[/code]

Bin gerade etwas ratlos, wie es jetzt weitergehen soll. Könntet ihr mir irgendwelche Anregungen liefern bzw. Tipps wie ich weitermachen soll.

Danke!


----------



## SlaterB (4. Sep 2012)

die Länge des message-Arrays anschauen? machst du für die Schleife ja eh schon,
oder direkt getMessageCount() von Folder verwenden

weißt du die Namen aller Folder? anscheinend hierarchisch aufgebaut, der root-Folder liefert auch weitere, evtl. alle durcharbeiten usw.

Arbeit, Arbeit, Arbeit, ein konkretes Problem wäre leichter zu beantworten als nur 'was könnte ich jetzt noch machen?'


----------



## Paul1896 (4. Sep 2012)

SlaterB hat gesagt.:


> die Länge des message-Arrays anschauen? machst du für die Schleife ja eh schon,
> oder direkt getMessageCount() von Folder verwenden
> 
> weißt du die Namen aller Folder? anscheinend hierarchisch aufgebaut, der root-Folder liefert auch weitere, evtl. alle durcharbeiten usw.
> ...



Hallo habe jetzt die Methode getMessageCount direkt in die Folder eingebaut. Dann bräuchte ich eignetlich nicht mehr die Schleife oder? Hoffe habe das richtig verstanden.

Es sind alles root-Folder. Es sind mehrere Root-Postfächer. Es geht aber auch erst mal nur darum das es auf einem Postfach richtig läuft, dann würde ich es anapssen. Irgendwie stehe ich gerade auf dem Sclauch, wie ich weitermache und was noch fehlt. Bin bei Java nicht so bewandert.


----------



## SlaterB (4. Sep 2012)

> Dann bräuchte ich eignetlich nicht mehr die Schleife oder?
genau

der Weg ist immer sich anzuschauen was schon funktioniert, wo es hakt,

ganz zu Beginn schreibe nur eine Zeile (neben Standard wie main-Methode):
System.out.println("Hello World");
funktionierts? wäre ein guter Anfang?

was willst du haben? das steht noch vor dem prüfen was funktioniert, 
eine Ausgabe "Anzahl = .. "?
dann baue das Programm so dass es erstmal "Anzahl = 0" erfolgreich ausgibt,
aus dem obigen Code sieht Zeile 24 verdächtig komisch außerhalb einer Methode aus,

wenn "Anzahl = 0" erfolgreich ausgegeben wird, ersetze 0 durch eine Variable,
sorge dafür dass die Variable befüllt wird, z.B. mit deiner Methode,
dann fällt auf dass die keinen Rückgabewert hat, allerdings könnte die Ausgabe auch darin erfolgen,

in die Variable muss irgendwie das getMessageCount() von Folder,
wenn die Anzahl stimmt dann fertig, sonst vielleicht weitere Folder zu holen und zu addieren usw.

alles simple Schritte, da kommst du auch jeweils selber drauf,
dagegen sind die bisherigen Codezeilen doch auch nicht leichter


----------



## Paul1896 (5. Sep 2012)

So habe jetzt bisschen dran rumgeschraubt.

Bei dem Verbindungsaufbau kommt jetzt die Fehlermeldung:

Exception in thread "main" javax.mail.AuthenticationFailedException: Command is not valid in this state.
	at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:208)
	at javax.mail.Service.connect(Service.java:295)
	at javax.mail.Service.connect(Service.java:176)
	at getAnzahl.getMessageCount(getAnzahl.java:34)
	at getAnzahl.main(getAnzahl.java:20)

Kann mir da wer weiterhelfen, was die Fehlermeldung aussagen soll?

Hier nochmal mein Code:


```
import java.util.*;

import java.io.*;

import javax.mail.*;

public class getAnzahl

{

final static String host = "host";

final static String user = "user";

final static String passwd = "passwd";


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

	getMessageCount(host, user, passwd);

}



public static void getMessageCount( final String host, final String user, final String passwd ) throws Exception

        {

        Session session = Session.getDefaultInstance( new Properties() );

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

        store.connect( host, user, passwd );

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

        folder.open( Folder.READ_ONLY );

        int message = folder.getMessageCount(); 

        folder.close( false );

        store.close();

        System.out.println(message);

        }

}
```


----------



## Paul1896 (6. Sep 2012)

Will nicht nerven, aber es muss doch wer wissen was die Fehlermeldung genau aussagt. Google gibt leider nichts her


----------



## Bernd Hohmann (6. Sep 2012)

Was ist das für ein Mailserver auf der anderen Seite? Klingt nach einer Exchange Büchse bei der Plain-Auth für POP3 abgeschaltet wurde. Die Meldung ""command is not valid in this state" kommt imho nicht aus java.mailx.*

Bernd


----------



## Paul1896 (6. Sep 2012)

Jap, das ist es. Wie könnte ich den sonst darauf zugreifen?


----------



## Bernd Hohmann (6. Sep 2012)

Entweder PlainAuth am Exchange einschalten (google: "command is not valid in this state" exchange) oder herausfinden, welche POP3 Authentifizierungsmöglichkeiten der jeweilige Server untertützt und das in der Mail-API einschalten (google: javamail pop3 authentication example

Ich habs noch nie gebraucht, daher hab ich auch keine Ahnung wie der Authenticator dort arbeitet.

Bernd


----------



## SlaterB (6. Sep 2012)

lieber unnötig nachgefragt als dann doch vergessen:
den ersten google-Link
100004 - Mail Fetching Troubleshooting

mit


> c. Error when encrypted mode is enabled on POP in the mail server.
> 
> Cause:
> 
> ...


berücksichtigt?


----------



## Paul1896 (6. Sep 2012)

So, habe es jetzt hingekriegt. Habe es jetzt mit enem anderen Postfach ausprobiert und da funzt jetzt alles.

Vielen Dank für eure Hilfe!

Edit: Habt ihr noch irgendwleche Verbesserung- oder Tuningvorschläge?


```
import java.util.*;

import java.io.*;

import javax.mail.*;

public class getAnzahl

{

final static String host = "host";

final static String user = "user";

final static String passwd = "password";



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

	String Message = getMessageCount(host, user, passwd);
	System.out.println(Message);

}



public static String getMessageCount( final String host, final String user, final String passwd ) throws Exception

        {

        Session session = Session.getDefaultInstance( new Properties() );

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

        store.connect( host, user, passwd );

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

        folder.open( Folder.READ_ONLY );

        int message = folder.getMessageCount(); 
       
        folder.close( false );

        store.close();
     
        return(message + " ");
}
```


----------



## stone71 (7. Sep 2012)

Also für den Start ist dies schon einmal ok...
Änderungen machen hier noch viele Sinn, allerdings stellt sich die Frage, was Du wirklich erreichen möchtest!?
Zuerst einmal macht es Sinn das Öffnen und Schliessen der Verbindung in eigenständigen Methoden zu verwalten. Momentan ist es auch so, dass in einem Fehlerfall die Exception geworfen wird, allerdings was passiert mit der Connection?

Beim prüfen solcher Ordner macht nicht immer nur die Anzahl der Mail Sinn, sondern es gibt noch viele weitere Infos, die abgerufen werden können.

So ist auch die Frage, ob immer nur ein Ordner geprüft werden soll, wenn Du dies möchtest, dann würde ich den Foldernamen übergeben.
Willst Du alle Folder prüfen, dann macht eine Schleife Sinn???

Des Weiteren liefert Dir die Methode von JavaMail eine Zahl, wenn Du hier eine Meldung schreiben möchtest, dann vielleicht nicht mit dem return!

Gibt also noch ein paar Sachen, die man ändern könnte, dabei viel Spaß und wenn Du noch Fragen hast...


----------



## Pentalon (9. Sep 2012)

Ich hätte dieses Beispiel gerne nachvollzogen, jedoch sagt Eclips "javax.mail.*" cannot be resolved ;(
Was mache ich falsch ?

Pentalon


----------



## Bernd Hohmann (9. Sep 2012)

Du musst Dir erst das Paket besorgen und einbinden.

JavaMail API

Bernd


----------

