Javamial : Send mail over SSL

I must send a mail use a SMTP with SSL.

This is an example of my code :

publicvoid sendMail(String destinatario,String mittente,String oggetto,String messaggio,String fileName,String fileNameInMail)throws Exception

{

if (protocol.equals("smtps")){

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

}

props=System.getProperties();

props.setProperty("mail."+protocol+".host", mailServer);

props.setProperty("mail.transport.protocol", protocol);

if (protocol.equals("smtps")){

props.setProperty("mail.smtps.auth","true");

props.setProperty("mail.smtps.starttls.enable","true");

props.setProperty("mail.smtps.socketFactory.fallback","false");

props.setProperty("mail.smtps.socketFactory.class", SSL_FACTORY);

props.setProperty("mail.smtps.socketFactory.port", UtilitaGenerale.getStringa(port));

}

Authenticator auth=null;

if(!mailUser.trim().equals(""))

auth=new MyAuthenticator(mailUser,mailPassword);

boolean debug =false;

//Session session = Session.getInstance(props,auth);

Session session=Session.getInstance(props,auth);

session.setDebug(true);

try{

Message msg =new MimeMessage(session);

Address mit=new InternetAddress(mittente);

msg.setFrom(mit);

InternetAddress[] address ={new InternetAddress(destinatario)};

msg.setRecipients(Message.RecipientType.TO, address);

msg.setSubject(oggetto);

MimeBodyPart textPart =new MimeBodyPart();

textPart.setContent(messaggio,"text/plain");

MimeBodyPart attachFilePart =new MimeBodyPart();

FileDataSource fds =new FileDataSource(fileName);

attachFilePart.setDataHandler(new DataHandler(fds));

attachFilePart.setFileName(fileNameInMail);

Multipart mp =new MimeMultipart();

mp.addBodyPart(textPart);

mp.addBodyPart(attachFilePart);

msg.setContent(mp);

Transport transportTemp=null;

transportTemp= session.getTransport(protocol);

transportTemp.connect(mailServer,port,mailUser,mailPassword);

transportTemp.send(msg);

transportTemp.close();

}

catch(Exception e)

{

throw e;

}

finally

{

session=null;

}

}

but I obtain this error :

javax.mail.MessagingException: Exception reading response

at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1427)

at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1225)

at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:340)

at javax.mail.Service.connect(Service.java:275)

at it.maggioli.informatica.conciliaweb.applicazione.service.mail.InviaLotto.inviaLotto(InviaLotto.java:158)

at it.maggioli.informatica.conciliaweb.applicazione.service.GestioneInvioLotto.inviaLotto(GestioneInvioLotto.java:236)

at it.maggioli.informatica.conciliaweb.applicazione.service.GestioneInvioLotto.inviaLottoNotifiche(GestioneInvioLotto.java:53)

at it.maggioli.informatica.conciliaweb.interfacciaclientserver.richiesteclient.EsecutoreSingolaRichiesta.eseguiRichiesta(EsecutoreSingolaRichiesta.java:1285)

at it.maggioli.informatica.conciliaweb.interfacciaclientserver.richiesteclient.EsecuzioneRichieste.eseguiRichiesteWindows(EsecuzioneRichieste.java:74)

at it.maggioli.informatica.conciliaweb.interfacciaclientserver.richiesteclient.EsecuzioneRichieste.eseguiRichieste(EsecuzioneRichieste.java:93)

at it.maggioli.informatica.conciliaweb.serlvets.AJAX.EsecuzioneRichiesta.processRequest(EsecuzioneRichiesta.java:153)

at it.maggioli.informatica.conciliaweb.serlvets.AJAX.EsecuzioneRichiesta.doPost(EsecuzioneRichiesta.java:50)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at com.planetj.servlet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:217)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)

at java.lang.Thread.run(Thread.java:619)

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1520)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:182)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)

at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:511)

at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:449)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:817)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:677)

at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)

at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:97)

at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)

at java.io.BufferedInputStream.read(BufferedInputStream.java:237)

at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:75)

at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1405)

... 28 more

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)

at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)

at sun.security.validator.Validator.validate(Validator.java:218)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)

... 40 more

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)

at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)

at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)

... 46 more

I have use the option debug of javamail and i have Obtain this :

DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc]

DEBUG SMTP: useEhlo true, useAuth true

DEBUG SMTP: trying to connect to host "sendm.cert.legalmail.it", port 465, isSSL true

DEBUG SMTP: exception reading response: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Can you help me ?

Sorry for my bad english.

[10563 byte] By [Lepr8a] at [2007-11-27 5:45:49]
# 1

The client doesn't trust the server certificate.

if (protocol.equals("smtps")){

Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider());

You don't need to do that at all from JDK 1.4 on, and you certainly don't need to do it every time this method executes.

ejpa at 2007-7-12 15:27:53 > top of Java-index,Security,Java Secure Socket Extension (JSSE)...