javamail: versch. Postfächer auslesen

Status
Nicht offen für weitere Antworten.

magic_halli

Bekanntes Mitglied
Hi,

ich lese in einem Programm hintereinander verschiedene IMAP-Postfächer aus. Nun habe ich ein seltsames Verhalten festgestellt, dass mir Rätsel aufgibt!
Mein Vorgehen:
1. Postfach A auslesen und Mailcontent´s etc. jeder Mail in A.xml speichern
2. Postfach B auslesen und Mailcontent´s etc. jeder Mail in B.xml speichern
3. Postfach C auslesen und Mailcontent´s etc. jeder Mail in C.xml speichern

Für 1.-3. gibt es jeweils eine eigene Funktion (die sich nur im Postfach-Login und Speicherpfad der XML-Datei unterscheiden), die alle nacheinander in der main() aufgerufen werden:

Code:
public static void main(String[] args)  throws Exception {
      getAnfragenMail();

      getReklamationenMail();

      getAuftragseingangMail();
}


private static void getAnfragenMail(){
   //Funktionalität
}

Eine Funktion einzeln für sich aufgerufen macht genau das, was sie soll. Jedoch so wie oben aufgerufen, macht nur die zuerst aufgerufe Funktion ihre Arbeit korrekt, die nachfolgenden machen nichts!!!
Ich hab jetzt schon den Code tausend mal durchgesehen - scheint alles korrekt zu sein.

Von der Abarbeitung her macht ja Funktion 2 und 3 erst los, wenn ihr jeweiliger Vorgänger seine Arbeit beendet hat?! Von daher, hab ich keine Ahnung, woran dieses Verhalten liegen könnte! :cry:

Ist vielleicht irgendwas an den Funktionsaufrufen in der main falsch (wäre die einzige Möglichkeit für mich)? ???:L :roll:
Hat jemand irgend eine Idee?

Danke und Gruß
 
Klingt, als ob hierbei eine Exception geworfen wird und anschließend die nachfolgenden Methoden (logischerweise) nicht mehr ausgeführt werden.
Versuch doch mal, die Exceptions in der main-Methode abzufangen und deren Stacktrace auszugeben. Im Moment wirft die main-Methode eine etwaige (Runtime)Exception einfach weiter.
 
magic_halli hat gesagt.:
Von der Abarbeitung her macht ja Funktion 2 und 3 erst los, wenn ihr jeweiliger Vorgänger seine Arbeit beendet hat?!

Das stimmt zwar schon, aber wenn in einer der Methoden (bzw. in allen) Threads gestartet werden laufen diese ja unabhängig von deiner Methode weiter. Und im Fall von JavaMail könnte ich mir gut vorstellen dass dort ein Runnable versteckt ist ...
 
magic_halli hat gesagt.:
Ist vielleicht irgendwas an den Funktionsaufrufen in der main falsch (wäre die einzige Möglichkeit für mich)? ???:L :roll:
Ich fürchte daran liegt es nicht.
Ich hätte noch folgende Ideen:
  • Die Methode gibt überhaupt nicht wieder zurück (wird das Programm hängt in der ersten Methode beendet)
  • Du verwendest irgendwelche statischen Variablen
  • Die hinteren beiden Methoden haben irgendeinen fuktionalen Fehler (irgend ein Wert nicht angepasst etc.)
In jedem Fall würde ich mal versuchen mit einem Debugger oder System.out den Ablauf nachzuvollziehen.
 
Ich habe das Problem soweit eingegrenzt, um sagen zu können, wo der Fehler (höchst wahrscheinlich) liegt. Nur warum das so ist und wie ich´s beheben kann, weiß ich noch nicht...
Jede meiner 3 Funktionen (siehe erstes Posting) ruft in ihrer Funktionalität eine Authenticator-Klasse für javamail auf (hier aus Forum bekommen), um sich am Postfach anzumelden. Hier erstmal die Auth-Klasse:
Code:
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/** 
 * Das ist ein Klasse die definiert wird und die von javax.mail.Authenticator erben muss!
 * Diese Klasse muss die Methode getPasswordAuthentication() implementieren!
 * das ist die Methode, die aufgerufen wird, bei der Überprüfung des jeweiligen Mail-Accountes.
 */

