如何使用Gmail客户端API带有大附件的邮件在Android
我尝试了下面的代码创建带有大附件的电子邮件多:如何使用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
和“上传”附件?
Google API的Java客户端的Media Upload/Download部分指出了执行此操作的步骤。
它表示您需要使用resumable media upload
作为此场景的上传选项。要实施它,您需要使用MediaHttpUploader
和MediaUttpProgressListener
。
如果您在send()
的第三个参数中通过InputStreamContent
,则参考页面还有一个可以在GMail上工作的示例。
我不确定我需要'MediaHttpUploader'或它的进度侦听器,就像您在第一个示例中所看到的那样,第一个示例使用特定于服务的生成的库在幕后执行相同的操作,这是'Send()'API的作用,问题是,当我提供媒体类型时(例如'image/jpeg'),我得到一个错误:'媒体类型'image/jpeg'不被支持。 :[message/rfc822]' – SagiLow
更新:我已经尝试过在[[message/rfc822]'格式中使用第三个参数作为附件,但它们没有被连接,我也用整个消息的第三个参数它的附件,但我得到反弹消息,说该消息没有发送 – SagiLow
我也相信媒体上传是针对不同的使用情况,即要求Gmail API直接从互联网取东西 – rds
我知道这个问题已经过了几个月了,但是在遇到同样的问题后,我能够弄清楚。
我的实现和你的非常相似,我改变的只是最后两行。
因此,而不是使用:
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();
你阅读本:https://developers.google.com/gmail/api/v1/reference/users/messages /发送 – pratz9999
@ pratz9999是的,我做过了,但是这是指http请求,而我正在询问应该简化API使用的客户端API。 – SagiLow
https://github.com/steveholt55/JavaMail-API-Android 它可能会更有帮助 – pratz9999