2016-02-12 40 views
9

我尝试了下面的代码创建带有大附件的电子邮件多:如何使用Gmail客户端API带有大附件的邮件在Android

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(); 

这是非常类似于在this guide呈现然而, ,当我尝试添加大于〜5mb的文件时,执行函数挂起并且不返回(我期望出现错误或至少超时,但这是另一个问题)

经过一些搜索后,我发现我需要以某种方式做upload请求(see here),以下API中的Gmail API看起来正确:

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

不幸的是,我找不到任何关于其用法的文档或说明。
当我试图把附件原始为mediaContent我得到一个错误,说只有支持的MIME类型是message/rfc822,所以我试着采取MimeBodyPart我在for循环上面创建并使用它,但它看起来像附件被忽略。

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

+0

你阅读本:https://developers.google.com/gmail/api/v1/reference/users/messages /发送 – pratz9999

+0

@ pratz9999是的,我做过了,但是这是指http请求,而我正在询问应该简化API使用的客户端API。 – SagiLow

+0

https://github.com/steveholt55/JavaMail-API-Android 它可能会更有帮助 – pratz9999

回答

0

Google API的Java客户端的Media Upload/Download部分指出了执行此操作的步骤。

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

如果您在send()的第三个参数中通过InputStreamContent,则参考页面还有一个可以在GMail上工作的示例。

+0

我不确定我需要'MediaHttpUploader'或它的进度侦听器,就像您在第一个示例中所看到的那样,第一个示例使用特定于服务的生成的库在幕后执行相同的操作,这是'Send()'API的作用,问题是,当我提供媒体类型时(例如'image/jpeg'),我得到一个错误:'媒体类型'image/jpeg'不被支持。 :[message/rfc822]' – SagiLow

+0

更新:我已经尝试过在[[message/rfc822]'格式中使用第三个参数作为附件,但它们没有被连接,我也用整个消息的第三个参数它的附件,但我得到反弹消息,说该消息没有发送 – SagiLow

+0

我也相信媒体上传是针对不同的使用情况,即要求Gmail API直接从互联网取东西 – rds

1

我知道这个问题已经过了几个月了,但是在遇到同样的问题后,我能够弄清楚。

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

因此,而不是使用:

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(); 
相关问题