使用 Gmail 将请求正文写入服务器时出错 API

Error Writing Request Body to Server with Gmail API

我已经开始为一个副项目使用 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);

我唯一需要继续的是服务器可能在发送请求时切断了连接,但我不知道这是问题所在还是其他原因。

要发送大于 5MB 的电子邮件,您必须使用 分段上传可恢复上传(有关详细信息,请参阅 docs) .

在 Java Gmail API 客户端库中,send method sends a simple upload request, which can upload up to 5MB. To send a resumable upload request, use 3-argument version of send 方法的 2 参数版本。使用 可恢复上传,您最多可以发送 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();
}