class myAuthenticator extends Authenticator {

        /**
         * Ein String, der den Usernamen nach der Erzeugung eines
         * Objektes

         * dieser Klasse enthalten wird.
         */
        private final String user;
        
        
        /**
         * Ein String, der das Passwort nach der Erzeugung eines
         * Objektes

         * dieser Klasse enthalten wird.
         */
        private final String password;

        
        /**
         * Der Konstruktor erzeugt ein MailAuthenticator Objekt

         * aus den beiden Parametern user und passwort.
         *
         * @param user
         *            String, der Username fuer den Mailaccount.
         * @param password
         *            String, das Passwort fuer den Mailaccount.
         */
        public myAuthenticator(String user, String password) {
            this.user = user;
            this.password = password;
        }

        
        /**
         * Diese Methode gibt ein neues PasswortAuthentication
         * Objekt zurueck.
         *
         * @see javax.mail.Authenticator#getPasswordAuthentication()
         */
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(this.user, this.password);
        }

    }
Hier mal meine 1. Funktion vom Aufruf mit ihrem relevanten Inhalt:
Code:
private static void getAnfragenMail(){
	
		try{
			String imapHost = "10.0.0.1";
			String username = "anfragen";
			String password = "geheim";
			
			// Get system properties
			Properties props = System.getProperties();
			//Mail-Server properties: Session verlangt die Informationen über Host, User, Passwd etc.
			props.put("mail.imap.host", imapHost);
			props.put("mail.imap.auth", "true");
	
			// Initialisierung der Auth-Klasse zur Mail-Account-Authentisierung; für Session benutzt
			myAuthenticator auth = new myAuthenticator(username, password);
			
			// Session: steht für die Verbindung mit dem Mail-Server		
			Session session = Session.getDefaultInstance(props, auth);
			//Gibt in der Console Debug-Meldungen zum Verlauf aus
			session.setDebug(false);
			
			// Store: Platzhalter; dient zum Ablegen der Nachrichten
			Store store = session.getStore("imap");
			store.connect();
			
			// Folder: ist ein Ordner-Object (Container) für Mails
			Folder folder = store.getFolder("INBOX");
			folder.open(Folder.READ_WRITE);
			
			// get Directory
			Message message[] = folder.getMessages();
			
			System.out.println("Mail-Anzahl = " + message.length);
			if(message.length > 0){
            //Mails bearbeiten

         }
         //... weitere Funktionalitäten

      }catch(Exception err){
         err.printStackTrace();
}
Dieser Code ist bei jeder meiner drei Funktionen gleich, außer die Strings 'username' und 'password'. Beim Aufruf der Klasse 'myAuthenticator' werden diese Strings dort hinein gegeben und somit ermittelt, ob der Login zum IMAP-Server korrekt ist.
Doch anscheinend merkt sich 'myAuthenticator' nur die Logindaten der Funktion, aus welcher 'myAuthenticator' das erste mal aufgerufen wurde?! ...denn wenn ich in den nachfolgenden Funktionen fehlerhafte Logindaten eingebe, kommt kein Fehler. Wenn ich in der zuerst aufgerufenen Funktion fehlerhafte Logindaten eingebe, bekomme ich eine "javax.mail.AuthenticationFailedException: Login failed: authentication failure" für alle meine 3 Funktionen!!!

Somit weiß ich nun, dass die Logindaten beim Aufruf nachfolgender Funktionrn noch immer die sind, welche aus der zuerst aufgerufenen Funktion an die Klasse 'myAuthenticator' übergeben wurden!!!


OK, doch wie bekomme ich dieses Verhalten wieder weg, sodass bei jedem neuen Aufruf von 'myAuthenticator' aus einer anderen Funktion auch mit den "neuen" Logindaten gearbeitet wird???

Danke und Gruß


PS: Ich hoffe, ich habe es halbwegs verständlich umschrieben.
 
Könnte es sein, dass die .put-Methode hier zu Fehlern führt, weil es ja nicht der selbe String sondern nur der gleiche Inhalt ist und somit evtl. ein neuer Wert angelegt wird, anstatt den alten zu überschreiben? ???:L
Ich würde mal versuchen, ob setProperty(String key, String value) funktioniert.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben