Probleme mit JavaMail und IMAP - Löschen einer Nachricht

shutdown84

Grünschnabel
Hallo zusammen!
Nach längerer Abstinenz von tutorials.de hat mich mein Weg nun wieder zurückgeführt :-)

Starten möchte ich mein Comeback mit einer Frage zu JavaMail und IMAP - und dem seltsamen Verhalten, das ich hier bekomme:

Code:
	public void deleteMessages(Set<Message> toDelete, String inFolder) {
		try {
			Folder folder = store.getFolder(inFolder);		
			folder.open(Folder.READ_WRITE);
			
			folder.expunge();
			folder.getMessage(1).setFlag(Flag.SEEN, false);
			
			for (Iterator iterator = toDelete.iterator(); iterator.hasNext();) {
				Message message = (Message) iterator.next();
					message.setFlag(Flag.DELETED, true);
			}
			
			folder.close(true); // close and expunge
			
			
		} catch (MessagingException e) {
			System.out.println("es gab probleme beim löschen****** " + e.getMessage());
			e.printStackTrace(); }		
		
	}

Was ich eigentlich machen möchte: Eine Liste von Nachrichten in einem Ordner als gelöscht markieren und dann den Ordner beim Schließen expungen.
Geht aber nicht. Bzw. ging schon mal - nur nicht mehr. Ich kann mir nicht erklären, woran es liegt.

Ich bekomme den Ordner im Schreib-Modus geöffnet. Das erste Expunge und das Setzen einer auf ungelesen ist nur ein Test um genau das zu überprüfen. Und der Schreib-Zugriff besteht. Sobald allerdings das Flag für deleted gesetzt werden soll, bekomme ich vom Server die Meldung, dass nur Lesezugriff (Examine) bestünde.

Hier mal die Debug-Ausgaben der Session:

Code:
A3 SELECT INBOX
...
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft $MDNSent $Hidden $Media)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft $MDNSent $Hidden $Media)] limited
* 6 EXISTS
* 0 RECENT
* OK [UIDNEXT 59] predicted next UID
* OK [UIDVALIDITY 323751228] UIDs valid
* OK [UNSEEN 6] message 6 is first unseen
A3 OK [READ-WRITE] SELECT completed
A4 EXPUNGE
...
A4 OK completed
A5 STORE 1 -FLAGS (\Seen)
...
* 1 FETCH (FLAGS ())
A5 OK completed
A71 STORE 5 +FLAGS (\Deleted)
A71 NO mailbox is open for EXAMINE only
es gab probleme beim löschen****** A71 NO mailbox is open for EXAMINE only

Die Pünktchen und die unterschiedlichen Befehlsnummern kommen daher, dass mehrere Debug-Ausgaben ineinander laufen.

Zum Hintergrund: Ich habe mich an mehreren Ordnern eines Postfachs als Listener angemeldet (MessageCountListener) und frage den Status über exists-Meldungen regelmäßig ab. (Kann eventuell das das Problem sein? Aber wie gesagt - es hat auch schon funktioniert).

Schon mal danke und viele grüße
shutdown
 
Okay, diesen Teil hab ich mittlerweile gelöst und dann aber gleich ne neue Frage.
Für alle, die vor dem gleichen Problem stehen:

Wartet man in einem MessageCountListener auf neu eintreffende Nachrichten, so sind die Nachrichten, die einem über den Event mit übergeben werden, nicht wirklich zu gebrauchen. Gleiches gilt für die event-Source, also den Ordner. Diese übergebenen Parameter scheinen die Verbindung irgendwie zu blockieren, es bringt also auch nichts, den Ordner erneut schreibend zu öffnen und dann mit den neuen Nachrichten zu arbeiten.

Nimmt man hingegen den Event lediglich zur Kenntnis, öffnet den Ordner dann von selbst und sucht nach neuen Nachrichten im Ordner dann kann man mit diesen wunderbar weiterarbeiten.

So - nun meine nächste Frage: Wie kriege ich eine Nachricht in mein Postfach, bei dem die MessageId vom Server vorgegeben wird und nicht von der JavaMail-Implementierung?
Derzeit entsteht eine ID der Form
Code:
<12345678.1.1234567891011.JavaMail.XYZ@XYZ>
Würde es der Server machen, sähe es so aus:
Code:
<12345678.1234567@server.de>

Da ich die ID's für die weitere Verarbeitung brauche, kann ich mit der JavaMail-Variante nichts anfangen.

Die einfachste Antwort ist jetzt: Die Mail über ein externes Postfach an das Postfach schicken lassen. Das würde auch funktionieren - ist hier nur nicht möglich. Ich muss die Nachricht über das Zielpostfach loswerden, ein anderes steht mir nicht zur Verfügung.

Aber die beiden Varianten
Java:
smtpTransport.sendMessage(message, recipients); // also Mailversand über das Postfach ODER
folder.appendMessages(new Message[] {message}); // anhängen der Nachricht in den Ordner
führen beide dazu, dass die ID bestehen bleibt. Bei Message handelt es sich um eine MimeMessage.

Hat irgendjemand eine Idee?

Danke und Gruß
shutdown
 
Zurück