Wer in Java Mails verarbeiten will, kann das mit Hilfe der JavaMail API machen. Von dieser API gibt es eine Standard-Implementierung von Sun, die inzwischen Open Source ist. Eine Alternative ist GNU JavaMail (diese kann auch mbox und maildir ansprechen). Ich benutze hier die Sun/Oracle-Version.
Ich möchte mittels eines Java-Programms meine IMAP-Mailbox auslesen und in ein einfaches Dokumentenmanagement integrieren. Aber auch für viele andere Aufgaben rund um Mails ist die API gut zu benutzen.
Links #
Problemlösung: IMAP per SSL #
Es war nicht ganz trivial, IMAPS (also die verschlüsselte Variante) mit meinem eigenen IMAP-Server (IMAPMailServer bzw. MailServerUmsetzung mit Dovecot) zum Laufen zu bekommen. Ich hatte ein Problem mit JavaSSL, weil mein Server-Zertifikat selbstsigniert war. Java kann das Zertifikat meines Servers nicht verifizieren und meckert natürlich zu Recht. Hier gibt es nun drei Wege, das zu lösen:
- Man schaltet die Zertifikatsprüfung komplett ab
- Man erlaubt, dem Benutzer, Zertifikate innerhalb des Programms hinzuzufügen
- Man extrahiert das Zertifikat vom Server und fügt es manuell (also einmal) in den Keystore ein
Einfacher wird es natürlich, wenn man kein Programm braucht, um das Zertifikat herunterzuladen. Da ich Zugang zu meinem Mailserver habe (ist ja meine eigene MailServerUmsetzung), habe ich das Zertifikat unter /etc/dovecot/dovecot.pem gefunden und auf meinen Client kopiert.
Einrichtung des Keystores #
Die SSL/TLS-Schlüssel von Java werden in einem sogenannten Keystore gespeichert. Das ist eine Datei, die sich zumeist unter "~/.keystore" findet. Dort werden alle Schlüssel und Zertifikate gehalten, die man benutzten möchte. Um diesen zu verwalten, gibt es das Kommandozeilenprogramm keytool:
keytool -genkeypair
erzeugt den Keystore und legt dort ein neues, eigenes Schlüsselpaar ab. Die angeforderten Angaben kann man meistenteils weglassen. Ich empfehle, den eigenen Namen anzugeben sowie die Organisation, weil dieser Eintrag of als so etwas wie der Name des Schlüssels angesehen wird. Soweit ich das verstanden habe, wird diesersoeben neu erzeugte Schlüssel dann ggf. benutzt, um die ausgehende Kommunikation mit anderen (z.B. dem IMAP-Server) zu verschlüsseln. Mit
keytool -list
kann man nun sehen, das der Keystore jetzt existiert und einen Schlüssel enthält. Mit
keytool -importcert -alias imap.mailserver.intern -file dovecot.pem
importiere ich nun die von meinem Mailserver herüberkopierte Zertifikatsdatei in den Java-Keystore. Dieser enthält jetzt also das benötigte Zertifikat und kann den Mailserver authentifizieren.
Benutzen des Keystores in der Javamail-API #
Nun sollte man meinen, das das reicht - aber Nein! Es wäre nicht Java, wenn nicht noch eine Kleinigkeit fehlen würde. Obwohl für den Keystore immer überall ~/.keystore als Standard-DAteipfad angegeben wird, erkennt JavaMail diesen dort nicht. Hierzu müssen wir eine System-Property setzen. Damit das immer geschieht, mache ich das unmittelbar in meinem Code. Der sieht dann im Ganzen so aus:
System.setProperty("javax.net.ssl.trustStore", System.getProperty("user.home") + "/.keystore"); URLName urlName = new URLName("imaps", "imap.mailserver.intern", 993, "", "benutzername", "geheimespasswort"); Properties prop = new Properties(); Session session = Session.getInstance(prop); Store store = session.getStore(urlName); store.connect(); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); System.out.println("Anzahl der Nachrichten: " + folder.getMessageCount()); folder.close(false); store.close();
...und fertig ist der Zugriff auf einen IMAPS-Server. :-)