2016-03-26 11 views
0

Erste Frage.Verwenden von Google E-Mail-Service mit SSL auf Resin 3.1 in AWS

Ich suche nach Hilfe konfigurieren Java & Harz, damit ich eine HTTPS-URL-Verbindung von innerhalb meiner App zu öffnen. Die Resin-Dokumentation sagt nicht, ich denke, ich mache das Richtige in Java, aber ich stoße auf einen "java.lang.NoClassDefFoundError: Konnte nicht initialisieren class sun.net.www.protocol.https.DelegateHttpsUrlConnection" . Ich erwarte, dass das Update entweder eine einzelne Zeile in einer Konfigurationsdatei oder ein fehlendes Glas ist ... aber welches?

Weitere Details:

Oracle Linux JDK 1.7 Resin 3.1 (ja, es ist alt) Google Mail api v1 (Maven Abhängigkeit siehe unten)

Ich habe eine GmailSender Klasse implementiert, die E-Mail aussendet von meiner App:

httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
... 

private Credential authorizeServiceAccount() throws IOException, GeneralSecurityException { 
     Credential credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(serviceAccountId) 
       .setServiceAccountPrivateKeyFromP12File(new File(privateKeyFileName)) 
       .setServiceAccountScopes(SCOPES) 
       .setServiceAccountUser(serviceAccountUser) 
       .build(); 
     return credential; 
} 

Gmail getGmailService() throws IOException, GeneralSecurityException { 
    Credential credential = authorizeServiceAccount(); 
    return new Gmail.Builder(httpTransport, JSON_FACTORY, credential) 
      .setApplicationName(applicationName) 
      .build(); 
} 

public void send(SimpleMailMessage simpleMailMessage) throws MailException { 
    Message m; 
    try { 
     MimeMessage mm = asMimeMessage(simpleMailMessage); 
     m = asMessage(mm); 
    } catch (IOException e) { 
     throw new MailPreparationException("Unable to create email", e); 
    } catch (MessagingException e) { 
     throw new MailPreparationException("Unable to create email", e); 
    } 

    try { 
     Gmail gmail = getGmailService(); 
     m = gmail.users().messages().send("me", m).execute(); 
    } catch (IOException e) { 
     throw new MailSendException("Unable to send mail", e); 
    } catch (GeneralSecurityException e) { 
     throw new MailSendException("Could not send email", e); 
    } catch (Throwable t) { 
     throw new MailSendException("Unexpected failure sending email", t); 
    } 
    String id = m.getId(); 
    //System.out.println("Mail sent. Id is: " + id); 
} 

und die maven config:

Und die Ausnahme - sieht meist gut mit Ausnahme der Klasse def Ausgabe:

20160326-15:15:54.481org.springframework.mail.MailSendException; nested exceptions (0) are: 20160326-15:15:54.481Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.net.www.protocol.https.DelegateHttpsURLConnection 20160326-15:15:54.481 at sun.net.www.protocol.https.HttpsURLConnectionImpl.(HttpsURLConnectionImpl.java:86) 20160326-15:15:54.481 at sun.net.www.protocol.https.Handler.openConnection(Handler.java:62) 20160326-15:15:54.481 at sun.net.www.protocol.https.Handler.openConnection(Handler.java:57) 20160326-15:15:54.481 at java.net.URL.openConnection(URL.java:971) 20160326-15:15:54.481 at com.google.api.client.http.javanet.DefaultConnectionFactory.openConnection(DefaultConnectionFactory.java:31) 20160326-15:15:54.481 at com.google.api.client.http.javanet.NetHttpTransport.buildRequest(NetHttpTransport.java:136) 20160326-15:15:54.481 at com.google.api.client.http.javanet.NetHttpTransport.buildRequest(NetHttpTransport.java:62) 20160326-15:15:54.481 at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:863) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:283) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 20160326-15:15:54.481 at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217) 20160326-15:15:54.481 at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 20160326-15:15:54.481 at MyPackage.GmailSender.send(GmailSender.java:155)

Ich habe mit der Einstellung der Protokolle in meinem Harz experimentiert Startskript:

args="-jar $RESIN_HOME/lib/resin.jar -server-root $SERVER_ROOT -conf $config -server $SERVER_NAME" 
#args="-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 -jar $RESIN_HOME/lib/resin.jar -server-root $SERVER_ROOT -conf $config -server $SERVER_NAME" 

Aber diese Änderung scheint keinen Einfluss haben. Was vermisse ich??

Danke !!

Antwort

0

eine andere Art und Weise E-Mail mit Java

import java.util.Properties; 

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class SendEmailUsingGMailSMTP { 
    public static void main(String[] args) { 
     // Recipient's email ID needs to be mentioned. 
     String to = "[email protected]";//change accordingly 

     // Sender's email ID needs to be mentioned 
     String from = "[email protected]";//change accordingly 
     final String username = "testemail";//change accordingly 
     final String password = "yourPassword";//change accordingly 

     // Assuming you are sending email through relay.jangosmtp.net 
     String host = "smtp.gmail.com"; 

     Properties props = new Properties(); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.port", "587"); 

     // Get the Session object. 
     Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(username, password); 
     } 
     }); 

     try { 
     // Create a default MimeMessage object. 
     Message message = new MimeMessage(session); 

     // Set From: header field of the header. 
     message.setFrom(new InternetAddress(from)); 

     // Set To: header field of the header. 
     message.setRecipients(Message.RecipientType.TO, 
     InternetAddress.parse(to)); 

     // Set Subject: header field 
     message.setSubject("Testing Subject"); 

     // Now set the actual message 
     message.setText("Hello, this is sample for to check send " 
      + "email using JavaMailAPI "); 

     // Send message 
     Transport.send(message); 

     System.out.println("Sent message successfully...."); 

     } catch (MessagingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

wenn Sie javax.mail.AuthenticationFailedException bitte
https://www.google.com/settings/security/lesssecureapps

+0

Ich entferne mich von diesem Ansatz, um die schnellere und sicherere Google Mail-API zu verwenden. Meine Junit-Tests laufen gut - sie laufen einfach nicht im Web-Container. – tfield

0

wie der NoClassDefFound Fehler Sieht gmail Einstellungen gehen immer zu senden war aufgrund eines ExceptionInInitializer sein in die URL-Verbindungsklasse geworfen, weil der Logger nicht ordnungsgemäß initialisiert wurde.

Protokollierung wurde in Harz 3.1.5 überholt und ich habe die Versionshinweise für Resin überprüft und sah dieses Problem nicht gemeldet. Aber nur für den Fall, ich habe ein Upgrade auf Resin 3.1.15 und Voilà - das Problem ist vorbei.

Fazit - es gibt einen fiesen Bug in Harz 3.1.5 Protokollierung, die Java 7 https URL-Verbindungen sprengt. Wer weiß ...