【问题标题】:How to send emails with large attachments using gmail client API on Android如何在 Android 上使用 gmail 客户端 API 发送带有大附件的电子邮件
【发布时间】:2016-05-24 06:24:44
【问题描述】:

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

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 我在上面的for 循环中创建并使用它,但看起来附件只是被忽略了。

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

【问题讨论】:

  • @pratz9999 是的,我做到了,但这指的是 http 请求,而我正在询问应该简化 API 使用的客户端 API。
  • @pratz9999 感谢您的帮助,我从使用 SMTP 开始,但由于 Google “提供”了一个不错的 Gmail API,我认为使用它会更好,不幸的是,就像他们的许多 API 一样,文档太糟糕了,除非您需要最佳实践,否则您将需要一些 3rd 方的帮助才能使其发挥作用。
  • 我同意你的观点。在处理许多 google API 时,我不得不接受 3rd 方的支持以进行更多的增强和改进。

标签: android email gmail-api


【解决方案1】:

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

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

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

【讨论】:

  • 我不确定我是否需要 MediaHttpUploader 或其进度侦听器,正如您将在您提供的第一个示例中看到的那样,第一个示例使用特定于服务的生成库在场景,这是Send() API 所做的,问题是,当我提供媒体类型(即image/jpeg)时,我得到一个错误:Media type 'image/jpeg' is not supported. Valid media types: [message/rfc822]
  • 更新:我尝试对[message/rfc822] 格式的附件使用第三个参数,但它们没有被附加,我也对带有附件的整个邮件使用第三个参数,但我收到退回邮件,说明邮件未发送。
  • 我还认为媒体上传是针对不同的用例,即要求 Gmail API 直接从 Internet 获取内容。
  • @rds 你是对的,MediaHttpUploader 与发送电子邮件无关
【解决方案2】:

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

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

所以不要使用:

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

【讨论】:

  • 2 年后比以往任何时候都好。这是正确的。
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2017-07-24
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多