我已经开始为一个副业项目搞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的邮件,你必须使用以下两种方式。多段式上传 或 可上传 (见 文件 详见)。)
在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();
}