Как вставить сообщение с вложением с помощью Gmail API (Java) - PullRequest
0 голосов
/ 20 сентября 2018

Я использую Gmail API через клиентскую библиотеку Java и обнаружил, что метод Gmail API insert(java.lang.String userId, com.google.api.services.gmail.model.Message content) вставляет только файлы размером менее 5 МБ.

Я пытался использовать Insert insert(java.lang.String userId, com.google.api.services.gmail.model.Message content, com.google.api.client.http.AbstractInputStreamContent mediaContent) для вставки сообщения сфайл (размер 10 МБ).

MimeMessage email = GmailAPI.createEmail("toXXX@gmail.com", "fromYYY@gmail.com", "subject", "message body");
FileContent content = new FileContent("message/rfc822", new File("C:\\Users\\user\\someFile"));
Message message = createMessageWithEmail(email);
message = service.users().messages().insert(userId, message, mediaContent).execute();

CreateEmail - это простой метод быстрого запуска:

   public static MimeMessage createEmail(String to,
                                              String from,
                                              String subject,
                                              String bodyText)
                throws MessagingException {
            Properties props = new Properties();
            Session session = Session.getDefaultInstance(props, null);

            MimeMessage email = new MimeMessage(session);

            email.setFrom(new InternetAddress(from));
            email.addRecipient(javax.mail.Message.RecipientType.TO,
                    new InternetAddress(to));
            email.setSubject(subject);
            email.setText(bodyText);
            return email;
        }

Сообщение появилось в моем почтовом ящике, но без файла.

Что здесь не так?

UPD1: При вставке мультимедийного содержимого вставляется только электронное письмо без вложения.Я думаю, что я использую это неправильно.

1 Ответ

0 голосов
/ 26 сентября 2018

Я понял, как использовать возобновляемую загрузку с использованием библиотеки Java (та же идея с помощью REST):

byte[] bytes = Base64.decodeBase64(message.getRaw());
Insert insertReq;
Message content = new Message();
content.setLabelIds(message.getLabelIds());
try {
    insertReq = gmail.users().messages().insert(account, content,
        new ByteArrayContent("message/rfc822", bytes, 0, bytes.length));
    helper.execute(insertReq, task.getPartnerID(), task.isUnderWhiteLable());
} catch (IOException e) {
    Log.error("Failed to insert a message with resumable upload message", e);
}

Описание метода оказалось вполне понятным, но постфактум.Я понятия не имею, почему описание так плохо:

/**                                                                                                                                                                                                
 * Directly inserts a message into only this user's mailbox similar to IMAP APPEND, bypassing most                                                                                                 
 * scanning and classification. Does not send a message.                                                                                                                                           
 *                                                                                                                                                                                                 
 * Create a request for the method "messages.insert".                                                                                                                                              
 *                                                                                                                                                                                                 
 * This request holds the parameters needed by the the gmail server.  After setting any optional                                                                                                   
 * parameters, call the {@link Insert#execute()} method to invoke the remote operation.                                                                                                            
 *                                                                                                                                                                                                 
 * <p>                                                                                                                                                                                             
 * This method should be used for uploading media content.                                                                                                                                         
 * </p>                                                                                                                                                                                            
 *                                                                                                                                                                                                 
 * @param userId The user's email address. The special value me can be used to indicate the authenticated user.                                                                                    
 *        [default: me]                                                                                                                                                                            
 * @param content the {@link com.google.api.services.gmail.model.Message} media metadata or {@code null} if none                                                                                   
 * @param mediaContent The media HTTP content or {@code null} if none.                                                                                                                             
 * @return the request                                                                                                                                                                             
 * @throws java.io.IOException if the initialization of the request fails                                                                                                                          
 */                                                                                                                                                                                                
public Insert insert(java.lang.String userId, com.google.api.services.gmail.model.Message content, com.google.api.client.http.AbstractInputStreamContent mediaContent) throws java.io.IOException {
  Insert result = new Insert(userId, content, mediaContent);                                                                                                                                       
  initialize(result);                                                                                                                                                                              
  return result;                                                                                                                                                                                   
}    
...