如何使用Android上的Gmail客户端API发送带有大附件的电子邮件

我试过以下代码来创build具有大附件的多部分电子邮件

Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); MimeBodyPart mimeBodyText = new MimeBodyPart(); mimeBodyText.setHeader("Content-Type", "text/html; charset=\"UTF-8\""); mimeBodyText.setContent(body, "text/html"); Multipart mp = new MimeMultipart(); mp.addBodyPart(mimeBodyText); if (attachments != null && attachments.size() > 0) { for (Uri uri : attachments) { MimeBodyPart mimeBodyAttachment = new MimeBodyPart(); String fileName = UriUtils.getFileName(uri, context); String mimeType = UriUtils.getMimeType(uri, context); Log.d(TAG, "Generating file info, uri=" + uri.getPath() + ", mimeType=" + mimeType); FileInputStream is = UriUtils.generateFileInfo(context, uri, mimeType); if (is == null) { throw new MessagingException("Failed to get file for uri=" + uri.getPath()); } try { mimeBodyAttachment.setFileName(fileName); mimeBodyAttachment.setHeader("Content-Type", mimeType + "; name=\"" + fileName + "\""); DataSource source = new ByteArrayDataSource(is, mimeType); mimeBodyAttachment.setDataHandler(new DataHandler(source)); mimeBodyAttachment.setHeader("Content-Transfer-Encoding", "base64"); mimeBodyAttachment.setDisposition(MimeBodyPart.ATTACHMENT); mp.addBodyPart(mimeBodyAttachment); } catch (IOException e) { throw new MessagingException(e.getMessage()); } } } MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.setFrom(new InternetAddress(from)); mimeMessage.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(recipient)); mimeMessage.setSubject(subject); mimeMessage.setContent(mp); Message message = createMessageWithEmail(mimeMessage); service.users().messages().send(from, message).execute(); 

这与本指南中的内容非常相似,但是,当我尝试添加大于〜5mb的文件时,execute函数会挂起并且不会返回(我会期待一个错误或者至less超时,但是这个是另一个问题)

经过一番search,我发现我需要以某种方式做upload请求( 请看这里 ), Gmail API的以下Gmail API看起来是正确的:

 Send send(java.lang.String userId, com.google.api.services.gmail.model.Message content, com.google.api.client.http.AbstractInputStreamContent mediaContent) 

不幸的是,我找不到任何有关其使用的文档或说明。
当我试图把附件raw作为mediaContent我得到一个错误说,唯一支持的MIMEtypes是message/rfc822 ,所以我试着把我在上面创build的for循环中使用的MimeBodyPart ,并使用它,但它看起来像附件只是被忽略。

如何使用Gmail client API和“上传”附件?

Solutions Collecting From Web of "如何使用Android上的Gmail客户端API发送带有大附件的电子邮件"

Google API的Java客户端的媒体上传/下载部分指出了执行此操作的步骤。

它表示您需要使用resumable media upload作为此场景的上传选项。 要实现它,你需要使用MediaHttpUploaderMediaUttpProgressListener

如果您在send()的第三个参数中传递了InputStreamContent ,那么引用的页面也有一个可以在GMail上工作的例子。

我知道这个问题已经有几个月的时间了,但是在遇到同样的问题之后,我却弄明白了。

我的实现和你的非常相似,我改变的只是最后两行。

所以,而不是使用:

 Message message = createMessageWithEmail(mimeMessage); service.users().messages().send(from, message).execute(); 

使用:

 ByteArrayOutputStream bytes = new ByteArrayOutputStream(); mimeMessage.writeTo(bytes); ByteArrayContent content = new ByteArrayContent("message/rfc822", bytes.toByteArray()); service.users().messages().send(from, null, content).execute();