2016-02-18 18 views
13

Qui è la mia Gmail classe di servizio di configurazione/fabbrica:Gmail problema di configurazione API (in Java)

import java.io.File; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.env.Environment; 

import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpRequestInitializer; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.gmail.Gmail; 
import com.google.api.services.gmail.GmailScopes; 

public class GmailServiceFactoryBean { 

    private @Autowired Environment env; 

    private final NetHttpTransport transport; 
    private final JacksonFactory jacksonFactory; 

    public GmailServiceFactoryBean() throws GeneralSecurityException, IOException { 
     this.transport = GoogleNetHttpTransport.newTrustedTransport(); 
     this.jacksonFactory = JacksonFactory.getDefaultInstance(); 
    } 

    public Gmail getGmailService() throws IOException, GeneralSecurityException { 
     return new Gmail.Builder(transport, jacksonFactory, getCredential()) 
       .setApplicationName(env.getProperty("gmail.api.application.name")).build(); 
    } 

    private HttpRequestInitializer getCredential() throws IOException, GeneralSecurityException { 
     File p12File = new File(this.getClass().getClassLoader().getResource("google-key.p12").getFile()); 

     Credential credential = new GoogleCredential.Builder() 
      .setServiceAccountId(env.getProperty("gmail.api.service.account.email")) 
      .setServiceAccountPrivateKeyId(env.getProperty("gmail.api.private.key.id")) 
      .setServiceAccountPrivateKeyFromP12File(p12File) 
      .setTransport(transport) 
      .setJsonFactory(jacksonFactory) 
      .setServiceAccountScopes(GmailScopes.all()) 
      //.setServiceAccountUser(env.getProperty("gmail.api.user.email")) 
      .build(); 

     credential.refreshToken(); 

     return credential; 
    } 

} 

Ecco il mio servizio di mailing interno che utilizza fagiolo precedente sotto il cofano:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.List; 
import java.util.Properties; 

import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMessage.RecipientType; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.env.Environment; 
import org.springframework.stereotype.Service; 

import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; 
import com.google.api.services.gmail.Gmail; 
import com.google.api.services.gmail.model.Message; 
import com.example.factory.GmailServiceFactoryBean; 
import com.example.service.MailService; 
import com.example.service.exception.MailServiceException; 

@Service 
public class MailServiceImpl implements MailService { 

    private @Autowired GmailServiceFactoryBean gmailServiceFactoryBean; 
    private @Autowired Environment env; 

    @Override 
    public void send(com.example.model.Message message, String recipient) throws MailServiceException { 
     try { 
      Gmail gmailService = gmailServiceFactoryBean.getGmailService(); 
      MimeMessage mimeMessage = createMimeMessage(message, recipient); 
      Message gMessage = createMessageWithEmail(mimeMessage); 
      gmailService.users().messages().send("me", gMessage).execute(); 
     } catch(MessagingException | IOException | GeneralSecurityException e) { 
      throw new MailServiceException(e.getMessage(), e.getCause()); 
     } 
    } 

    @Override 
    public void send(com.example.model.Message message, List<String> recipients) throws MailServiceException { 
     for (String recipient : recipients) { 
      send(message, recipient); 
     } 
    } 

    private MimeMessage createMimeMessage(com.example.model.Message message, String recipient) throws MessagingException { 
     Session session = Session.getDefaultInstance(new Properties()); 

     MimeMessage email = new MimeMessage(session); 
     InternetAddress toAddress = new InternetAddress(recipient); 
     InternetAddress fromAddress = new InternetAddress(env.getProperty("gmail.api.service.account.email")); 

     email.setFrom(fromAddress); 
     email.addRecipient(RecipientType.TO, toAddress); 
     email.setSubject(message.getTitle()); 
     email.setText(message.getContent(), env.getProperty("application.encoding")); 

     return email; 
    } 

    private Message createMessageWithEmail(MimeMessage email) throws MessagingException, IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     email.writeTo(baos); 
     return new Message().setRaw(Base64.encodeBase64URLSafeString(baos.toByteArray())); 
    } 
} 

Quando eseguo metodo send(Message message, String recipient) di classe MailServiceImpl ottengo seguente risposta:

400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Bad Request", 
    "reason" : "failedPrecondition" 
    } ], 
    "message" : "Bad Request" 
} 

Qualcuno sa cosa c'è che non va?

+0

fa questo aiuto? http://stackoverflow.com/a/29328258/4290096 –

+0

@ ᴊᴀᴠʏ, il passaggio 5 richiede l'account google for work - Non ne ho uno – user3029106

risposta

3

Perché l'API di GMail funzioni, è necessario "Delegare l'autorità a livello di dominio all'account di servizio" all'interno del proprio account Google Apps.

L'account di servizio non rappresenta un account Google umano. Inoltre, non è possibile delegare l'autorizzazione a tutto il dominio Google (*** @ gmail.com).

L'altra via d'uscita potrebbe essere con OAuth 2.0 for Web Server Applications o Java Mail api

Per maggiori controlli: GMail REST API: Using Google Credentials Without Impersonate

3

Verificare se è stata abilitata Gmail per inviare mail utilizzando applicazioni 3rd party.

Vai al mio account -> Accedi e sicurezza -> Connected Apps ora scorri fino in fondo alla pagina otterrai meno app sicure -> cambialo su on !! Spero che questo funzioni