# Java8 und JavaMail



## volkerk (8. Mai 2019)

Hallo,

Kann es sein dass JavaMail mit Java8 nicht geht ? 

Das lesen der eMails (WEB.DE) habe ich hinbekommen , beim senden kommen immer richtige Pgm-Abstürtzte (nicht in meinem Code).

Falls es so ist dass JavaMail in Verbindung mit Java8 nicht geht, was nimmt man denn dann ?


VilenDank

Volker.


----------



## mrBrown (8. Mai 2019)

JavaMail geht in den passenden Versionen auch mit Java 8 und höher.

Was ist denn der Fehler? Wenn du den noch nennst, kann man dir sicherlich besser helfen


----------



## volkerk (8. Mai 2019)

Hallo,

Vielen Dank für die Antwort.

Der Fehler tritt bei der Authentifizierung schon auf. Den genauen FehlerText sowie meinen Code  schreibe ich Dir morgen (muss erst heute abend daheim sein)

Viele Grüße

Volker.


----------



## volkerk (9. Mai 2019)

Hallo,

DEBUG SMTP: protocolConnect returning false, host=smtp.web.de, user=vn, password=<null>

in dieser zeile steht bei "user" nur mein vorname (VN) obwohl meine eMail addresse VN_NN@web.de (also vorname , nachname mit "_" getrennt) ist das richtig so?

der gesamte  Fehler Text (debug eingeschaltet) lautet :


```
DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.web.de, user=vn, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.web.de", port 587, isSSL false
javax.mail.MessagingException: Could not connect to SMTP host: smtp.web.de, port: 587;
  nested exception is:
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2211)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740)
    at javax.mail.Service.connect(Service.java:388)
    at javax.mail.Service.connect(Service.java:246)
    at javax.mail.Service.connect(Service.java:195)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at MailUtils.postMail(MailUtils.java:62)
    at MailUtils.main(MailUtils.java:38)
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    at sun.security.ssl.InputRecord.handleUnknownRecord(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:626)
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:400)
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:217)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175)
    ... 8 more
```


könnt Ihr damit etwas anfangen , braucht Ihr den Code noch dazu?

Viele Grüsse Volker.


----------



## M.L. (9. Mai 2019)

> in dieser zeile steht bei "user" nur mein vorname (VN) obwohl meine eMail addresse VN_NN@web.de (also vorname , nachname mit "_" getrennt) ist das richtig so?


Akzeptiert das Web-Interface von web.de nur den Vornamen oder braucht es die volle Adresse ? Das könnte der hier einzusetzende Parameter sein.  Das Passwort wird kaum <null> sein.
Und idR sollte man die erste Fehlermeldung abarbeiten:


> DEBUG SMTP: need username and password for authentication
> DEBUG SMTP: protocolConnect returning false, host=smtp.web.de, user=vn, password=<null>


 Vielleicht bietet dieser Quellcode auch einige Anregungen: https://howtodoinjava.com/for-fun-only/how-to-send-email-in-java-using-gmail-smtp-server/


----------



## volkerk (9. Mai 2019)

Hallo,

danke für die Antwort.

Ich gebe ja im POP3 (lesen) fall ja auch das richtige Password  sowie NutzerNamen mit nur im SMTP fall meckert er rum.

