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.

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:

Der erste Weg ist nur etwas für besondere Fälle (wenn man z.B. Webseiten crawlt und einem die Verschlüsselung eigentlich egal ist). Der zweite ist sicherlich der eleganteste. Allerdings muss man ein solches Zertifikat meist nur einmal installieren und da ist dann der dritte Weg meist einfacher, weil man keine GUI programmieren muss, um das Hinzufügen von Zertifikaten mit dem Benutzerwillen abzustimmen.

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. :-)


Tags:  Java, SSL

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-2) was last changed on 18-Sep-2013 20:33 by Thomas Bayen