Wie lese ich eine E-Mail mit der POI-Bibliothek?
CLEVR ist ein erfahrener Mendix Partner. Wir veröffentlichen regelmäßig technische und funktionale Mendix Insights zu Themen, die wir für die Mendix-Entwicklergemeinschaft für relevant halten. In diesem Mendix Insights Blog gehen wir der Frage nach, wie man eine E-Mail mit der POI-Bibliothek lesen kann. Verfasst von einem unserer Mendix-Berater. Viel Spaß beim Lesen!
Mein Name ist Giel van Altena und ich arbeite als Mendix-Entwickler bei CLEVR. Ich möchte mein Wissen darüber teilen, wie man Java in Mendix Apps programmiert. Dieser Mendix Insights Blog ist für Mendix Entwickler gedacht, die gerne in Java programmieren und wissen wollen, wie man die POI Bibliothek zum Lesen von E-Mails verwendet. Mit der POI-Bibliothek können Sie den Absender, den Text und die Anhänge aus einer E-Mail-Datei auslesen. Ich werde erklären, wie man Java-Bibliotheken zu seinem Projekt hinzufügt, sein Projekt einrichtet und eine Java-Aktion in Eclipse schreibt.
Inhaltsverzeichnis:
- Hinzufügen von jar-Dateien zu Ihrem Projekt
- Ihr Projekt einrichten
- Schreiben der Java-Aktion
So fügen Sie Ihrem Projekt JAR-Dateien hinzu
Apache POI ist eine Java-Bibliothek zum Lesen und Schreiben von Dateien im Microsoft-Format. Innerhalb dieser Java-Bibliothek gibt es eine Klasse namens MAPIMessage, die Sie zum Lesen von E-Mails aus Outlook benötigen. Suchen Sie die POI-Java-Bibliothek auf der Apache-Website und laden Sie sie herunter (siehe Link). Die binäre Distribution enthält die gezippten jar-Dateien. Wenn Sie das Paket mit den jar-Dateien heruntergeladen haben, können Sie die jar-Dateien, die Sie benötigen, auswählen und im userlib-Ordner Ihres Mendix-Projekts ablegen. Die Jar-Dateien an diesem Ort werden automatisch dem Klassenpfad Ihres Eclipse-Projekts hinzugefügt, was bedeutet, dass Sie sie in Ihr Java importieren können.
Alle jar-Dateien im Paket
- poi-3.16.jar: Take This
- poi-examples-3.16.jar
- poi-excelant-3.16.jar
- poi-ooxml-3.16.jar
- poi-ooxml-schemas-3.16.jar
- poi-scratchpad-3.16.jar: Nehmen Sie dies. Diese Bibliothek enthält die MAPIMessage-Klasse.
- commons-codec-1.10.jar
- commons-sammlungen4-4.1.jar
- commons-logging-1.2.jar: Das brauchen Sie wahrscheinlich. Mein userlib-Ordner enthielt bereits commons-logging-1.1.jar, also brauchte ich commons-logging-1.2.jar nicht.
- junit-4.12.jar
- log4j-1.2.17.jar
- curvesapi-1.04.jar
- xmlbeans-2.6.0.jar
Es kann zu Jar-Konflikten kommen, wenn Sie versuchen, die Anwendung auszuführen. Dies geschieht, wenn ein Projekt zwei Java-Klassen mit demselben Namen enthält. Wahrscheinlich haben Sie den Excel Importer aus dem Appstore heruntergeladen, der eine andere Version der POI jar-Datei zu Ihrer Userlib hinzufügt. Sie können dieses Problem beheben, indem Sie die Jar-Datei mit der älteren Version entfernen. Mein Projekt lief, nachdem ich 'poi-3.10-FINAL-20140208.jar' (die ältere jar-Datei) aus meinem userlib-Ordner entfernt hatte. Testen Sie Ihr Projekt immer, bevor Sie Änderungen vornehmen. Bitte hinterlassen Sie einen Kommentar, wenn Sie eine bessere Methode zur Verwaltung von Jar-Konflikten kennen.
Wie Sie Ihr Projekt einrichten
1: Sie beginnen mit dem Einrichten Ihres Domänenmodells. Ich habe mein Domänenmodell wie folgt eingerichtet: Eine E-Mail-Entität mit Attributen zur Speicherung der E-Mail-Datei und ihres Inhalts, wie Absender, Empfänger und HTML-Text. Eine Dokument-Entität zum Speichern aller Anhänge. Beide Entitäten sind Unterklassen von FileDocument.
2: Erstellen Sie eine Java-Aktion mit drei Eingabeparametern: Ein E-Mail-Objekt, eine Liste mit Dokument-Objekten und eine String-Variable. Die E-Mail-Datei wird als E-Mail-Objekt an die Java-Aktion übergeben. Die Liste der Dokumente wird benötigt, um die Anhänge der E-Mail zu sammeln, da für jeden Anhang ein Dokumentobjekt erstellt und der Liste hinzugefügt wird. Die String-Variable wird benötigt, um der Java-Aktion den vollständigen Namen der Dokument-Entität mitzuteilen, der in meinem Fall 'MyFirstModule.Document' ist. Meine Java-Aktion sieht wie folgt aus:
3: Erstellen Sie eine Seite zum Hochladen der E-Mail. Sie können den Standard-Dateimanager von Mendix oder das Dropzone-Widget aus dem Appstore zum Hochladen der Datei verwenden.
4: Erstellen Sie einen Microflow, der die erste Seite öffnet. Der Microflow muss ein leeres E-Mail-Objekt erstellen und die Seite mit dem Dateiuploader öffnen.
5: Erstellen Sie eine zweite Seite, auf der die E-Mail angezeigt wird, nachdem sie hochgeladen und von der Java-Aktion verarbeitet wurde. Zeigen Sie die Attribute und Anhänge der E-Mail auf dieser Seite an.
6: Erstellen Sie einen zweiten Mikroablauf. Dieser Mikroablauf nimmt das E-Mail-Objekt, erstellt eine Liste von Dokumenten, erstellt eine String-Variable ('MyFirstModule.Document') und ruft die Java-Aktion auf. Die Java-Aktion liest die E-Mail, kopiert ihre Attribute in das E-Mail-Objekt und fügt die Anhänge in die Liste der Dokumente ein. Nachdem die Java-Aktion abgeschlossen ist, stellt der Mikroablauf die Verbindung zwischen den Anhängen und der E-Mail her, schließt die erste Seite und öffnet die zweite Seite. Es ist möglich, die Verknüpfung zwischen den Anhängen und der E-Mail innerhalb der Java-Aktion festzulegen, aber ich möchte so viel wie möglich im Mikroablauf erledigen.
Wie schreibt man die Java-Aktion in Eclipse?
Weitere Informationen über die Verwendung von Eclipse zum Schreiben von Java-Aktionen finden Sie hier. Öffnen Sie Eclipse und gehen Sie zu der Java-Datei, die zu Ihrer Java-Aktion gehört, die in meinem Fall in 'myfirstmodule.actions' zu finden ist. In der Java-Datei können Sie Ihren Java-Code zwischen den Markierungen schreiben: // BEGIN USER CODE und // END USER CODE
1: Schreiben Sie einige Validierungszeilen: Schreiben Sie die folgenden Zeilen, um zu überprüfen, ob die Datei einen Inhalt hat und ob die Dateierweiterung '.msg' entspricht. Die Dateierweiterung wird mit einem regulären Ausdruck geprüft. Die Funktion matches() gibt false zurück, wenn die Dateierweiterung nicht mit ".msg" endet. Wenn eine der Überprüfungen fehlschlägt, muss das Steuerelement zu dem Mikroablauf zurückkehren, der die Java-Aktion aufgerufen hat. Ich ziehe es vor, Ausnahmen auszulösen, wenn etwas falsch ist, und diese Ausnahmen in meinem Microflow zu behandeln, da der Rest von Java Ausnahmen auslöst, so dass man Ausnahmen ohnehin im Microflow behandeln muss.
2: Extrahieren Sie die Attribute: Wir werden Funktionen aus der MAPIMessage-Klasse (POI) verwenden, um die Attribute und Anhänge aus der E-Mail zu erhalten, und Funktionen aus der Core-Klasse, um sie zu speichern. Ich werde Core.change() zum Speichern der E-Mail-Attribute im E-Mail-Objekt, Core.instantiate() zum Erstellen eines FileDocuments und Core.storeFileDocumentContent() zum Speichern des Dateiinhalts der E-Mail im FileDocument verwenden. Sie können Core.change() nicht verwenden, um Daten zu speichern, da Core.change() nur String-Werte akzeptiert. Daher werden wir das Proxy-Objekt der E-Mail und seine Funktion setMessageDate() verwenden, um das Datum der E-Mail zu speichern.
Schreiben Sie die folgenden Zeilen, um die Attribute aus der E-Mail-Datei in das E-Mail-Objekt zu kopieren. Erstellen Sie einen Inputstream zum Lesen der E-Mail-Datei (Zeile 72). Instanziieren Sie ein MAPIMessage-Objekt, um seine Funktionen aufrufen zu können, um die Daten aus der E-Mail zu erhalten (Zeile 73). Erstellen Sie eine Hashmap-Variable (Zeile 77), nehmen Sie die Attribute der E-Mail und speichern Sie sie in lokalen Variablen (Zeilen 78-82). Sie benötigen eine benutzerdefinierte Java-Funktion, um die E-Mail-Adresse des Absenders der E-Mail zu ermitteln (Zeile 83); diese Funktion ist weiter unten beschrieben. Kopieren Sie dann das Datum der E-Mail mit setMessageDate() aus dem Proxy-Objekt der E-Mail (86), speichern Sie die lokalen Variablen in der Hashmap (Zeilen 89-103) und speichern Sie die Attribute der E-Mail mit Core.change(). Diese Funktion löst eine Ausnahme aus, wenn ein Attributname falsch geschrieben ist, achten Sie also auf die Schreibweise. Umgeben Sie diesen ganzen Block mit einem try/catch-Block.
3: Extrahieren Sie die E-Mail Adresse des Absenders: MAPIMessage hat viele Funktionen, siehe die Liste der Funktionen hier, aber keine Funktion, um die E-Mail-Adresse der Person, die die E-Mail gesendet hat, zu erhalten, also müssen wir eine Java-Funktion schreiben. Beginnen Sie mit der Java-Funktion zwischen den zweiten Markierungen: // BEGIN EXTRA CODE und // END EXTRA CODE
Die E-Mail besteht aus einer Reihe von Stücken. Einer dieser Chunks enthält die Zeile "From: "Nachname, Vorname (Firmenname)"
Schreiben Sie Ihren regulären Ausdruck auf und verwenden Sie doppelte Schrägstriche vor jedem Sonderzeichen (Zeile 150). Als Nächstes nehmen Sie die Zeilen aus der Kopfzeile der E-Mail mit getHeaders() und speichern sie in einem Array (Zeile 151). Iterieren Sie durch das Array und prüfen Sie, ob eine Zeile mit dem regulären Ausdruck übereinstimmt (Zeile 152-158). Wenn dies der Fall ist, nehmen Sie die dritte Gruppe aus dem Matcher und geben Sie sie zurück (Zeile 159).
4: Extrahieren Sie die Anhänge: Eine E-Mail-Datei mit Anhängen enthält einen Anhang-Chunk für jede Anhangsdatei. Setzen Sie die Programmierung in Ihrem try/catch-Block zwischen den ersten Markierungen fort. Entnehmen Sie die Attachment Chunks aus der Datei mit getAttachmentFiles() und speichern Sie sie in einem AttachmentChunks-Array (Zeile 107). Iterieren Sie durch das Array und erstellen Sie mit Core.instantiate() ein FileDocument-Objekt für jeden Anhang. Sie müssen Core.instantite() den genauen Entitätsnamen 'MyFirstModule.Document' mitteilen. Erstellen Sie einen Inputstream mit new ByteArrayInputSteam() zum Lesen der Datei (Zeile 114) und verwenden Sie Core.storeFileDocumentContent() zum Schreiben der Datei in das FileDocument (Zeile 115). Dann nehmen Sie den Namen des Anhangs aus dem Chunk und geben dem FileDocument mit Core.change() den richtigen Namen (Zeilen 118-121). Sie sollten Ihr Java mit dem catch-Block beenden.
Gute Arbeit! Ich hoffe, ich habe alles klar erklärt und Sie haben Ihre Java-Aktion erfolgreich geschrieben. Bitte zögern Sie nicht, einen Kommentar zu hinterlassen, wenn Sie weitere Informationen benötigen oder eine Verbesserung der Funktionalität oder des Codes haben!