[Frage] Java Mail SSL + Lokalem James Server

Metamorphosis

Grünschnabel
Guten Morgen.

Ich sitze seit gestern vor einem Problem, wo ich mal erfahrene Hilfe bräuchte.

Ich bekomme beim ausführen meiner klasse folgende Exception:

Code:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:
	java.net.ConnectException: Connection refused: connect

Zum Hintergrund: Ich hab einen lokalen James Mail Server aufgesetzt und das SMTP auf SSL und port 465 geändert. Trotzdem scheint der sich auf port 25 verbinden zu wollen.

Aufbau der Klasse:
Code:
import java.io.*;

import java.util.Properties;
import javax.mail.*;

public class Mailer extends Authenticator {
    
    public String sender;
    public Session ses;
    public PasswordAuthentication auth;
    
    public Mailer(final String username, final String pass, String host){
        
        sender = username + '@' + host;
        auth = new PasswordAuthentication(username, pass);
        Properties props = new Properties();
        props.put("mail.user", username);
        props.put("mail.pass", pass);
        props.put("mail.host", host);
        props.put("mail.debug", "false");

        props.put("mail.store.protocol", "pop3");

        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.transport.protocol", "smtp");

        Session ses = Session.getInstance(props,
			new Authenticator() {
            @Override
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(username,pass);
				}
			});
    }

    public void sendMail(String empfaenger, String betreff, String text){

        System.out.println("SENDING message from " + sender + " to " + empfaenger);
        System.out.println();
        
        try{
            MimeMessage msg = new MimeMessage(ses);

            msg.addRecipients(Message.RecipientType.TO, empfaenger);
            msg.setSubject(betreff);
            msg.setText(text);

            Transport.send(msg);
        }catch(Exception e){

            System.out.print(e);
        }
    }
}

Greetz,

Metamorphosis
 
Zuletzt bearbeitet:
Ich habe dazu mal ein ausführliches Tutorial geschrieben *findest du auch in meiner Signatur*.
Da ich den Fehler deutlich sehe denke ich mal das du den Source von dort hast mit welchem auch ich einst begonnen habe.

Auch solltest du für Java-Code die Java-Tags nutzen *steht auch in meiner Signatur*.

Das Problem : du erstellst ein Session-Objekt mit den entsprechenden Properties ... soweit ist das kein Problem.
Welchen schwerwiegenden Fehler du dann aber begehst : du rufst die statische Methode Transport.send(Message) auf.
Laut Doc hat diese statische Methode aber ihr eigenes Session-Objekt ... dein vorher so mühevoll vorbereitetes Session-Objekt wird also vollkommen ignoriert.

Da ich jetzt hier nicht alles doppelt schreiben möchte bitte ich dich dir mein Tutorial durchzulesen.
Falls du Fragen zu diesem hast bitte ich dich diese als Kommentar unter das Tutorial zu schreiben.

btw : Willkommen im Tutorials.de-Forum


//EDIT
Ich habe gerade an dem Zeitpunkt der Bedankung gesehen das du dir mein Tutorial scheinbar bereits angesehen hast. Ich hoffe es hat dir bei der Lösung deines Problems geholfen.
Ich würde mich noch über eine Bewertung freuen.

btw : Makiere das Thema bitte als Erledigt wenn dein Problem gelöst ist.
 
Zuletzt bearbeitet von einem Moderator:
Hallo SPiKEe,

leider hat mir dein Tutorial nicht sonderlich geholfen. Denn selbst wenn ich deine fertige Klasse einfach kopiere und an meinen Mail Server anpasse, haut NetBeans mir Exceptions raus.

Java:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 465;
  nested exception is:
	javax.net.ssl.SSLException: Received fatal alert: internal_error
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
	at javax.mail.Service.connect(Service.java:295)
	at pvd.mail.client.SendMailTLS.main(SendMailTLS.java:30)
Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
	at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1911)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
	at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
	... 3 more

Aber der James läuft und ist erreichbar. Sobald ich SSL ausmache, und den James wieder auf plain starten lasse, funktioniert alles wunderbar.
 
Das Problem könnte sein das Java dein SSL-Zertifikat nicht akzeptiert. Um das zu umgehen müsstest du die SSLSocketFactory-Klasse überschreiben das diese ALLE Zertifikate akzeptiert.
Probiere das ganze mal bei einem Provider im Internet aus .. dort sollte es keine Probleme geben.

*Das ist jetzt aber so ziemlich das einzige was mir bei der Fehlermeldung einfällt.*
 
Ja genau die war es :)

Zum Hinweis falls noch jemand das Problem betrifft. Die Datei befindet sich bei Nutzung von Java6 unter \jdk1.6.0_33\jre\lib\ext.
 
Zurück