hier habe ich mal meinen Code: (stammt komplett aus "Java ist eine insel)


```
import java.io.*;
import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;

public class MailUtils
{
   
    public static void main(String[] args)  {
        Session session;
        String modus;
        String user;
        String pw;
       
        user = "[EMAIL]VN_NN@web.de[/EMAIL]";
        pw = "password";
        modus = "SCHREIBEN";
       
        if (modus=="LESEN") {
        System.out.print("Lesen beginn");
        session = getMailSession(user,pw);
        session.setDebug(true);
        Folder folder = null;
        try {folder = openPop3InboxReadOnly(session);} catch (MessagingException e1) {}
        try {printAllTextPlainMessages(folder);} catch (MessagingException | IOException e2) {}
        try {closeInbox(folder);} catch (MessagingException e3) {}
        System.out.print("Lesen ende");
        }
   
        if (modus=="SCHREIBEN") {
        System.out.print("Schreiben beginn");
        session  = getMailSession(user,pw);
        session.setDebug(true);
        try {
            postMail(session, "[EMAIL]an@web.de[/EMAIL]" ,"Kurze Info", "Hab's verstanden!" );
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.print("Schreiben ende");
        }
               
   
    }    
   
   
   
    public static void postMail( Session session, String recipient,
            String subject, String message )
throws MessagingException
{
Message msg = new MimeMessage( session );

InternetAddress addressTo = new InternetAddress( recipient );
msg.setRecipient( Message.RecipientType.TO, addressTo );

msg.setSubject( subject );
msg.setContent( message, "text/plain" );
Transport.send( msg );
}
   
    public static void printAllTextPlainMessages( Folder folder )
              throws MessagingException, IOException
            {
              for ( Message m : folder.getMessages() )
              {
                System.out.println( "\nNachricht:" );
                System.out.println( "Von: " + Arrays.toString(m.getFrom()) );
                System.out.println( "Betreff: " + m.getSubject() );
                System.out.println( "Gesendet am: " + m.getSentDate() );
                System.out.println( "Content-Type: " +
                                    new ContentType( m.getContentType() ) );

                if ( m.isMimeType( "text/plain" ) )
               System.out.println( m.getContent() );
              }
            }
   
   
    public static Folder openPop3InboxReadOnly( Session session )
              throws MessagingException
            {
              Store store = session.getStore( "pop3" );
              store.connect();

              Folder folder = store.getFolder( "INBOX" );
              folder.open( Folder.READ_ONLY );

              return folder;
            }
            public static void closeInbox( Folder folder ) throws MessagingException
            {
              folder.close( false );
              folder.getStore().close();
            }
   


  public static Session getMailSession( String user, String pass )
  {
    final Properties props = new Properties();

    // Zum Empfangen
    props.setProperty( "mail.pop3.host", "pop3.web.de" );
    props.setProperty( "mail.pop3.user", user );
    props.setProperty( "mail.pop3.password", pass );
    props.setProperty( "mail.pop3.port", "995" );
    props.setProperty( "mail.pop3.auth", "true" );
    props.setProperty( "mail.pop3.socketFactory.class",
                       "javax.net.ssl.SSLSocketFactory" );

    // Zum Senden
    props.setProperty( "mail.smtp.host", "smtp.web.de" );
    props.setProperty( "mail.smtp.auth", "true" );
    props.setProperty( "mail.smtp.port", "587" );
    props.setProperty( "mail.smtp.socketFactory.port", "587" );
    props.setProperty( "mail.smtp.socketFactory.class",
                       "javax.net.ssl.SSLSocketFactory" );
    props.setProperty( "mail.smtp.socketFactory.fallback", "false" );

    return Session.getInstance( props, new javax.mail.Authenticator() {
      @Override protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication( props.getProperty( "mail.pop3.user" ),
                                           props.getProperty( "mail.pop3.password" ) );
      }
    } );
  }
}
```





viele Grüsse

Volker


----------



## mrBrown (9. Mai 2019)

Versuch mal `props.setProperty("mail.smtp.starttls.enable", "true");` oder `props.setProperty("mail.smtp.ssl.enable", "true");` als zusätzliche Property.


----------



## volkerk (9. Mai 2019)

Hallo,

habe ich eben probiert -> gleiches ergebniss.

Ich kann mir aber auch nicht vorstellen dass es eine einstellung ist, denn ich bekomme ja einen Absturtz ich glaube wirklich eher dass das mit Java 8  so nicht geht (oder eine andere JavaMail version) meine Quelle war ja auch bisher Java7.

Viele Grüße Volker.


----------



## mrBrown (9. Mai 2019)

volkerk hat gesagt.:


> habe ich eben probiert -> gleiches ergebniss.


Beides einzelne probiert?



volkerk hat gesagt.:


> Ich kann mir aber auch nicht vorstellen dass es eine einstellung ist, denn ich bekomme ja einen Absturtz ich glaube wirklich eher dass das mit Java 8 so nicht geht (oder eine andere JavaMail version) meine Quelle war ja auch bisher Java7.


Das ist ziemlich sicher kein Java 8-Problem.

Den Absturz gibts, weil eine MessagingException auftritt, mit dem oben stehenden Grund. Und der ist nahezu immer ein Konfigurationsproblem.
Welche Java-Mail-Version nutzt du denn?


----------



## volkerk (9. Mai 2019)

Hallo,

im Debugger steht:

DEBUG: setDebug: JavaMail version 1.6.2

Gruss volker.


----------



## Wurstkopp (10. Mai 2019)

volkerk hat gesagt.:


> Hallo,
> 
> habe ich eben probiert -> gleiches ergebniss.
> 
> ...



Dann lad dir Java 7 und stelle selber fest, dass das eher ein Konfigurationsproblem ist.

Fassen wir doch mal zusammen:

- Unrecognized SSL message, plaintext connection?
- https://hilfe.web.de/pop-imap/imap/imap-serverdaten.html (Verschlüsselung)
- "isSSL false"

mrBrown's Spur sollte also passen.


----------



## thecain (11. Mai 2019)

volkerk hat gesagt.:


> if (modus=="LESEN")


In der Insel werden Strings mit == verglichen??


----------



## kneitzel (11. Mai 2019)

thecain hat gesagt.:


> In der Insel werden Strings mit == verglichen??


Wobei das hier funktioniert, denn er nutzt nur String Konstanten und die werden nach JLS 15.28 interned, d.h. alle konstanten Strings "LESEN" werden zur gleichen Referenz. Und alle Konstanten "SCHREIBEN" ebenso. Das bedeutet, dass eine Prüfung der Referenzen das richtige Ergebnis bringt.

Aber der Hinweis ist ganz wichtig und richtig. Aber statt da ein Vergleich mit equals zu machen, würde ich hier ein Enum einführen und dann die Enums prüfen. Alleine um hier die "magic numbers" zu verhindern (ja, ist keine Zahl aber bei den magic numbers geht es ja darum, dass man im fließenden Code keine Konstanten hat, daher würde ich das auch hier so bezeichnen.)


----------



## volkerk (11. Mai 2019)

Hallo,

OK. das mit dem nicht vorhandenen equals habe ich nur in den diesem Post eingebaut , in meinem orginalcode habe ich die Zeilen immer auskommentiert , entschuldigung.

Aber das löst mein eigentliches Problem nun leider auch nicht.

Gibt es nicht irgendwo eine verständliche (auch für mich) Anleitung wie ich die Parameter setzen muss , alles was ich bisher im WWW gefunden habe erzeugt Fehlermeldungen.

Sorry dass ich mich so anstelle (ich programmiere auch nicht so oft in Java)


Viele Grüße

Volker.


----------



## mihe7 (11. Mai 2019)

Die IONOS-Server scheinen STARTTLS zu verwenden. Wirf den SocketFactory-Käse raus und probier für SMTP *ausschließlich* die folgenden Properties:

```
props.setProperty( "mail.smtp.host", "smtp.web.de" );
        props.setProperty( "mail.smtp.auth", "true" );
        props.setProperty( "mail.smtp.port", "587" );
        props.setProperty( "mail.smtp.starttls.enable", "true");
```


----------



## volkerk (11. Mai 2019)

Hallo,

jetzt bin ich einen grossen Schritt weitergekommen. Die Fehlermeldungen sind fast weg und bei der Authentifizierung bekomme ich OK . Aber , Nachdem nun die Mail gesendet werden soll kommt :

554-Transaction failed
554 Unauthorized sender address.
DEBUG SMTP: got response code 554, with response: 554-Transaction failed
554 Unauthorized sender address.

Ich mussste die Sender eMail-Addresse auch in den Properties setzen , sonst gings gar nicht.

Weiss jeman was : 554 Unauthorized sender address.


Viele Grüße

Volker.


----------



## mihe7 (11. Mai 2019)

Setze `msg.setFrom(senderAddress);` für die betreffende Absenderadresse. Alternativ kannst Du auch die Property mail.smtp.from setzen.


----------



## volkerk (11. Mai 2019)

Hallo,

leider das gleiche Ergebniss wie vorher.

Der Fehler 554 ist auch nirgends so richtig beschrieben. Müsste eigentlich vom Empfänger Provider kommen.

Kann es sein dass ich keine eMail an mich selbst schicken kann ?  


Viele Grüße

Volker.


----------



## mihe7 (11. Mai 2019)

GMX sagt dazu:
"Wenn Sie beim SMTP-Versand über externe E-Mail Programme (Outlook, Thunderbird usw.) die Fehlermeldung *"Unauthorized sender address"* erhalten, nutzen Sie eine zu Ihrem GMX Postfach abweichende E-Mail-Adresse als Absendeadresse."


----------



## volkerk (11. Mai 2019)

Hallo,

wenn ich das jetzt richtig verstehe , geht WEB.DE (es geht nicht um GMX, ist aber die gleiche Fehlerbeschreiung) davon aus dass ich nicht mit der eMailadresse meines Postfachs eine eMail versenden will , das ist aber nicht so. Wie gesagt ich schicke sie ja an mich selbst und habe deshalb ja nur eine eMailadresse im JavaCode stehen.

Kann es auch ein Sperreintrag in so einer Blacklist sein  ?


Viele Grüße

Volker


----------



## mihe7 (11. Mai 2019)

volkerk hat gesagt.:


> Wie gesagt ich schicke sie ja an mich selbst und habe deshalb ja nur eine eMailadresse im JavaCode stehen.


Womit Du Dich anmeldest, und was Du als Absender angibst, sind zwei verschiedene Dinge (eigentlich drei). Du loggst Dich meldest Dich beim SMTP-Server an und dann wird eine Mail verschickt. Dazu wird ein Umschlag, auf dem der Absender vermerkt ist (MAIL FROM: <absender@web.de>) verwendet. Passt dieser nicht zur Anmeldung, wird die Mail zurückgewiesen. Das hat wiederum nicht unbedingt etwas mit dem "From"-Header der Mail zu tun (der wäre dann vergleichbar mit dem Briefkopf).

Hast Du mit setFrom oder mit der Property gearbeitet?


----------



## volkerk (11. Mai 2019)

Hallo,

habe mit den Properties gearbeitet.

Das mit dem Anmeldename und absenderaddresse habe ich (hoffe ich) schon verstanden. Wollte damit nur ausdrücken dass alle 3 (Anmeldename, Absender und Empfänger) bei mir gleich sind (vielleicht liegt es auch daran)

Gruß

Volker.


----------



## mihe7 (11. Mai 2019)

Verwende mal explizit msg.setFrom.


----------



## volkerk (11. Mai 2019)

Hallo,

es geht ..

Habe aber noch eine Frage:  Beim Lesen der eMails kommen immer noch alte, gelöschte (die in web.de nicht mehr zu sehen sind) muss ich da vor dem lesen irgend etwas zurücksetzen.

Folder.close mache ich ja.

Viele Grüsse

Volker.


----------



## mihe7 (11. Mai 2019)

volkerk hat gesagt.:


> Beim Lesen der eMails kommen immer noch alte, gelöschte


Das ist bei POP3 normal (so lange sie nicht wirklich vom Server gelöscht werden).


----------



## kneitzel (11. Mai 2019)

Die Mails werden nur als gelöscht markiert und dann nicht angezeigt.

Also wenn Du die Mails durchgehst, dann prüf die Flags: message.isSet(Flags.Flag,DELETED) dürfte der Aufruf sein, den du willst:


			Message (Java(TM) EE 7 Specification APIs)
		



			Flags.Flag (Java(TM) EE 7 Specification APIs)
		


So habe ich das zumindest in meiner Applikation gemacht, die neue Emails scannen musste.


----------



## volkerk (11. Mai 2019)

Hallo,

vielen, vielen dank für Eure Hilfe (hat Euch ja jetzt den ganzen Samstag Nachmittag gekostet).

Schönes Wochenende 

Gruss

Volker.


----------



## UnitedBlaze (23. Mrz 2020)

volkerk hat gesagt.:


> Hallo,
> 
> es geht ..
> 
> ...



Moin VOLKERK, ich stehe momentan vor dem selben Problem und bekomme es nicht gebacken...

Könntest du mir evtl. deinen funktionsfähigen Code zeigen?

MfG UnitedBlaze


----------

