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

时间:2016-02-12 23:18:25

标签: android email gmail-api

我已尝试使用以下代码创建包含大附件的多部分电子邮件:

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),Gmail API中的以下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 I' m在上面的for循环中创建并使用它,但看起来只是忽略了附件。

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

2 个答案:

答案 0 :(得分:3)

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

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

所以不要使用:

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

答案 1 :(得分:0)

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

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

如果您在InputStreamContent的第3个参数中传递send(),则引用的页面还有一个可以在GMail上运行的示例。