tfield
tfield

Reputation: 1

Using Google email service with SSL on Resin 3.1 in AWS

First ever question.

I looking for help configuring java & resin to allow me to open a https URL connection from within my app. The Resin docs don't say, I think I'm doing the right thing in Java, but I'm running into a "java.lang.NoClassDefFoundError: Could not initialize class sun.net.www.protocol.https.DelegateHttpsUrlConnection". I expect the fix is either a single line in a config file or a missing jar... but which one??

More details:

Oracle linux JDK 1.7 Resin 3.1 (yes it's old) Google mail api v1 (see maven dependency below)

I've implemented a GmailSender class that sends email out from my 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);
}

And the maven config:

    <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>

And the exception - looks mostly good except for the class def issue:

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)

I've experimented with setting the protocols in my resin start script:

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"

But that change seems to have no impact. What am I missing??

Thanks!!

Upvotes: 0

Views: 163

Answers (2)

tfield
tfield

Reputation: 1

Looks like the NoClassDefFound error was due to an ExceptionInInitializer being thrown in the URL connection class because the logger was not being properly initialized.

Logging was overhauled in resin 3.1.5 and I checked the release notes for Resin and didn't see this issue reported. But just in case, I upgraded to Resin 3.1.15 and voilà - the problem is gone.

Bottom line - there is a nasty bug in resin 3.1.5 logging that blows up java 7 https URL connections. Who knew....

Upvotes: 0

pranav niraj
pranav niraj

Reputation: 64

another way to send email using 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);
      }
   }
}

if you getting javax.mail.AuthenticationFailedException please go to gmail settings
https://www.google.com/settings/security/lesssecureapps

Upvotes: 0

Related Questions