2016-03-26 6 views
0

Первый вопрос.Использование электронной почты Google с SSL на Resin 3.1 в AWS

Я ищу помощь в настройке java & смолы, чтобы разрешить мне открывать URL-адрес https из моего приложения. Документы Resin не говорят, я думаю, что я делаю все правильно в Java, но я запускаю «java.lang.NoClassDefFoundError: не удалось инициализировать класс sun.net.www.protocol.https.DelegateHttpsUrlConnection" , Я ожидаю, что исправление будет либо одной строкой в ​​файле конфигурации, либо отсутствующим банком ... но какой?

Подробнее:

Oracle Linux JDK 1,7 Смола 3,1 (да он старый) Google почта апи v1 (см Maven зависимость ниже)

Я реализовал класс GmailSender, который отправляет электронную почту из из моего приложения:

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); 
} 

И в Maven конфигурации:

<dependency> 
     <groupId>com.google.apis</groupId> 
     <artifactId>google-api-services-gmail</artifactId> 
     <version>v1-rev35-1.21.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.oauth-client</groupId> 
     <artifactId>google-oauth-client-jetty</artifactId> 
     <version>1.21.0</version> 
    </dependency> 

И исключение - выглядит в основном хорошо для выпуска класса четкости, за исключением:

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)

Я экспериментировал с установкой протоколов в моей смоле запустить скрипт:

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" 

Но это изменение кажется не иметь никакого влияния. Что мне не хватает?

Спасибо!

ответ

0

другой способ для отправки электронной почты с помощью 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); 
     } 
    } 
} 

если вы получаете javax.mail.AuthenticationFailedException , пожалуйста, перейдите в настройки GMAIL
https://www.google.com/settings/security/lesssecureapps

+0

Я отхожу от этого подхода, чтобы использовать более быстрый и безопасный API Google Mail. Мои тесты Junit работают нормально - они просто не запускаются в веб-контейнере. – tfield

0

выглядит как ошибка NoClassDefFound был вызван ExceptionInInitializer быть брошенному в классе URL-адреса, потому что логгер не был правильно инициализирован.

Лесозаготовки были отремонтированы в смоле 3.1.5, и я проверил примечания к выпуску для смолы и не видел этого сообщения. Но на всякий случай, я обновился до Resin 3.1.15 и вуаля - проблема ушла.

Нижняя линия - есть неприятная ошибка в смоле 3.1.5, которая взорвает java 7 https URL-соединений. Кто знал ....

 Смежные вопросы

  • Нет связанных вопросов^_^