如果邮件包含大量附件(超过5 MB),则在将邮件插入Gmail时会出现400错误请求

时间:2016-08-19 10:27:39

标签: java oauth-2.0 google-api build.gradle

  

com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误请求

     

com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)       在com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)       在com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)       在com.google.api.client.googleapis.services.AbstractGoogleClientRequest $ 1.interceptResponse(AbstractGoogleClientRequest.java:321)       在com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)       在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)       在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)       在com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)       在org.gradle.GradleTest.insertMessage(GradleTest.java:132)       在org.gradle.GradleTest.main(GradleTest.java:173)

仅当我们尝试插入具有大附件(超过5mb)的邮件时才会发生此异常。

如果附件较小,则邮件会正确插入。

要插入我试过的邮件:

File file = new File(email);
            FileInputStream fis = new FileInputStream(file);
            long fileSize = file.length();
            byte[] buf = new byte[(int)fileSize];
            int readNum = fis.read(buf);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write(buf);

            String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());

            Message message = new Message();
            message.setRaw(encodedEmail);
            message = service.users().messages().insert(userId, message).execute();

请建议插入附件超过5mb的邮件的解决方案。

1 个答案:

答案 0 :(得分:1)

Choose a Solver说:

  

您可以通过以下任何方式进行上传请求。使用uploadType请求参数指定您使用的方法。

     

简单上传:uploadType = media。为了快速传输较小的文件,   例如,5 MB或更少。

     

分段上传:uploadType = multipart。对于   快速传输较小的文件和元数据;传输文件   使用描述它的元数据,所有这些都在一个请求中。

     

可恢复   upload:uploadType = resumable。特别是为了可靠的转移   对于较大的文件很重要使用此方法,您可以使用会话   发起请求,可选地可以包括元数据。这是一个   适用于大多数应用程序的良好策略,因为它也适用于   较小的文件,每次上传一个额外的HTTP请求。

由于您要发送数据> 5 MB,使用multipart或resumable选项。 multipart的示例:(也取自文档):

public static MimeMessage createEmailWithAttachment(String to,
                                                        String from,
                                                        String subject,
                                                        String bodyText,
                                                        File file) throws MessagingException, IOException {
        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);

        MimeBodyPart mimeBodyPart = new MimeBodyPart();
        mimeBodyPart.setContent(bodyText, "text/plain");

        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(mimeBodyPart);

        mimeBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(file);

        mimeBodyPart.setDataHandler(new DataHandler(source));
        mimeBodyPart.setFileName(file.getName());

        multipart.addBodyPart(mimeBodyPart);
        email.setContent(multipart);

        return email;
    }