2016-02-18 8 views
13

Hier ist meine Google Mail-Service-Konfiguration/Factory-Klasse:Gmail API Konfigurationsproblem (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; 
    } 

} 

Hier ist mein innerer Mailing-Service, die vorherige Bohne unter der Haube verwendet:

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

Wenn ich Methode execute send(Message message, String recipient) der Klasse MailServiceImpl ich folgende Antwort erhalten:

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

Weiß jemand, was los ist?

+0

hilft das? http://StackOverflow.com/A/29328258/4290096 –

+0

@ ᴊᴀᴠʏ, Schritt 5 erfordert Google für Arbeit Konto - Ich habe keine – user3029106

Antwort

3

Damit die Google Mail-API funktioniert, müssen Sie innerhalb Ihres Google Apps-Kontos die domänenweite Berechtigung an das Dienstkonto delegieren.

Das Dienstkonto stellt kein menschliches Google-Konto dar. Sie können die Berechtigung auch nicht an die gesamte Google-Domain delegieren (*** @ gmail.com).

Der andere Ausweg könnte mit OAuth 2.0 for Web Server Applications oder Java Mail api

seine Weiteren prüft: GMail REST API: Using Google Credentials Without Impersonate

3

überprüfen Sie, ob Sie gmail aktiviert haben Mails mit 3rd-Party-Anwendungen zu senden.

Gehen Sie zu meinem Konto -> Anmelden und Sicherheit -> Connected Apps jetzt scrollen Sie zum Ende der Seite werden Sie weniger sichere Anwendungen bekommen -> ändern Sie es auf !! Hoffe, das wird funktionieren