2016-02-12 37 views
9

Próbowałem poniższy kod, żeby stworzyć wieloczęściowy e-mail z dużymi załącznikami:Jak wysłać e-maili z dużymi załącznikami za pomocą interfejsu API klienta Gmail na Androida

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

co jest dość podobny do tego, co jest przedstawione w this guide jednak , gdy próbuję dodać plik większy niż ~ 5mb, funkcja execute zawiesza się i nie zwraca (spodziewam się błędu lub przynajmniej limitu czasu, ale jest to inny problem)

Po pewnym wyszukiwaniu znalazłem, że muszę jakoś wykonać upload wniosek (see here), następujące API w Gmail API wygląda dobrze:

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

Niestety nie mogłem znaleźć żadnego dokumentu ani instrukcji na temat jego użycia.
Kiedy próbowałem umieścić załącznik jako surowy mediaContent, otrzymałem komunikat, że jedynym obsługiwanym typem mime jest message/rfc822, więc próbowałem wziąć MimeBodyPart, który tworzę w powyższej pętli for i używać go, ale wygląda na to, załącznik jest po prostu ignorowany.

Jak korzystać z załączników Gmail client API i "przesyłania"?

+0

Czytałaś to: https://developers.google.com/gmail/api/v1/reference/users/messages/wyślij – pratz9999

+0

@ pratz9999 tak, ale to odnosi się do żądania http, gdy pytam o API klienta, które powinno ułatwić korzystanie z API. – SagiLow

+0

https://github.com/steveholt55/JavaMail-API-Android może to będzie bardziej pomocne – pratz9999

Odpowiedz

0

Sekcja Media Upload/Download w kliencie Java interfejsu API Google wskazuje czynności, które należy wykonać.

Wskazano, że jako opcję przesyłania w tym scenariuszu konieczne będzie użycie resumable media upload. Aby go wdrożyć, musisz użyć MediaHttpUploader i MediaUttpProgressListener.

Strona, do której istnieje odwołanie, ma również przykład, który może działać w systemie GMail po przekazaniu InputStreamContent w trzecim parametrze send().

+0

Nie jestem pewien, czy potrzebuję 'MediaHttpUploader' lub jego detektora postępu, jak zobaczysz w pierwszym podanym przykładzie, pierwszy przykład wykorzystuje bibliotekę wygenerowaną przez usługę, aby zrobić to samo za kulisami, właśnie to robi API 'Send()', problem polega na tym, że gdy podaję typ mediów (np. 'image/jpeg'), pojawia się błąd:' Typ medium 'image/jpeg' nie jest obsługiwany. : [message/rfc822] ' – SagiLow

+0

Aktualizacja: Próbowałem użyć trzeciego argumentu dla załączników w formacie' [message/rfc822] ', ale nie są one dołączane, Używam również trzeciego argumentu dla całej wiadomości z załączniki, ale otrzymuję wiadomość o odrzuceniu wiadomości z informacją, że wiadomość nie została wysłana. – SagiLow

+0

Uważam też, że przesyłanie multimediów dotyczy innego przypadku użycia, tj. żądanie interfejsu API Gmaila, aby pobrać coś bezpośrednio z Internetu, – rds

1

Wiem, że to pytanie ma kilka miesięcy, ale po napotkaniu tego samego problemu udało mi się go rozwiązać.

Moja implementacja jest bardzo podobna do twojej, wszystko, co zmieniłem, to dwie ostatnie linie.

Więc zamiast używać:

Message message = createMessageWithEmail(mimeMessage); 

service.users().messages().send(from, message).execute(); 

Zastosowanie:

ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
mimeMessage.writeTo(bytes); 

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