2016-02-18 21 views
13

Đây là Gmail dịch vụ cấu hình/nhà máy lớp học của tôi:Gmail vấn đề cấu hình API (trong 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; 
    } 

} 

Đây là dịch vụ gửi thư bên trong của tôi có sử dụng đậu trước dưới mui xe:

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

Khi tôi thực hiện phương pháp send(Message message, String recipient) của lớp MailServiceImpl tôi nhận được sau phản ứng:

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

Có ai biết điều gì sai?

+0

điều này có giúp ích gì không? http://stackoverflow.com/a/29328258/4290096 –

+0

@ ᴊᴀᴠʏ, bước 5 yêu cầu google cho tài khoản công việc - Tôi không có tài khoản – user3029106

Trả lời

3

Để API GMail hoạt động, bạn phải "Ủy quyền quyền trên toàn miền cho tài khoản dịch vụ" trong tài khoản Google Apps của mình.

Tài khoản dịch vụ không đại diện cho tài khoản Google của con người. Bạn cũng không thể ủy quyền cho toàn bộ miền Google (*** @ gmail.com).

Cách khác ra có thể là với OAuth 2.0 for Web Server Applications hoặc Java Mail api

Để biết thêm việc phải làm kiểm tra: GMail REST API: Using Google Credentials Without Impersonate

3

Kiểm tra xem bạn đã kích hoạt gmail để gửi thư sử dụng các ứng dụng bên thứ 3.

Chuyển đến tài khoản của tôi -> Đăng nhập và bảo mật -> Ứng dụng đã kết nối hiện đang cuộn xuống cuối trang, bạn sẽ nhận được các ứng dụng kém an toàn hơn -> thay đổi thành bật !! Hy vọng điều này sẽ hoạt động