使用Gmail API向服务器写入请求体时出错。

问题描述 投票:0回答:1

我已经开始为一个副业项目搞Gmail API,并在发送带有附件的邮件时乱了阵脚。我一直试图发送的附件是一个大附件,但它只是一个19.5MB的音频文件,而文档中只说限制是35MB。我已经发送了一个不同的音频文件,比这更小,它能够被发送我得到以下错误,每次我试图发送更大的音频文件。

        java.io.IOException: Error writing request body to server
           at java.base/sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3648)
           at java.base/sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3631)
           at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
           at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:127)
           at java.base/java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253)
           at java.base/java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:211)
           at java.base/java.util.zip.GZIPOutputStream.write(GZIPOutputStream.java:146)
           at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:1819)
           at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegments(UTF8JsonGenerator.java:1142)
           at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeLongString(UTF8JsonGenerator.java:456)
           at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:425)
           at com.google.api.client.json.jackson2.JacksonGenerator.writeString(JacksonGenerator.java:128)
           at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:117)
           at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:172)
           at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:106)
           at com.google.api.client.http.json.JsonHttpContent.writeTo(JsonHttpContent.java:78)
           at com.google.api.client.http.GZipEncoding.encode(GZipEncoding.java:49)
           at com.google.api.client.http.HttpEncodingStreamingContent.writeTo(HttpEncodingStreamingContent.java:51)
           at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:80)
           at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)
           at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
           at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
           at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
           at EmailAPI.sendMessage(EmailAPI.java:179)
           at EmailSender.sendEmailWithAttachment(EmailSender.java:41)
           at EmailSender.sendEmails(EmailSender.java:67)
           at EmailSender.main(EmailSender.java:19)

我找到的所有方法似乎都没有用 我已经试过了。

          //This is the way that it is in the quickstart project
          mimeBodyPart = new MimeBodyPart();
          DataSource source = new FileDataSource(file);
          mimeBodyPart.setDataHandler(new DataHandler(source));
          mimeBodyPart.setFileName(file.getName());

          //I have tried putting both of these inplace of the above code but nothing worked
          mimeBodyPart.setContent(file, "audio/MPEG");
          mimeBodyPart.attachFile(file);

我唯一能做的就是服务器可能在发送请求时切断了连接 但我不知道这是否是问题所在,或者是其他原因

java api file-io
1个回答
0
投票

要发送大于5MB的邮件,你必须使用以下两种方式。多段式上传可上传 (见 文件 详见)。)

在Java Gmail API客户端库中,2参数版本的 send 方法发送一个 简单上传 请求,可以上传至5MB。要发送一个 可上传 请求,使用3个参数版本的 send 方法。使用 可上传 你可以发送到35MB。

下面是一个发送方法 javax.mail.internet.MimeMessage 使用 可上传:

import com.google.api.client.http.ByteArrayContent;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.Message;

import javax.mail.internet.MimeMessage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import javax.mail.MessagingException;
private Message sendMessage(Gmail gmail, String userId, MimeMessage mimeMessage, List<String> labelIds, String threadId) throws IOException, MessagingException {
    // Create Message instance containing email message metadata
    Message metadata = new Message()
            .setLabelIds(labelIds)
            .setThreadId(threadId);

    // Create byte array containing email message data (in RFC 2822 format)
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    mimeMessage.writeTo(baos);
    ByteArrayContent rawMessageBytes = new ByteArrayContent("message/rfc822", baos.toByteArray());

    return gmail.users().messages()
            .send(userId, metadata, rawMessageBytes)
            .execute();
}
© www.soinside.com 2019 - 2024. All rights reserved.