首页 文章

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

提问于
浏览
0

com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误请求来自com.google.api.cli.client上的com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) . go.comapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)位于com.google.api.client的com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) . go.comapis.services.AbstractGoogleClientRequest $ 1.interceptResponse(AbstractGoogleClientRequest.java:321)位于com.google.api.client.google客户网站上的com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) .executeUnparsed(AbstractGoogleClientRequest.java:419)位于com.google.api.client.google上,com.google.api.client.google客户网站上的com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) . eClientRequest.execute(AbstractGoogleClientRequest.java:469)org.gradle.GradleTest.insertMessage(GradleTest.java:132)atg.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 回答

  • 1

    Gmail API documentation说:

    您可以通过以下任何方式进行上传请求 . 使用uploadType请求参数指定要使用的方法 . 简单上传:uploadType = media . 用于快速传输较小的文件,例如,5 MB或更少 . 分段上传:uploadType = multipart . 用于快速传输较小的文件和元数据;在单个请求中传输文件以及描述它的元数据 . 可恢复上传:uploadType =可恢复 . 对于可靠的传输,对于较大的文件尤为重要 . 使用此方法,您可以使用会话启动请求,该请求可以选择包含元数据 . 这是一种适用于大多数应用程序的好策略,因为它也适用于较小的文件,每次上传一个额外的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;
        }
    

相关问题