javamail Problem beim Empfangen von Nachrichten

gogcho

Mitglied
Hallo zusammen ! Ich erstelle gerade eine kleine Mail-Programm mit java. Ich habe kleines Problem beim Anzeigen von empfangenen Nachrichten. Hier ist der wichtige Codeabschnitt:

Java:
private void nachrichtenAbholen() {
        
        einloggen=MiniMailStart.setEinloggen();
        String benutzername =einloggen.getBenutzername();
        String kennwort = einloggen.getKennwort();

        String server = "pop.gmail.com";
        
        Properties eigenschaften = new Properties();
        eigenschaften.put("mail.store.protocol", "pop3");
        eigenschaften.put("mail.pop3.host", server);
        eigenschaften.put("mail.pop3.port", "995");   
        eigenschaften.put("mail.pop3.starttls.enable", "true");
        Session sitzung = Session.getDefaultInstance(eigenschaften);

        try (Store store = sitzung.getStore("pop3s")){
            store.connect(server, benutzername, kennwort);   
            Folder posteingang  = store.getFolder("INBOX");
            posteingang.open(Folder.READ_WRITE);

            Message nachrichten[] = posteingang.getMessages();

            if (nachrichten.length != 0) {
                JOptionPane.showMessageDialog(this, "Es gibt "+ posteingang.getUnreadMessageCount() + " neue Nachrichten.");
                for(Message nachricht : nachrichten)
                    nachrichtVerarbeiten(nachricht);
            }               
            else
                JOptionPane.showMessageDialog(this, "Es gibt keine neue Nachrichten.");

            posteingang.close(true);
        }
        catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }

    private void nachrichtVerarbeiten(Message nachricht) {
        try {
            if (nachricht.isMimeType("text/plain")) {
                String sender = nachricht.getFrom()[0].toString();
                String betreff = nachricht.getSubject();
                String inhalt = nachricht.getContent().toString();
                nachrichtSpeichern(sender, betreff, inhalt);
                nachricht.setFlag(Flags.Flag.DELETED, true);
            }
            else
                JOptionPane.showMessageDialog(this, "Der Typ der Nachricht " + nachricht.getContentType() + "kann nicht verarbeitet werden.");   
        }
        catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }

Es ist nur auf gmail begrenzt. Wenn ich von meinem Laptop eine Nachricht zum Testen verschicke, wird sie nicht als text/plain anerkannt, also als reiner Text, sondern geht es in else-Zweig rein und wird mir angezeigt, dass der Typ multipart/alternative ist. Wenn ich vom Handy eine Mail verschicke ist alles in Ordnung. Habt ihr vielleicht eine Idee wo ich einen Fehler mache?
 
Du machst im Code keinen Fehler - Emails können halt in diversen Formaten kommen und nicht nur als text/plain. Schick Emails als reine Text-Nachrichten (das wird auch von Deinem Laptop aus gehen) und schon wird die Email auch verarbeitet. Oder erweitere Die Logik, so dass Du auch andere Formate richtig verarbeiten kannst.

Evtl. einmal https://stackoverflow.com/questions...ipart-alternative-mail-with-javamail/16931800 als ersten Ansatz lesen. Da ist auch RFC 5322 verlinkt das mehr Details erhalten sollte.
 
Du kannst beim (vor dem) Versenden das Email-Format in deinem Mail-Client-Programm angeben, auf dem Handy geht das aber meines Wissen nach nich...

Edit: "multipart/alternative" ist so etwas ähnliches wie plain.
 
Also wenn man Emails verarbeiten will, dann sollte man sich das schon entsprechend im Detail ansehen und zumindest die üblichen Formate unterstützen.

Edit: "multipart/alternative" ist so etwas ähnliches wie plain.
Das würde ich so nicht sagen, die Nachricht besteht nur aus mehreren Teilen wobei die Teile als jeweilige Alternative anzusehen sein sollten.

multipart -> die Email ist aus mehreren Teilen aufgebaut.
alternative -> es gibt die nachricht in mehreren alternativen Formaten.

So findet man oft Emails im HTML Format und es gibt noch zusätzlich eine plain Variante für den Fall, dass ein Client kein HTML rendern will/kann. Aber da muss man aufpassen - ich habe auch schon erlebt, dass in der plain Variante nur ein Dummy Text gestanden hat a.la. bitte die HTML Email lesen 🙂

Weitere Erklärung / Quelle: Da wäre dann z.B. auf https://help.emarsys.com/hc/de/articles/360016272317-Best-practices-E-Mail-Größe-und-Multipart-Nachrichten- zu finden:
Der Contenttyp 'multipart/alternative' wird verwendet, wenn dieselbe Information in verschiedenen Teilen des Bodys auf unterschiedliche Weise präsentiert wird.

Zur Abarbeitung:
Eine Abarbeitung von multipart Nachrichten ist dann "einfach" über die Multipart Klasse. getContent gibt dann ein Multipart zurück und da kann man dann abfragen, wie viele Teile es gibt und jeden Teil einzelnd betrachten. Dabei wird man dann bestimmt Teile finden, die man zeigen kann.
(Man bekommt ein BodyPart und kann da dann auch getContent und getContentType aufrufen. Das kann man dann auch rekursiv betrachten: Eine Message ist auch ein Part - so wie auch eben ein Multipart oder BodyPart. Das war mal bei mir eine Herangehensweise).

Edit: Evtl. noch als Hinweis zu dem rekursiven Ansatz: Multipart kann verschachtelt sein! Also eine Nachricht kann z.B. sein:
Die Nachricht selbst ist multipart/mixed und hat mehrere Blöcke
Ein Block ist dann z.B. ein multipart/related und dazu noch Anhänge
multipart/related ist dann z.B. ein multipart/alternative und dazu noch inlines (z.B. vom html genutzt)
multipart/alternative hat dann die Nachricht - einmal als text/plain und einmal als text/html
==> Daher eine rekursive Herangehensweise!
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben