400将邮件插入Gmail时的错误请求,如果邮件包含大型附件(超过5 mb)



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

来自(GoogleJsonResponseException.java:146(网址:com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogle JsonClientRequest.java:113(网址:com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogle JsonClientRequest.java:40(网址:com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.enterceptResponse(AbstractGoogleClientRequest.java:321(网址:com.google.api.client.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的邮件的解决方案。

Gmail API文档中写道:

您可以通过以下任何方式发出上传请求。指定与uploadType请求参数一起使用的方法。

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

多部分上传:uploadType=多部分。对于快速传输较小的文件和元数据;将文件一起传输以及描述它的元数据,所有这些都在一个请求中。

可恢复upload:uploadType=可恢复。用于可靠的传输,尤其是对于较大的文件非常重要。使用此方法,可以使用会话发起请求,该请求可选地可以包括元数据。这是一个适用于大多数应用程序的好策略,因为它也适用于以每次上传一个额外的HTTP请求为代价的较小文件。

由于要发送数据>5 MB,使用多部分或可恢复选项。多部分示例:(也取自文档(:

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

相关内容

  • 没有找到相关文章

最新更新